具有多个孔的GeoJSON MultiPolygon

时间:2017-04-26 21:54:16

标签: polygon geojson

下面我有我期望的方法来创建一个GeoJSON MultiPolygon object,其中包含一个多边形,其中有两个"孔"。

当我使用服务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
          ]
        ]
      ]
    ]
  ]
}

3 个答案:

答案 0 :(得分:20)

这是它的工作原理:

{
  "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 :(得分:7)

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

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

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

要表示具有多个“外部”环的OSM“multipolygon”,您必须在geoJSON“MultiPolygon”类型的主坐标数组中包含多个“[{outer},{inner *}]”,即< / p>

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

请注意,[square braces]的级别较少,因为我们可以在这里使用“Polygon”而不是在您的示例中只包含一个成员的Multipolygon。

答案 2 :(得分:0)

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