Urutan simpul poligon pada GIS umum: searah jarum jam atau berlawanan arah jarum jam

23

Dua hari yang lalu saya mengajukan pertanyaan tentang urutan penyimpanan internal untuk simpul poligon di shapefile ESRI. Pertanyaan itu dijawab ( Apakah poligon disimpan searah jarum jam atau berlawanan arah jarum jam dalam sebuah shapefile? ) Dan itu juga dijawab dalam posting lama ( Pembuatan poligon (Rotasi searah jarum jam atau tidak) )

Tetapi sekarang pertanyaan saya lebih umum, dan saya tidak tahu apakah itu memiliki jawaban yang unik. Apakah urutan searah jarum jam hanya untuk bentuk ESRI atau untuk format GIS umum? Dan bagaimana dengan representasi internal untuk perangkat lunak SIG? Sebagai contoh, jika saya menggunakan QGIS dan saya membaca * .shp yang mengandung poligon, saya kira representasi internal dari batas luar searah jarum jam seperti pada shapefile asli, tetapi bagaimana dengan semua format file yang didukung oleh QGIS? Dan untuk ArcGIS? Dan dalam kasus ini terdapat format file dengan poligon yang disimpan secara berlawanan, jika file-file ini dimuat dalam QGIS, ArcGIS, dll., Adalah orientasi diubah secara internal, jadi jika saya membaca data menggunakan PyQGIS, misalnya, poligon searah jarum jam dipesan?

Tujuan saya adalah untuk menulis plugin untuk QGIS, tetapi sumber data dapat berupa ESRI shapefile atau format lainnya. Karena saya perlu memeriksa sudut antara sisi-sisi poligon yang berurutan menggunakan azimutnya, saya perlu tahu apakah urutannya searah jarum jam. Salah satu solusinya adalah menghitung luas setiap poligon dan, jika saya ingat dengan benar, jika positif urutannya searah jarum jam dan jika negatif urutannya berlawanan arah jarum jam.

Perhitungan area bukan tugas yang intensif, jadi itu tidak akan memperlambat plugin saya begitu banyak. Tetapi dalam kasus khusus QGIS, ada yang tahu apakah itu menyimpan poligon searah atau berlawanan arah jarum jam, terlepas dari urutan di sumber aslinya? Sekarang saya sedang bekerja dengan ESRI shapefile dan koordinat di layer.getFeatures (). Geometry (). AsPolygon () disimpan dalam searah jarum jam untuk batas luar dan berlawanan dengan arah lubang untuk lubang, yaitu seperti pada * .shp asli.

jgpallero
sumber
Itu tergantung pada bagaimana data disimpan. Oracle Anti-Clockwise gis.stackexchange.com/questions/20817/…
Mapperz
@Mapperz, tautan Anda mengarah ke docs.oracle.com/cd/B10501_01/appdev.920/a96630/... yang menyatakan dengan jelas Polygons are oriented correctly. (Exterior ring boundaries must be oriented counterclockwise, and interior ring boundaries must be oriented clockwise.)yang artinya Oracle berlawanan arah jarum jam .
user30184

Jawaban:

27

Dalam spesifikasi OGC, yang dapat diunduh [di sini], ( http://www.opengeospatial.org/standards/sfs ) mereka menyatakan:

"Rotasi poligon tidak ditentukan oleh standar ini; rotasi poligon yang sebenarnya mungkin searah atau berlawanan arah jarum jam."

Dalam dokumen Oracle , dinyatakan dengan jelas bahwa batas cincin eksterior berorientasi berlawanan arah jarum jam, dan batas cincin interior, searah jarum jam. Demikian juga, dalam SQL Server Spatial, tipe data geografi mengikuti aturan berlawanan arah jarum jam untuk cincin eksterior, dan searah jarum jam untuk cincin interior - lihat blog MicroSoft ini untuk detail lebih lanjut. Postgis tampaknya memungkinkannya untuk geometri, dan memiliki fungsi yang akan memaksa geometri poligon untuk mengikuti aturan tangan kanan atau kiri, lihat ST_ForceRHR dan ForceLHR . JTS / Geos tampaknya telah mengikuti aturan tangan kanan, yaitu, orientasi searah jarum jam dari cincin luar, jadi semuanya agak tidak jelas, sungguh.

Secara umum masuk akal untuk tipe data geografi untuk memaksakan orientasi, karena jika tidak maka tidak mungkin untuk mengetahui apakah poligon kecil hanya itu atau cincin bagian dalam dari seluruh poligon dunia. Dengan tipe data geometri pada permukaan planar, kebingungan ini tidak dapat muncul, karena cincin luar dan cincin dalam mengikuti, dan jika hanya ada satu cincin, itu akan melampirkan (tidak peduli apa orientasinya), tidak seperti bola dunia , yang membungkus.


Dari komentar oleh @mxfh: OpenGIS's Simple Features Access OGC (ISO 19125-1) menetapkan arah berlawanan arah jarum jam untuk cincin luar pada dokumen versi 1.2.1 [OGC 06-103r4] 6.1.11.1/halaman 26 dari opengeospatial.org / standar / sfa. Perubahan itu diperkenalkan antara versi 1.1.0 dan 1.2.0 di 2006 terbaru. Catatan kaki tempat Anda mengutip belum diperbarui sejak 2005

John Powell
sumber
Jawaban yang bagus, John. Saya tidak yakin bahwa menggunakan pemesanan node untuk mengidentifikasi cincin interior vs eksterior adalah satu-satunya cara format data vektor dapat mencapai itu. Saya akan setuju dengan Anda bahwa beberapa mekanisme harus ada. Dengan GeoJSON misalnya, daftar node pertama ditetapkan sebagai eksterior dan semua daftar berikutnya adalah lubang interior. Itu berfungsi sebagai (jika tidak lebih) efektif.
WhiteboxDev
Ya, ini berlaku untuk WKT untuk geometri juga. Untuk geografi, itu jelas lebih penting.
John Powell
Itu sangat benar;)
WhiteboxDev
@WhiteboxDev alasan berliku pesanan cincin bersarang bergantian adalah, yang menghitung daerah dengan Metode Tali Sepatu menghitung area yang ditandatangani tergantung pada arah cincin. Secara umum cincin bersarang dari urutan pertama dianggap lubang dan memiliki arah alternatif dari cincin luar. Nilai kontribusi area mereka negatif. Dimana cincin luar positif; begitu juga cincin bersarang dari urutan genap. Jadi total area dari semua fitur dering adalah jumlah dari semua area yang ditandatangani.
mxfh
1
@ mxfh: secara tegas, "pesanan berliku cincin bersarang" diperdebatkan untuk OCG (dan banyak lainnya) Poligon .... karena tidak diizinkan. Cara untuk merepresentasikan poligon bersarang di dalam "lubang" yang lain adalah dengan menggunakan MultiPoligon ... dalam hal ini, setiap poligon konstituen mengikuti aturan belitan asli. OK, OK: ini sama saja dengan bergantian lilitan "LinearRings bersarang" ... tetapi hanya menunjukkan bahwa itu bukan Polygon - per se - yang memungkinkan ini, melainkan definisi MultiPolygon.
Dan H
23

Arah cincin (batas) diperlukan untuk mencegah ambiguitas untuk sistem koordinat geografis yang menutupi permukaan yang terbatas, karena batas akan menentukan dua area, satu kiri dan satu kanan batas sepanjang arahnya. Menentukan yang mana dari dua area itu yang lebih besar adalah mungkin, tetapi masih menyisakan ambiguitas.

Berikut ini adalah ikhtisar tentang arah cincin luar poligon dalam berbagai format berdasarkan spesifikasinya:

Ilustrasi urutan gulungan Shapefile dan Fitur Sederhana

  • Akses Fitur Sederhana (ISO 19125-1) juga digunakan dalam WKT / GML / KML dan berbagai implementasi SQL:

    • cincin eksterior: berlawanan arah jarum jam
    • cincin interior (lubang): arah searah jarum jam.

    Poligon adalah Permukaan planar yang ditentukan oleh 1 batas luar dan 0 atau lebih batas dalam. Setiap batas interior mendefinisikan lubang di Polygon. [...]

    Batas eksterior LinearRing mendefinisikan "atas" permukaan yang merupakan sisi permukaan dari mana batas luar tampak melintasi batas dalam arah berlawanan arah jarum jam . The interior LinearRings akan memiliki orientasi yang berlawanan, dan muncul sebagai searah jarum jam jika dilihat dari “atas” ... Simple Fitur spesifikasi Access

    Dalam sebagian besar implementasi, urutan cincin dalam POLYGON penting (sebagai lawan dari shapefile)

    Untuk poligon berlubang, subelemen pertamanya adalah cincin eksteriornya, subelemen kedua adalah cincin interior pertama, subelemen ketiga adalah cincin interior kedua, dan seterusnya. Oracle Spatial

    Sarang yang lebih dalam, alias pulau-di-danau-di-pulau-... harus diwakili sebagai MultiPolygons ( lihat gambar 2.10 (4) ), karena hanya ada satu perbatasan luar dan sarang yang lebih dalam daripada cincin interior. tidak didefinisikan.

  • ESRI Shapefile / SHP :

    • cincin eksterior: searah jarum jam
    • cincin interior: berlawanan arah jarum jam

    Poligon terdiri dari satu atau lebih cincin. Cincin adalah urutan yang terhubung dari empat atau lebih titik yang membentuk lingkaran tertutup dan tidak berpotongan sendiri. Poligon dapat berisi beberapa cincin luar . Urutan simpul atau orientasi untuk cincin menunjukkan sisi cincin mana yang merupakan bagian dalam poligon. Lingkungan di sebelah kanan pengamat berjalan di sepanjang cincin dalam urutan vertex adalah lingkungan di dalam poligon. Vertikal cincin yang mendefinisikan lubang dalam poligon berada dalam arah berlawanan arah jarum jam . Oleh karena itu, simpul untuk poligon berdering tunggal selalu berurutan searah jarum jam . [...]

    Urutan cincin dalam array poin tidak signifikan. ESRI Whitepaper

    Karena beberapa batas luar diizinkan konfigurasi pulau-di-danau-di-pulau dimungkinkan dengan definisi poligon ini. Secara topologis, pulau di danau hanyalah cincin luar searah jarum jam. Secara efektif ini membuat ESRI Shapefile Polygon sebagai MultiPolygon Fitur Sederhana

    Jika Anda tidak memesan poin dengan benar, Anda hanya akan memiliki poligon yang tumpang tindih. pyshp

  • GeoJSON (RFC7946) :

    CATATAN: Spesifikasi asli GeoJSON 2008 tidak memiliki aturan penggulungan

    • urutan berliku: cincin eksterior berlawanan arah jarum jam (aturan kanan)
    • cincin interior searah jarum jam
    • urutan cincin itu penting:

      Untuk Poligon dengan beberapa cincin, yang pertama harus cincin eksterior dan yang lainnya harus cincin atau lubang bagian dalam. Spesifikasi GeoJSON

  • TopoJSON : memaksa cincin eksterior searah jarum jam secara default

Ilustrasi urutan gulungan Shapefile dan Fitur Sederhana

Tamasya:

Alasan matematis mengapa urutan belitan cincin bersarang bergantian adalah, yang menghitung area dengan rumus tali sepatu ( penjelasan visual ) menghitung area yang ditandatangani tergantung pada arah cincin.

Secara umum cincin bersarang (batas interior) dianggap lubang dan memiliki arah alternatif dari cincin luar. Nilai kontribusi area yang ditandatangani memberikan kontribusi negatif. Sedangkan cincin luar positif. Total area dari semua fitur dering adalah jumlah dari semua area yang ditandatangani.

Seperti yang diterapkan oleh ESRI, lihat entri Pangkalan Pengetahuan ini: Algoritma apa yang digunakan oleh ArcGIS untuk menentukan area poligon?

Usulan Mnemonik

Ujung huruf yang terbuka ditafsirkan sebagai panah:

  • S hapefile: S → ᔑ → ↻
  • Simple F e atur e s: e → ᘓ (berkelok-kelok ke arah luar cc-bijaksana) → ↺
  • GeoJSON: G (batang G adalah panah) → ↺
mxfh
sumber
4

Saya tidak tahu bahwa siapa pun akan dapat memberikan jawaban yang pasti untuk pertanyaan Anda karena setiap format file vektor berbeda dan masing-masing SIG, dalam hal bagaimana mereka menangani data ini secara internal, juga akan berbeda. Tetapi saya dapat memberi tahu Anda dengan pasti bahwa pemesanan searah jarum jam tidak hanya untuk ESRI Shapefile. Ada format lain yang menggunakan penunjukan yang serupa dengan pemesanan searah jarum jam untuk cincin eksternal dan berlawanan arah jarum jam untuk poligon lubang interior. Sebagai contoh, struktur poligon vektor JTS menggunakan format yang serupa. Bahkan, dinyatakan di sini , bahwa secara historis ini mirip dengan pendekatan ESRI. Saya juga dapat secara definitif mengatakan bahwa tidak, tidak semua format memiliki persyaratan ini. Misalnya, spesifikasi format GeoJSONtidak membuat persyaratan tentang pemesanan simpul dalam format poligonnya. The KML Spesifikasi benar-benar menyatakan:

Poligon untuk harus ditentukan dalam urutan berlawanan arah jarum jam. Poligon mengikuti "aturan tangan kanan," yang menyatakan bahwa jika Anda meletakkan jari-jari tangan kanan Anda ke arah di mana koordinat ditentukan, ibu jari Anda menunjuk ke arah umum normal geometrik untuk poligon.

Jadi ada banyak pilihan dan diterapkan di sana. Dunia yang liar!

WhiteboxDev
sumber
1
Perhatikan bahwa "aturan tangan kanan" KML adalah apa yang secara konvensional disebut "aturan tangan kiri" (ketika Anda berjalan di sekeliling dengan tangan terentang, tangan kiri Anda akan berada di dalam gambar). Esri memiliki beberapa pendekatan, karena shapefile adalah satu-satunya format yang menggunakan aturan tangan kanan (perusahaan geodatabase menggunakan aturan tangan kiri secara internal, tetapi API 'C' akan memungkinkan Anda meminta dalam urutan mana pun). GML hanya mensyaratkan bahwa cincin interior berada dalam urutan yang berlawanan dengan cincin eksterior, dan cincin pertama adalah eksterior.
Vince
@ Karena saya tidak tahu itu. Bukankah itu gila? Terima kasih telah memberi tahu saya. Saya pikir saya paling suka pendekatan GML; tidak masalah pemesanan selama mereka berseberangan. Itu sangat masuk akal.
WhiteboxDev