2017-04-26 91 views
2

下面我有我期望的方法來創建一個帶有一個多邊形的GeoJSON MultiPolygon object,其中有兩個「孔」。帶有多個孔的GeoJSON MultiPolygon

當我使用服務http://geojson.io/驗證此對象時,它返回錯誤each element in a position must be a number並且它不呈現,但是,如果我刪除「洞」巢,刪除其中一個然後它的工作。

我正在尋找一種方法來描述多邊形可以有多個孔的MultiPolygon

我不想在代碼中創建帶孔的多邊形。

我正在尋找一種方法來使用GeoJSON規範來表示具有多個孔的MultiPolygons。

enter image description here

{ 
    "type": "MultiPolygon", 
    "coordinates": [ 
    [ 
     [ 
     [ 
      -73.98114904754641, 
      40.7470284264813 
     ], 
     [ 
      -73.98314135177611, 
      40.73416844413217 
     ], 
     [ 
      -74.00538969848634, 
      40.734314779027144 
     ], 
     [ 
      -74.00479214294432, 
      40.75027851544338 
     ], 
     [ 
      -73.98114904754641, 
      40.7470284264813 
     ] 
     ], 
     [ 
     [ 
      [ 
      -73.99818643920906, 
      40.74550031602355 
      ], 
      [ 
      -74.00298643920905, 
      40.74550031602355 
      ], 
      [ 
      -74.00058643920897, 
      40.74810024102966 
      ], 
      [ 
      -73.99818643920906, 
      40.74550031602355 
      ] 
     ], 
     [ 
      [ 
      -73.98917421691903, 
      40.73646098717515 
      ], 
      [ 
      -73.99397421691901, 
      40.73646098717515 
      ], 
      [ 
      -73.99157421691893, 
      40.739061265535696 
      ], 
      [ 
      -73.98917421691903, 
      40.73646098717515 
      ] 
     ] 
     ] 
    ] 
    ] 
} 
+0

你見過[Google的例子](https://developers.google.com/maps/documentation/javascript/examples/layer-data-polygon)(有2個洞的GeoJson多邊形)嗎? – geocodezip

+1

這個例子不包含任何geojson!這只是谷歌代碼。 – ThomasReggi

+0

@geocodezip我想創建有效的GeoJSON - JSON,而不是谷歌代碼。 – ThomasReggi

回答

6

這是它如何工作的:

{ 
    "type": "MultiPolygon", 
    "coordinates": [ 
    [ 
     {polygon}, 
     {hole}, 
     {hole}, 
     {hole} 
    ] 
    ] 
} 

不喜歡這樣的:

{ 
    "type": "MultiPolygon", 
    "coordinates": [ 
    [ 
     {polygon}, 
     [ 
     {hole}, 
     {hole}, 
     {hole} 
     ] 
    ] 
    ] 
} 

下面是一個例子!

{ 
    "type": "MultiPolygon", 
    "coordinates": [ 
    [ 
     [ 
     [ 
      -47.900390625, 
      -14.944784875088372 
     ], 
     [ 
      -51.591796875, 
      -19.91138351415555 
     ], 
     [ 
      -41.11083984375, 
      -21.309846141087192 
     ], 
     [ 
      -43.39599609375, 
      -15.390135715305204 
     ], 
     [ 
      -47.900390625, 
      -14.944784875088372 
     ] 
     ], 
     [ 
     [ 
      -46.6259765625, 
      -17.14079039331664 
     ], 
     [ 
      -47.548828125, 
      -16.804541076383455 
     ], 
     [ 
      -46.23046874999999, 
      -16.699340234594537 
     ], 
     [ 
      -45.3515625, 
      -19.31114335506464 
     ], 
     [ 
      -46.6259765625, 
      -17.14079039331664 
     ] 
     ], 
     [ 
     [ 
      -44.40673828125, 
      -18.375379094031825 
     ], 
     [ 
      -44.4287109375, 
      -20.097206227083888 
     ], 
     [ 
      -42.9345703125, 
      -18.979025953255267 
     ], 
     [ 
      -43.52783203125, 
      -17.602139123350838 
     ], 
     [ 
      -44.40673828125, 
      -18.375379094031825 
     ] 
     ] 
    ] 
    ] 
} 
1

對於你的榜樣其實它不是一個真正的的MultiPolygon(在GeoJSON的意義),但一個簡單的多邊形(具有單個外環和孔多內圈)。 注意與OSM中的Multipolygons的區別(它表示它們是一個包含方式的關係,並且它的第一個和最後一個節點應該合併到同一個「節點」元素中(geoJSON中不存在的東西,它們僅由事實統一這兩個節點具有相同的座標,但實際上會由GeoJSON的「Polygon」和「MultiPolygon」類型的附加段自動關閉)

請注意,當您在OSM編輯器(如JOSM)中導入geoJSON ),即使它們具有相同的座標,它們也將被導入第一個和最後一個節點的單獨節點 - 您需要使用JOSM驗證程序來檢測疊加節點,並在JOSM中導入之後但在提交到OSM之前將它們合併。

但是在腳本或geoJSON的一般用途中,「類型」:「多邊形」或「類型」:「多邊形」的成員中的所有環(座標對數組)不需要包含最後一個節點的相同座標作爲第一個節點,因爲它是隱式的(但仍建議爲了兼容性添加此複製節點)。對於「Polygon」和「MultiPolygon」(因爲它們表示曲面)而言,這種環的閉合隱含,但對於「Polyline」和「MultiPolyline」(因爲它們表示曲線)而言,您仍然需要包含兩次相同的第一個座標最後一個節點獲得閉合曲線。

要表示具有多個「外」環的OSM「多面」,您必須在geoJSON「MultiPolygon」類型的主座標數組中包含幾個「[{outer},{inner *}]」,即

{"type":"MultiPolygon", "coordinates":[ 
    [ 
    [[x0,y0], [x1,y1], ... [x0,y0]], /*outer1*/ 
    [[x0,y0], [x1,y1], ... [x0,y0]], /*inner1, optional*/ 
    [[x0,y0], [x1,y1], ... [x0,y0]], /*inner2, optional*/ 
    ],[ 
    [[x0,y0], [x1,y1], ... [x0,y0]], /*outer2*/ 
    ],...,[ 
    [[x0,y0], [x1,y1], ... [x0,y0]], /*outer3*/ 
    ],[ 
    [[x0,y0], [x1,y1], ... [x0,y0]], /*outer4*/ 
    ] 
} 

因此,對於你的榜樣,該解決方案是:

{"type":"Polygon", "coordinates":[ 
    [[x0,y0], [x1,y1], [x2,y2], [x3,y3], [x0,y0]], /*outer1*/ 
    [[x4,y4], [x5,y5], [x6,y6], [x4,y4]],   /*inner1*/ 
    [[x7,y7], [x8,y8], [x9,y9], [x7,y7]]   /*inner2*/ 
]} 

如果你只有幾個外圈(可能重疊創建曲面的結合,但不推薦這樣做),那就需要是的MultiPolygon,在這裏你會得到沒有「漏洞」:

{"type":"MultiPolygon", "coordinates":[ 
    [[[x0,y0], [x1,y1], [x2,y2], [x3,y3], [x0,y0]]], /*outer1*/ 
    [[[x4,y4], [x5,y5], [x6,y6], [x4,y4]]],   /*outer2*/ 
    [[[x7,y7], [x8,y8], [x9,y9], [x7,y7]]]   /*outer3*/ 
]} 

注有中[方括號]少了一個級別,因爲我們可以使用「多邊形」在這裏,而不是一個組合區的,將只包含你的例子中有一個成員。