web-dev-qa-db-fra.com

GeoJSON MultiPolygon avec plusieurs trous

Ci-dessous, j'ai ce que j'attends est un moyen de créer un GeoJSON MultiPolygon objet avec un polygone qui a deux "trous".

Lorsque j'utilise le service http://geojson.io/ pour valider cet objet, il renvoie avec une erreur each element in a position must be a number et il ne rend pas, cependant si je supprime le nid "trous", en supprimant l'un d'eux alors ça marche.

Je cherche un moyen de décrire un MultiPolygon où les polygones peuvent avoir plusieurs trous.

Je ne cherche pas un moyen dans le code pour créer un polygone avec des trous.

Je cherche un moyen d'utiliser la spécification GeoJSON pour représenter des MultiPolygons avec plusieurs trous.

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
          ]
        ]
      ]
    ]
  ]
}
13
ThomasReggi

Voilà comment cela fonctionne:

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

Pas comme ça:

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

Voici un exemple!

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

Pour votre exemple, en fait, ce n'est pas vraiment un MultiPolygon (au sens de geoJSON) mais un simple Polygon (avec un seul anneau extérieur et plusieurs anneaux intérieurs pour les trous). Notez la différence avec les multipolygones dans OSM (qui les représente comme une relation contenant des chemins, et dont le premier et le dernier nœud doivent être fusionnés avec le même élément "nœud" (quelque chose qui n'existe pas dans geoJSON où ils ne sont unifiés que par le fait que les deux nœuds ont les mêmes coordonnées, mais seront en réalité automatiquement fermés par un segment supplémentaire pour les types "Polygon" et "MultiPolygon" de GeoJSON)

Notez que lorsque vous importez un geoJSON dans les éditeurs OSM (tels que JOSM), ils seront importés avec des nœuds séparés pour le premier et le dernier nœud, même s'ils ont les mêmes coordonnées - vous devez utiliser le validateur JOSM pour détecter les nœuds superposés et fusionner après l'importation dans JOSM mais avant la soumission à OSM.

Mais dans les scripts ou l'utilisation générale de geoJSON, tous les anneaux (tableaux de paires de coordonnées) dans un "type": "Polygone" ou les membres d'un "type": "Polygone" ne sont pas tenus d'inclure les mêmes coordonnées pour le dernier nœud que le premier nœud, car il est implicite (mais il est toujours recommandé d'ajouter ce nœud en double pour des raisons de compatibilité). Une telle fermeture d'anneaux est implicite pour "Polygon" et "MultiPolygon" (car ils représentent des surfaces), mais pas pour "Polyline" et "MultiPolyline" (car ils représentent des courbes) où vous devez toujours inclure deux fois les mêmes coordonnées pour le premier et dernier nœud pour obtenir des courbes fermées.

Pour représenter un "multipolygone" OSM avec plusieurs anneaux "externes", vous devez inclure plusieurs "[{external}, {inner *}]" dans le tableau principal de coordonnées pour le type "MultiPolygon" geoJSON, c'est-à-dire.

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

Donc pour votre exemple, la solution est:

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

Si vous n'aviez que plusieurs anneaux extérieurs (se chevauchant éventuellement pour créer une union de surfaces, mais ce n'est pas recommandé), il faudrait que ce soit un MultiPolygon, et ici vous n'obtiendrez aucun "trou":

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

Notez qu'il y a un niveau de moins de [accolades carrées] parce que nous pouvons utiliser "Polygone" ici au lieu d'un Multipolygon qui ne contiendrait qu'un seul membre dans votre exemple.

8
verdy_p

Pour autant que je sache, vous pouvez utiliser la fonction SUBSTR (JSON_EXTRACT (ST_ASGEOJSON (WKT) si vous convertissez de wkt en géographie. De cette façon, vous pouvez représenter dans la carte. u utilisez ST_ASGEOJSON (). Et consultez ce lien: https://dev.socrata.com/docs/datatypes/multipolygon.html# ,

0
Topgyal Gurung