10 votos

¿Orientación del anillo poligonal JSON de ESRI?

Me está costando 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. Al igual que en la especificación GeoJSON, la primera matriz de la matriz ' caminos ¿la colección 'es siempre un anillo exterior, y todas las matrices posteriores de esta colección son anillos interiores (agujeros)?

  2. Si lo anterior es cierto, ¿cómo trata la especificación JSON de ESRI los polígonos múltiples?

13voto

Daniel Broekman Puntos 1951

Aquí hay un enlace al documento de Esri sobre Objetos geométricos JSON . De esa página:

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

Parece que los multipolígonos no son compatibles. Véase más abajo. Se pueden crear multipolígonos añadiendo anillos adicionales. No hay nada explícito sobre los anillos interiores frente a los exteriores. Tengo curiosidad, así que voy a investigar más sobre esto... editaré este post si encuentro algo más.

Edición: He investigado un poco más sobre esto. Parece que si se añaden anillos que caen dentro de un anillo existente, los anillos interiores son agujeros. Si añades un anillo que no está dentro de otro anillo, se añade como un polígono adicional que es básicamente un multi-polígono. 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 cargas esa página, el primer anillo es el cuadrado con dos agujeros. Los dos agujeros son los anillos dos y tres. El cuarto anillo en el polígono más occidental. Esto puede parecer dos gráficos, pero en realidad es sólo uno.

0 votos

Excelente respuesta, gracias. Ahora el trabajo duro, ya que no hay métodos incorporados, supongo que tendré que escribir una función que compruebe la orientación de cada anillo.

0 votos

Me alegro de ayudar. Sin embargo, no es necesario reinventar la rueda, esri proporciona una función "isClockwise()" en el espacio de nombres de la geometría: help.arcgis.com/es/webapi/javascript/arcgis/help/

0 votos

Buena respuesta. Sólo hay que asegurarse de que los anillos o agujeros interiores están en sentido contrario a las agujas del reloj.

3voto

user22814 Puntos 196

El formato esri json sigue de cerca el de esri shape.

Los polígonos de esri están formados por anillos. Pueden representar tanto entidades multipoligonales como poligonales de OGC.

Los polígonos geométricamente simples no tendrán auto-intersecciones y tendrán anillos exteriores en el sentido de las agujas del reloj y anillos interiores (agujeros) en sentido contrario. Si estás leyendo desde los servicios de Esri eso es lo que obtienes normalmente.

Los polígonos no simples (los que tienen anillos orientados de forma diferente o tienen auto-intersecciones) deben ser interpretados utilizando la regla even-impar regla de relleno al dibujar o hacer un punto en el polígono prueba.

Al convertir de OGC Multipolygon a Esri polygon, simplemente asegúrese de que los anillos exteriores están orientados en el sentido de las agujas del reloj y los agujeros en sentido contrario.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X