ESRI JSON Polygon Ring Orientation?

10

Trudno mi znaleźć jakąkolwiek szczegółową dokumentację określającą specyfikację JSON ESRI. Mam nadzieję, że ktoś może rzucić nieco światła na następujące dwa pytania.

  1. Podobnie jak w specyfikacji GeoJSON, pierwsza tablica w kolekcji „ paths ” jest zawsze zewnętrznym pierścieniem, a wszystkie kolejne tablice w tej kolekcji to wewnętrzne pierścienie (dziury)?

  2. Czy powyższe jest prawdziwe, w jaki sposób specyfikacja ESRI JSON radzi sobie z wielobokami?

użytkownik890
źródło

Odpowiedzi:

13

Oto link do dokumentu Esri dotyczącego obiektów geometrii JSON . Z tej strony:

Interfejs API REST obsługuje 4 typy geometrii - punkty, polilinie, wielokąty i koperty.

Wygląda na to, że wielokąty nie są obsługiwane. Patrz poniżej. Możesz tworzyć wieloboki, dodając dodatkowe pierścienie. Nie ma nic wyraźnego w wewnętrznych i zewnętrznych pierścieniach. Jestem ciekawy, więc przyjrzę się temu dalej ... będę edytować ten post, jeśli znajdę coś jeszcze.

Edycja: Przyjrzałem się temu trochę więcej. Wygląda na to, że jeśli dodasz pierścienie wpadające do istniejącego pierścienia, pierścienie wewnętrzne są otworami. Jeśli dodasz pierścień, który nie znajduje się w innym pierścieniu, zostanie on dodany jako dodatkowy wielokąt, który jest w zasadzie wielobokiem. Oto prosta strona, która to pokazuje:

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

Po załadowaniu tej strony pierwszym pierścieniem jest kwadrat z dwoma otworami. Dwa otwory to pierścienie dwa i trzy. Czwarty pierścień w najbardziej wysuniętym na zachód wielokącie. Może to wyglądać jak dwie grafiki, ale tak naprawdę to tylko jedna.

Derek Swingley
źródło
Najlepsza odpowiedź, dzięki. Teraz ciężka praca, ponieważ nie ma wbudowanych metod, myślę, że będę musiał napisać funkcję, która testuje orientację każdego pierścienia.
user890,
Miło, że mogłem pomóc. Nie trzeba jednak wymyślać koła od nowa, esri zapewnia funkcję „isClockwise ()” w przestrzeni nazw geometrii: help.arcgis.com/en/webapi/javascript/arcgis/help/…
Derek Swingley,
Dobra odpowiedź. Upewnij się tylko, że wewnętrzne pierścienie lub otwory są w kierunku przeciwnym do ruchu wskazówek zegara.
capie69
3

Format esri json ściśle odpowiada formatowi esri json.

Wieloboki esri składają się z pierścieni. Mogą reprezentować zarówno obiekty wieloboczne, jak i wieloboczne z OGC.

Geometrycznie proste wielokąty nie będą się przecinać i będą miały zewnętrzne pierścienie zgodnie z ruchem wskazówek zegara, a wewnętrzne pierścienie (otwory) przeciwnie do ruchu wskazówek zegara. Jeśli czytasz z usług Esri, zwykle dostajesz to.

Nieproste wielokąty (te, które mają różnie zorientowane pierścienie lub mają własne przecięcia) powinny być interpretowane przy użyciu regularnej reguły parzystej i nieparzystej podczas rysowania lub wykonywania punktu w teście wielokąta .

Podczas konwersji z wielokąta OGC na wielokąt Esri, upewnij się, że zewnętrzne pierścienie są ustawione zgodnie z ruchem wskazówek zegara, a otwory są przeciwnie do ruchu wskazówek zegara.

0kcats
źródło