具有多个孔的 GeoJSON MultiPolygon

GeoJSON MultiPolygon with multiple holes

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

当我使用服务 http://geojson.io/ 验证此对象时,它 returns 出现错误 each element in a position must be a number 并且它不会呈现,但是如果我删除 "holes"嵌套,删除其中一个即可。

我正在寻找一种方法来描述 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
          ]
        ]
      ]
    ]
  ]
}

这是它的工作原理:

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

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

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

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

要表示具有多个 "outer" 环的 OSM "multipolygon",您必须在 geoJSON "MultiPolygon"类型,即

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

如果你只有几个外环(可能重叠以创建一个表面的联合,但不推荐这样做)它需要是一个多边形,在这里你不会得到 "holes":

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

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

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