2016-03-29 134 views
5

我正在使用Fortune算法的Javascript實現來計算voronoi單元(https://github.com/gorhill/Javascript-Voronoi)。我的網站計算是地圖上的點(所以(lat,lng))。我首先做了投影(lat,lng) -> (x,y),然後我計算了voronoi單元,並以另一種方式做出了半邊的投影。
它工作正常,我使用傳單顯示結果,但我需要做更多的事情。如何合併相鄰的多邊形

每個站點我最初計算取決於一個ID,我重新分類由ID Voronoi單元和我最終,對於每個ID與標準數據結構中查找這樣的:

{ 
    "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] 
     ]] 
     } 
    } 
    ] 
}; 

一組多邊形(對於給定的ID,由voronoi單元的半邊製成)。

我需要合併的ID的多邊形,我打算用turf.merge(),但我有拓撲錯誤

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

基於這個職位(http://lists.refractions.net/pipermail/jts-devel/2009-March/002939.html),我試圖從10輪的(lat,lng)夫婦^ -14到10^-7但它並沒有真正奏效。 在尋找扭曲並嘗試去除它們之前,我打印了一些數據樣本,並且我知道自己是否使用了Fortune算法的良好數據。當我顯示所有多邊形的所有的ID,我有權利圖,但是當我顯示一個ID所有多邊形或一些多邊形爲一個ID我結束了不完整的圖:

part of the full diagram

的部分全圖

圖的

enter image description here

部分爲一個ID

enter image description here

給定ID的兩個「多邊形」

有沒有人有一個想法如何合併共享至少一個共同頂點的多邊形?爲什麼會出現拓撲錯誤?

編輯:多邊形不是 「不完整」(我是用折線)

enter image description here

我也試過在一個更簡單的例子:

enter image description here

,還是把錯誤:

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

所以它不是(或者至少不僅僅是)由於糾結

+0

我用這個庫,但我並沒有合併任何單元格不幸所以幫不了你...... 你應該嘗試張貼這個問題作爲github repo上的一個錯誤,如果你設法在一個非常簡單的情況下重現它。 – deKajoo

+0

謝謝,我在github回購上創建了一個bug。我遇到與turf.union相同的問題() – kwn

+0

你試過惠普d3.js嗎? https://github.com/mbostock/d3/wiki/Geometry – cbertelegni

回答

2

您的問題似乎發生在數據到達草坪之前。從GitHub issue運行GeoJSON到GeoJSON validator會顯示兩個錯誤。首先,每個特徵只包含一個geometry對象,而GeoJSON要求所有特徵也都有一個properties對象,即使它是空的。其次,更重要的是,一個有效的GeoJSON多邊形必須是一個閉合的循環,第一個和最後一個點的座標相同。第二個問題似乎是Turf拋出錯誤的原因。一旦第一組座標被複制到結尾以關閉環,多邊形將成功合併。

在地圖上顯示數據後,您的經度和緯度也會變得相反。 GeoJSON中的座標應爲lon,lat,因爲您的座標位於lat,lon中,多邊形顯示在印度洋中部。一旦糾正,他們就會出現在正確的地方。

這裏是展示自己的成功合併小提琴:

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

+0

感謝您的答案,我不知道閉環。關於經度和緯度的反轉,這是因爲數據來自法國機構,標準是(經度,緯度) – kwn

+1

座標反轉是一個相當普遍的問題,因爲'lat,lon'是大多數地方的標準世界(和傳單!),但是由於這與GIS軟件經常使用'lon,lat'的座標數學習慣相反。 – nathansnider