2016-03-29 16 views
5

Sto utilizzando un'implementazione Javascript dell'algoritmo di Fortune per calcolare le celle di voronoi (https://github.com/gorhill/Javascript-Voronoi). I miei siti da calcolare sono punti su una mappa (quindi (lat,lng)). Per prima cosa ho realizzato la proiezione (lat,lng) -> (x,y), ho quindi calcolato le celle di voronoi e ho fatto la proiezione dei mezzi bordi nell'altro senso.
Funziona bene, visualizzo il risultato usando il volantino ma ho bisogno di fare ancora una cosa.Come unire poligoni adiacenti

Ogni sito inizialmente computo dipende da un ID, ho riclassificare le celle Voronoi per ID e io alla fine, per ogni ID con una struttura dati standard simile a questo:

{ 
    "type": "FeatureCollection", 
    "features": [ 
    { 
     "type": "Feature", 
     "geometry": { 
     "type": "Polygon", 
     "coordinates": [[ 
      [9.994812, 53.549487], 
      [10.046997, 53.598209], 
      [10.117721, 53.531737], 
      [9.994812, 53.549487] 
     ]] 
     } 
    }, { 
     "type": "Feature", 
     "geometry": { 
     "type": "Polygon", 
     "coordinates": [[ 
      [10.000991, 53.50418], 
      [10.03807, 53.562539], 
      [9.926834, 53.551731], 
      [10.000991, 53.50418] 
     ]] 
     } 
    } 
    ] 
}; 

Un insieme di poligoni (fatto formare il mezzo bordo delle cellule di voronoi) per un dato ID.

ho bisogno di unire i poligoni per ID, ho intenzione di usare turf.merge(), ma ho errori di topologia

turf.min.js:13 Uncaught TopologyError: side location conflict 

Sulla base di questo post (http://lists.refractions.net/pipermail/jts-devel/2009-March/002939.html), ho cercato di arrotondare la coppia (lat,lng) da 10^-14 a 10^-7 ma non ha funzionato veramente. Prima di cercare i nodi e provare a rimuoverli, ho stampato un campione di dati e sono sicuro di chiedermi se ho usato i buoni dati dall'algoritmo di Fortune. Quando sono visualizzati tutti i poligoni per tutti gli ID, ho il diagramma di destra, ma quando visualizzare tutti i poligoni per un ID o alcuni poligoni per un ID alla fine con diagrammi incomplete:

part of the full diagram

Parte il diagramma completo

enter image description here

parte del diagramma per un ID

enter image description here

Due "poligoni" per un dato ID

Qualcuno ha un'idea di come unire poligono che condivide almeno un vertice comune? E perché c'è un errore di topologia?

Edit: I poligoni non sono "incompleti" (stavo usando polilinea)

enter image description here

Ho anche provato su un campione di più facile:

enter image description here

e ancora ricevuto l'errore:

Uncaught TopologyError: side location conflict [ (44.8220601, -0.5869532) ] 

Quindi non è (o almeno non solo) a causa di nodi

+0

Ho usato questa libreria ma non ho avuto di unire tutte le cellule purtroppo così non si può aiutare ... Si dovrebbe provare la pubblicazione questa domanda come un bug sul repository github se riesci a riprodurlo in un caso molto semplice. – deKajoo

+0

grazie, ho creato un bug sul repository github. Incontro lo stesso problema con turf.union() – kwn

+0

Hai provato d3.js? https://github.com/mbostock/d3/wiki/Geometry – cbertelegni

risposta

2

Sembra che il problema si sia verificato prima che i dati arrivino a Turf. L'esecuzione di GeoJSON dal tuo GitHub issue tramite un GeoJSON validator rivela due errori. Il primo è che includi solo un oggetto geometry per ogni funzione e GeoJSON richiede che tutte le funzioni abbiano anche un oggetto properties, anche se è vuoto.In secondo luogo, e ancora più importante, un poligono GeoJSON valido deve essere un ciclo chiuso, con coordinate identiche per il primo e l'ultimo punto. Questo secondo problema sembra essere quello che sta causando a Turf il suo errore. I poligoni si fonderanno con successo una volta copiato il primo set di coordinate alla fine per chiudere l'anello.

Dopo aver visualizzato i dati su una mappa, diventa anche chiaro che la latitudine e la longitudine sono invertite. Le coordinate dovrebbero essere lon,lat in GeoJSON e, poiché le tue sono in lat,lon, i poligoni compaiono nel mezzo dell'Oceano Indiano. Una volta corretto, vengono visualizzati nel posto giusto.

Ecco un violino mostrando la loro fusione di successo:

http://fiddle.jshell.net/nathansnider/p7kfxvk7/

+0

grazie per la risposta, non sapevo del ciclo chiuso . A proposito della latitudine e della longitudine invertite, è perché i dati provengono da un'istituzione francese e lo standard è (lat, lon) – kwn

+1

L'inversione delle coordinate è un problema piuttosto comune, dato che 'lat, lon' è lo standard nella maggior parte dei posti nel mondo (e in Leaflet!), ma poiché ciò va contro la convenzione matematica di ordinare le coordinate come 'x, y', il software GIS spesso usa' lon, lat'. – nathansnider