ESRI JSON Ориентация многоугольного кольца?

10

Мне трудно найти какую-либо подробную документацию, определяющую спецификации JSON от ESRI. Я надеюсь, что кто-то сможет пролить свет на следующие два вопроса.

  1. Подобно спецификации GeoJSON, первый массив в коллекции ' paths ' всегда является внешним кольцом, а все последующие массивы в этой коллекции являются внутренними кольцами (отверстиями)?

  2. Выше верно, как спецификация ESRI JSON работает с мультиполигонами?

user890
источник

Ответы:

13

Вот ссылка на документ Esri об объектах геометрии JSON . С этой страницы:

REST API поддерживает 4 типа геометрии - точки, полилинии, многоугольники и конверты.

Похоже, мульти-полигоны не поддерживаются. См. ниже. Вы можете создавать многоугольники, добавляя дополнительные кольца. Там нет ничего явного в интерьере против внешних колец. Мне любопытно, так что я собираюсь разобраться в этом дальше ... будет редактировать этот пост, если я найду что-нибудь еще.

Изменить: я посмотрел на это немного больше. Похоже, если вы добавите кольца, которые попадают внутрь существующего кольца, внутренние кольца являются отверстиями. Если вы добавляете кольцо, которое не находится внутри другого кольца, оно добавляется как дополнительный многоугольник, который в основном является многоугольником. Вот простая страница, которая показывает это:

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

Если вы загрузите эту страницу, первое кольцо - это квадрат с двумя отверстиями. Два отверстия - кольца два и три. Четвертое кольцо в самом западном многоугольнике. Это может выглядеть как две графики, но на самом деле это просто одна.

Дерек Суингли
источник
Самый отличный ответ, спасибо. Теперь для тяжелой работы, поскольку нет встроенных методов, я думаю, мне придется написать функцию, которая проверяет ориентацию каждого кольца.
user890 20.10.10
Рад помочь. Не нужно заново изобретать колесо, однако, esri предоставляет функцию «isClockwise ()» в пространстве имен геометрии: help.arcgis.com/en/webapi/javascript/arcgis/help/…
Дерек Свингли
Хороший ответ. Просто убедитесь, что внутренние кольца или отверстия против часовой стрелки.
capie69
3

Формат esri json близко соответствует формату esri.

Полигоны esri состоят из колец. Они могут представлять как мультиполигон, так и полигон из OGC.

Геометрически простые многоугольники не будут иметь самопересечений и будут иметь внешние кольца по часовой стрелке и внутренние кольца (отверстия) против часовой стрелки. Если вы читаете из сервисов Esri, это то, что вы обычно получаете.

Непростые многоугольники (те, которые имеют кольца, ориентированные по-разному или имеют самопересечения), должны интерпретироваться с использованием обычного четно-нечетного правила заполнения при рисовании или создании точки в тесте многоугольника .

При преобразовании из OGC Multipolygon в Esri, просто убедитесь, что внешние кольца ориентированы по часовой стрелке, а отверстия - против часовой стрелки.

0kcats
источник