Orientação do anel de polígono ESRI JSON?

9

Estou com dificuldade para encontrar qualquer documentação detalhada que defina as especificações JSON da ESRI. Espero que alguém possa esclarecer as duas perguntas a seguir.

  1. Semelhante à especificação GeoJSON, a primeira matriz da coleção ' caminhos ' é sempre um anel externo, e todas as matrizes subsequentes nesta coleção são anéis interiores (orifícios)?

  2. Acima é verdade, como a especificação ESRI JSON lida com vários polígonos?

user890
fonte

Respostas:

13

Aqui está um link para o documento da Esri sobre objetos de geometria JSON . A partir dessa página:

A API REST suporta 4 tipos de geometria - pontos, polilinhas, polígonos e envelopes.

Sons como polígonos múltiplos não são suportados. Ver abaixo. Você pode criar vários polígonos adicionando anéis adicionais. Não há nada explícito sobre anéis internos e externos. Estou curioso, então vou analisar mais detalhadamente ... editarei este post se encontrar mais alguma coisa.

Edit: Eu olhei para isso um pouco mais. Parece que se você adicionar anéis que caem dentro de um anel existente, os anéis internos são orifícios. Se você adicionar um anel que não esteja dentro de outro anel, ele será adicionado como um polígono adicional que é basicamente um multi-polígono. Aqui está uma página simples que mostra isso:

<!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 você carregar essa página, o primeiro anel é o quadrado com dois orifícios. Os dois orifícios são anéis dois e três. O quarto anel no polígono mais ocidental. Pode parecer dois gráficos, mas na verdade é apenas um.

Derek Swingley
fonte
Excelente resposta, obrigado. Agora, para o trabalho árduo, como não há métodos integrados, acho que terei que escrever uma função que teste a orientação de cada anel.
user890
Feliz em ajudar. Não há necessidade de re-inventar a roda, porém, ESRI oferece uma função de "isClockwise ()" no espaço de nomes de geometria: help.arcgis.com/en/webapi/javascript/arcgis/help/...
Derek Swingley
Boa resposta. Apenas verifique se os anéis ou orifícios internos estão no sentido anti-horário.
precisa saber é
2

O formato esri json segue de perto o da forma esri.

Os polígonos esri consistem em anéis. Eles podem representar entidades Multipolygon e Polygon do OGC.

Os polígonos geometricamente simples não terão auto-interseções e terão anéis externos no sentido horário e anéis internos (orifícios) no sentido anti-horário. Se você está lendo os serviços da Esri, é isso que você obtém normalmente.

Os polígonos não simples (aqueles que têm anéis orientados de maneira diferente ou têm auto-interseções) devem ser interpretados usando a regra de preenchimento ímpar regular ao desenhar ou fazer um ponto no teste de polígono .

Ao converter do polígono OGC Multipolygon para Esri, verifique se os anéis externos estão orientados no sentido horário e os orifícios estão no sentido anti-horário.

0kcats
fonte