带多个孔的 GeoJSON 多多边形

问题描述 投票:0回答:3

下面我有我所期望的一种创建 GeoJSON

MultiPolygon
对象 的方法,其中一个多边形有两个“洞”。

当我使用服务 http://geojson.io/ 验证此对象时,它会返回错误

each element in a position must be a number
并且不会渲染,但是,如果我删除“洞”嵌套,则删除其中之一它有效。

我正在寻找一种方法来描述

MultiPolygon
,其中多边形可以有多个孔。

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

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

{
  "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
          ]
        ]
      ]
    ]
  ]
}
polygon geojson
3个回答
50
投票

这就是它的工作原理:

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

19
投票

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

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

但是在脚本或 geoJSON 的一般使用中,“type”:“Polygon”中的所有环(坐标对数组)或“type”:“Polygon”的成员不需要包含最后一个节点的相同坐标作为第一个节点,因为它是隐式的(但仍然建议添加此重复节点以实现兼容性)。这种环的闭合对于 OSM“Polygon”和“MultiPolygon”(因为它们代表曲面)是隐含的,但对于 OSM“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 (quadrilateral)*/
  [[x4,y4], [x5,y5], [x6,y6], [x4,y4]],          /*inner1 (triangular hole)*/
  [[x7,y7], [x8,y8], [x9,y9], [x7,y7]]           /*inner2 (triangular hole)*/
]}

如果您只有几个外环(可能重叠以创建曲面的联合,但不建议这样做),则它需要是一个 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*/
]}

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


-2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.