具有多个孔的 GeoJSON MultiPolygon

Posted

技术标签:

【中文标题】具有多个孔的 GeoJSON MultiPolygon【英文标题】:GeoJSON MultiPolygon with multiple holes 【发布时间】:2017-09-24 12:06:25 【问题描述】:

下面我有我所期望的是一种创建GeoJSON MultiPolygon object 的方法,其中有一个多边形,其中有两个“孔”。

当我使用服务http://geojson.io/ 验证此对象时,它返回错误each element in a position must be a number 并且它不呈现,但是如果我删除“洞”嵌套,删除其中一个然后它可以工作。

我正在寻找一种方法来描述一个MultiPolygon,其中的多边形可以有多个孔。

我不是在寻找一种在代码中创建带孔多边形的方法。

我正在寻找一种方法来使用 GeoJSON 规范来表示具有多个孔的 MultiPolygons。


  "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
          ]
        ]
      ]
    ]
  ]

【问题讨论】:

你见过Google's example(一个有2个洞的GeoJson多边形)吗? 这个例子不包含任何geojson!这只是谷歌代码。 @geocodezip 我正在尝试创建有效的 GeoJSON - JSON,而不是谷歌代码。 好吧,我的猜测是您正在使用 MultiPolygon 创建多个多边形,而不是孔,但发布的代码无效(我无法按原样加载)。 这是一个很好的问题,因为这里对 geoJSON 中的“MultiPolygon”与“Polygon”存在混淆。请参阅下面的答案。 【参考方案1】:

这就是它的工作原理:


  "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
        ]
      ]
    ]
  ]

【讨论】:

需要注意的是,如果hole 的一部分位于第一个多边形之外,则该部分会显示出来,这可能是也可能不是预期的结果。有没有办法不显示它是否不包含在第一个多边形中?使用上面的示例,您可以将 -20.097206227083888 更改为 -24.097206227083888 以了解我的意思。【参考方案2】:

对于您的示例,实际上它并不是真正的 MultiPolygon(在 geoJSON 的意义上),而是一个简单的 Polygon(具有单个外环和多个用于孔的内环)。 请注意与 OSM 中的 Multipolygons 的区别(将它们表示为包含方式的关系,并且其第一个和最后一个节点应合并到相同的“节点”元素(geoJSON 中不存在的东西,它们仅通过以下事实来统一)这两个节点具有相同的坐标,但实际上会被“Polygon”和“MultiPolygon”类型的 GeoJSON 的附加段自动关闭)

请注意,当您在 OSM 编辑器(例如 JOSM)中导入 geoJSON 时,即使它们具有相同的坐标,它们也会以不同的节点作为第一个和最后一个节点导入 - 您需要使用 JOSM 验证器来检测叠加节点并在 JOSM 中导入之后但在提交到 OSM 之前合并它们。

但在脚本或 geoJSON 的一般使用中,“type”:“Polygon” 中的所有环(坐标对数组)或“type”:“Polygon” 的成员不需要包含相同的坐标last 节点作为第一个节点,因为它是隐式的(但为了兼容性还是建议添加这个重复节点)。这种环的闭合对于“Polygon”和“MultiPolygon”(因为它们代表曲面)是隐含的,但对于“Polyline”和“MultiPolyline”(因为它们代表曲线)来说是隐含的,您仍然需要为第一个包含两次相同的坐标最后一个节点获得闭合曲线。

要表示具有多个“外”环的 OSM“多多边形”,您必须在 geoJSON“多多边形”类型的主坐标数组中包含几个“[ 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*/
]

请注意,[方括号] 的级别少了一层,因为我们可以在此处使用“多边形”,而不是在您的示例中只包含一个成员的多多边形。

【讨论】:

【参考方案3】:

据我所知,如果从 wkt 转换为地理,您可以使用 SUBSTR(JSON_EXTRACT(ST_ASGEOJSON(WKT) 函数。这样您可以在地图中表示。我在 bigquery 中发现的似乎是带有孔开关位置的多面体使用 ST_ASGEOJSON() 时的孔坐标。 并查看此链接: https://dev.socrata.com/docs/datatypes/multipolygon.html#,

【讨论】:

以上是关于具有多个孔的 GeoJSON MultiPolygon的主要内容,如果未能解决你的问题,请参考以下文章

来自具有 Geojson 系列的数据框的地理数据框

如何从 geoJSON 文件中分离具有 NULL 值的记录?

将 JSON 转换为 QGIS GeoJSON:同时具有多种功能和不同类型

创建内部带有透明孔的小部件

cesium添加多个geojson文件并分别控制显示和隐藏

MongoDB:如何确定 GeoJson LineString 和具有半径的点的交集