ESRI JSON Orientasi Cincin Poligon?

10

Saya kesulitan menemukan dokumentasi terperinci yang mendefinisikan spesifikasi JSON ESRI. Saya berharap seseorang dapat menjelaskan dua pertanyaan berikut.

  1. Mirip dengan spesifikasi GeoJSON, array pertama dalam koleksi ' paths ' selalu merupakan cincin eksterior, dan semua array berikutnya dalam koleksi ini adalah cincin interior (lubang)?

  2. Apakah di atas benar, bagaimana spec ESRI JSON menangani multi-poligon?

pengguna890
sumber

Jawaban:

13

Berikut ini tautan ke dokumen Esri tentang objek geometri JSON . Dari halaman itu:

REST API mendukung 4 jenis geometri - titik, polyline, poligon, dan amplop.

Kedengarannya seperti multi-poligon tidak didukung. Lihat di bawah. Anda dapat membuat multi-poligon dengan menambahkan dering tambahan. Tidak ada yang eksplisit tentang cincin interior v. Eksterior. Saya ingin tahu jadi saya akan melihat lebih jauh ... akan mengedit posting ini jika saya menemukan hal lain.

Sunting: Saya melihat ini sedikit lebih. Sepertinya jika Anda menambahkan cincin yang berada di dalam cincin yang ada, cincin interiornya berlubang. Jika Anda menambahkan cincin yang tidak ada di dalam cincin lain, itu ditambahkan sebagai poligon tambahan yang pada dasarnya adalah multi-poligon. Inilah halaman sederhana yang menunjukkan ini:

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

Jika Anda memuat halaman itu, deringan pertama adalah kuadrat dengan dua lubang. Kedua lubang itu adalah cincin dua dan tiga. Cincin keempat di paling barat poligon. Ini mungkin terlihat seperti dua gambar tetapi sebenarnya hanya satu.

Derek Swingley
sumber
Jawaban yang paling bagus, terima kasih. Sekarang untuk kerja keras, karena tidak ada metode bawaan, saya kira saya harus menulis fungsi yang menguji orientasi setiap cincin.
user890
Senang untuk membantu. Tidak perlu menemukan kembali roda, esri menyediakan fungsi "isClockwise ()" di ruang nama geometri: help.arcgis.com/en/webapi/javascript/arcgis/help/…
Derek Swingley
Jawaban yang bagus. Pastikan saja cincin atau lubang bagian dalam berlawanan arah jarum jam.
capie69
3

Format esri json mengikuti bentuk esri.

Poligon esri terdiri dari cincin. Mereka dapat mewakili entitas Multipolygon dan Polygon dari OGC.

Poligon yang sederhana secara geometris tidak akan memiliki persimpangan sendiri dan akan memiliki cincin eksterior searah jarum jam dan cincin interior (lubang) berlawanan arah jarum jam. Jika Anda membaca dari layanan Esri itulah yang biasanya Anda dapatkan.

Poligon non-sederhana (yang memiliki cincin berorientasi berbeda atau memiliki persimpangan sendiri) harus diinterpretasikan menggunakan aturan isian genap genap ketika menggambar atau membuat titik dalam uji poligon .

Saat mengkonversi dari OGC Multipolygon ke Esri polygon, pastikan cincin eksterior berorientasi searah jarum jam dan lubang berlawanan arah jarum jam.

0kcats
sumber