ESRI JSON Polygon Ring Orientation?

10

Me cuesta encontrar documentación detallada que defina las especificaciones JSON de ESRI. Espero que alguien pueda arrojar algo de luz sobre las siguientes dos preguntas.

  1. Similar a la especificación GeoJSON, la primera matriz en la colección ' caminos ' siempre es un anillo exterior, y todas las matrices posteriores en esta colección son anillos interiores (agujeros)?

  2. Lo anterior es cierto, ¿cómo se ocupa la especificación ESRI JSON con los polígonos múltiples?

usuario890
fuente

Respuestas:

13

Aquí hay un enlace al documento de Esri sobre objetos de geometría JSON . De esa página:

La API REST admite 4 tipos de geometría: puntos, polilíneas, polígonos y sobres.

Suena como multi-polígonos no son compatibles. Vea abajo. Puede crear polígonos múltiples agregando anillos adicionales. No hay nada explícito en los anillos interiores v. Exteriores. Tengo curiosidad, así que voy a investigar esto más a fondo ... editaré esta publicación si encuentro algo más.

Editar: Investigué esto un poco más. Parece que si agrega anillos que caen dentro de un anillo existente, los anillos interiores son agujeros. Si agrega un anillo que no está dentro de otro anillo, se agrega como un polígono adicional que es básicamente un polígono múltiple. Aquí hay una página simple que muestra esto:

<!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 carga esa página, el primer anillo es el cuadrado con dos agujeros. Los dos agujeros son anillos dos y tres. El cuarto anillo en el polígono más occidental. Esto puede parecer dos gráficos, pero en realidad es solo uno.

Derek Swingley
fuente
Excelente respuesta, gracias. Ahora, por el arduo trabajo, dado que no hay métodos integrados, supongo que tendré que escribir una función que pruebe la orientación de cada anillo.
user890
Encantado de ayudar. Sin embargo, no es necesario reinventar la rueda, esri proporciona una función "isClockwise ()" en el espacio de nombres de geometría: help.arcgis.com/en/webapi/javascript/arcgis/help/…
Derek Swingley
Buena respuesta. Solo asegúrese de que los anillos o agujeros interiores estén en sentido antihorario.
capie69
3

El formato esri json sigue de cerca el de la forma esri.

Los polígonos esri consisten en anillos. Pueden representar entidades Multipolígono y Polígono de OGC.

Los polígonos geométricamente simples no tendrán auto-intersecciones y tendrán anillos exteriores en sentido horario y anillos interiores (agujeros) en sentido antihorario. Si está leyendo de los servicios de Esri, eso es lo que generalmente recibe.

Los polígonos no simples (aquellos que tienen anillos orientados de manera diferente o tienen auto intersecciones) deben interpretarse utilizando la regla de relleno regular par-impar al dibujar o hacer un punto en la prueba de polígono .

Al convertir de OGC Multipolygon a Esri polygon, solo asegúrese de que los anillos exteriores estén orientados en sentido horario y que los agujeros estén en sentido antihorario.

0kcats
fuente