Orientamento dell'anello poligonale ESRI JSON?


10

Non riesco a trovare tutta la documentazione dettagliata che definisce le specifiche JSON dell'ESRI. Spero che qualcuno possa far luce sulle seguenti due domande.

  1. Simile alle specifiche GeoJSON, il primo array nella raccolta " percorsi " è sempre un anello esterno e tutti gli array successivi in ​​questa raccolta sono anelli interni (fori)?

  2. Quanto sopra è vero, in che modo le specifiche ESRI JSON gestiscono i multi-poligoni?

Risposte:


13

Ecco un link al documento di Esri sugli oggetti geometrici JSON . Da quella pagina:

L'API REST supporta 4 tipi di geometria: punti, polilinee, poligoni e buste.

Sembra che i multi-poligoni non siano supportati. Vedi sotto. Puoi creare multi-poligoni aggiungendo altri anelli. Non c'è nulla di esplicito negli anelli interni contro esterni. Sono curioso, quindi esaminerò ulteriormente questo ... modificherò questo post se trovo qualcos'altro.

Modifica: ho esaminato un po 'di più questo. Sembra che se aggiungi anelli che rientrano in un anello esistente, gli anelli interni sono dei buchi. Se aggiungi un anello che non si trova all'interno di un altro anello, viene aggiunto come poligono aggiuntivo che è fondamentalmente un poligono multiplo. Ecco una semplice pagina che mostra questo:

<!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>

Se carichi quella pagina, il primo anello è il quadrato con due fori. I due fori sono anelli due e tre. Il quarto anello nel poligono più occidentale. Questo potrebbe sembrare due grafici ma in realtà è solo uno.


Ottima risposta, grazie. Ora per il duro lavoro, dal momento che non ci sono metodi integrati, suppongo che dovrò scrivere una funzione che verifica l'orientamento di ciascun anello.
user890,

Felice di aiutare. Tuttavia, non è necessario reinventare la ruota, esri fornisce una funzione "isClockwise ()" nello spazio dei nomi della geometria: help.arcgis.com/en/webapi/javascript/arcgis/help/…
Derek Swingley

Buona risposta. Assicurati solo che gli anelli interni o i fori siano in senso antiorario.
capie69,

3

Il formato esri json segue da vicino quello della forma esri.

I poligoni esri sono costituiti da anelli. Possono rappresentare entità sia Multipolygon che Polygon di OGC.

I poligoni geometricamente semplici non avranno autointersezioni e avranno anelli esterni in senso orario e anelli interni (fori) in senso antiorario. Se stai leggendo dai servizi Esri è quello che ottieni di solito.

I poligoni non semplici (quelli che hanno anelli orientati diversamente o hanno autointersezioni) dovrebbero essere interpretati usando la normale regola di riempimento pari-dispari quando si disegna o si fa un punto nel test poligonale .

Quando si converte da multiplogon OGC in poligono Esri, assicurarsi solo che gli anelli esterni siano orientati in senso orario e che i fori siano in senso antiorario.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.