ESRI JSON Polygon Ring Orientation?


10

J'ai du mal à trouver une documentation détaillée définissant les spécifications JSON d'ESRI. J'espère que quelqu'un pourra faire la lumière sur les deux questions suivantes.

  1. Semblable à la spécification GeoJSON, le premier tableau de la collection « chemins » est toujours un anneau extérieur, et tous les tableaux suivants de cette collection sont des anneaux intérieurs (trous)?

  2. Si ce qui précède est vrai, comment la spécification ESRI JSON gère-t-elle les polygones multiples?

Réponses:


13

Voici un lien vers le document d'Esri sur les objets de géométrie JSON . Depuis cette page:

L'API REST prend en charge 4 types de géométrie - points, polylignes, polygones et enveloppes.

Les sons comme les polygones multiples ne sont pas pris en charge. Voir ci-dessous. Vous pouvez créer plusieurs polygones en ajoutant des anneaux supplémentaires. Il n'y a rien d'explicite dans les anneaux intérieurs contre extérieurs. Je suis curieux, je vais donc approfondir ... modifierai ce message si je trouve autre chose.

Edit: j'ai approfondi un peu plus. Il semble que si vous ajoutez des anneaux qui tombent à l'intérieur d'un anneau existant, les anneaux intérieurs sont des trous. Si vous ajoutez un anneau qui n'est pas à l'intérieur d'un autre anneau, il est ajouté en tant que polygone supplémentaire qui est essentiellement un multi-polygone. Voici une page simple qui montre ceci:

<!DOCTYPE html> 
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Polygons!</title>
    <link rel="stylesheet" type="text/css" href="http://serverapi.arcgisonline.com/jsapi/arcgis/2.1/js/dojo/dijit/themes/claro/claro.css">
    <style>
      html, body { height: 100%; width: 100%; margin: 0; padding: 0; }
      #map{
        padding:0;
      }
    </style>
    <script type="text/javascript">var djConfig = {parseOnLoad: true};</script>
    <script type="text/javascript" src="http://serverapi.arcgisonline.com/jsapi/arcgis/?v=2.1"></script>
    <script type="text/javascript">
      dojo.require("dijit.layout.BorderContainer");
      dojo.require("dijit.layout.ContentPane");
      dojo.require("esri.map");
      var map;
      function init() {
        var initExtent = new esri.geometry.Extent({"xmin":-12959519,"ymin":3696971,"xmax":-9444639,"ymax":5453188,"spatialReference":{"wkid":102100}});
        map = new esri.Map("map",{extent:initExtent});
        var basemap = new esri.layers.ArcGISTiledMapServiceLayer("http://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer");
        map.addLayer(basemap);
        var resizeTimer;
        dojo.connect(map, 'onLoad', function(theMap) {
          dojo.connect(dijit.byId('map'), 'resize', function() {  //resize the map if the div is resized
            clearTimeout(resizeTimer);
            resizeTimer = setTimeout( function() {
              map.resize();
              map.reposition();
            }, 500);
          });
          var poly = new esri.geometry.Polygon({"rings":
            [
              [[-11214840,4858704],[-10520181,4853812],[-10510397,4149368],[-11219732,4144476],[-11214840,4858704]], // ring #1, poly with two holes
              [[-11097433,4770648],[-10916430,4770648],[-10916430,4609213],[-10984918,4560294],[-11097433,4614105],[-11097433,4770648]], // ring #2, a hole
              [[-10779455,4472238],[-10622912,4349939],[-10750103,4242315],[-10833267,4296127],[-10779455,4472238]],  // ring #3, another hole
              [[-11298004,4614105],[-11293112,4310803],[-11571954,4305911],[-11542602,4584753],[-11298004,4614105]] // ring #4, western polygon
            ],
            "spatialReference":{"wkid":102100}
          });
          var sym = new esri.symbol.SimpleFillSymbol({"color":[255,255,0,64],"outline":{"color":[255,0,0,255],"width":1.5,"type":"esriSLS","style":"esriSLSDashDot"},"type":"esriSFS","style":"esriSFSSolid"});
          var graphic = new esri.Graphic(poly, sym);
          map.graphics.add(graphic);
        });
      }
      dojo.addOnLoad(init);
    </script>
  </head>
  <body class="claro">
    <div dojotype="dijit.layout.BorderContainer" design="headline" gutters="false"
    style="width: 100%; height: 100%; margin: 0;">
      <div id="map" dojotype="dijit.layout.ContentPane" region="center" style="overflow:hidden;">
      </div>
    </div>
  </body>
</html>

Si vous chargez cette page, le premier anneau est le carré avec deux trous. Les deux trous sont les anneaux deux et trois. Le quatrième anneau du polygone le plus occidental. Cela pourrait ressembler à deux graphiques, mais ce n'est en fait qu'un seul.


Excellente réponse, merci. Maintenant, pour le travail acharné, puisqu'il n'y a pas de méthodes intégrées, je suppose que je vais devoir écrire une fonction qui teste l'orientation de chaque anneau.
user890

Heureux de vous aider. Pas besoin de réinventer la roue, esri fournit une fonction "isClockwise ()" dans l'espace de noms de la géométrie: help.arcgis.com/en/webapi/javascript/arcgis/help/…
Derek Swingley

Bonne réponse. Assurez-vous simplement que les anneaux ou trous intérieurs sont dans le sens antihoraire.
capie69

3

Le format esri json suit de près celui de la forme esri.

Les polygones esri sont constitués d'anneaux. Ils peuvent représenter à la fois des entités multipolygone et polygone de l'OGC.

Les polygones géométriquement simples n'auront aucune auto-intersection et auront des anneaux extérieurs dans le sens horaire et des anneaux intérieurs (trous) dans le sens antihoraire. Si vous lisez des services Esri, c'est ce que vous obtenez habituellement.

Les polygones non simples (ceux qui ont des anneaux orientés différemment ou ont des auto-intersections) doivent être interprétés en utilisant la règle de remplissage pair-impair régulière lors du dessin ou de la création d'un point dans le test de polygone .

Lors de la conversion du multipolygone OGC en polygone Esri, assurez-vous simplement que les anneaux extérieurs sont orientés dans le sens horaire et les trous dans le sens antihoraire.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.