Cara mengetahui apakah poligon memiliki lubang menggunakan kalkulator lapangan di ArcGIS

10

Beberapa perangkat lunak pihak ketiga tidak dapat menangani poligon berlubang (donat poligon). Untuk menemukannya saya selalu menggunakan kalkulator bidang ArcView 3, karena:

masukkan deskripsi gambar di sini

namun ketika saya mencoba melakukan ini di ArcGIS, saya mendapatkan ini:

masukkan deskripsi gambar di sini

Jadi pertanyaannya adalah bagaimana memperbaikinya di ArcGIS.

FelixIP
sumber
Saya terkejut partcount tidak berfungsi seperti yang diharapkan, jadi saya melakukan penggalian. Ternyata kadang-kadang donat kadang-kadang dapat (?) Menjadi fitur bagian tunggal dengan cincin dalam - lihat kalimat / grafik sebelum blok kode terakhir di halaman ini . Saya juga melihat utas tentang skrip yang akan mendeteksi mereka dengan python, tetapi tidak di kalkulator bidang.
Chris W
Saya bisa melakukannya menggunakan blok kode, tetapi jelek. Baris utama prt = shp.getPart (0) feat = arcpy.Polygon (prt). Cukup menghitung feat.area dan membandingkannya dengan shp.area
FelixIP
Sumber terkait: gis.stackexchange.com/questions/27255 Solusi perbandingan area Anda mungkin jelek, tetapi sepertinya itu berfungsi dan dalam Kalkulator Bidang. Mungkin layak dikirim sebagai jawaban.
Chris W
Saya lebih suka memberikan kredit kepada @Hornbydd, karena jawabannya membandingkan bilangan bulat, saya sendiri (yang saya tahu dulu) berurusan dengan ganda
FelixIP

Jawaban:

19

Hitungan jumlah tidak akan menghasilkan jawaban yang benar . Anda dapat memiliki poligon multi-bagian tanpa lubang. Lihat gambar di bawah untuk skenario.

Poligon multi-bagian

Ini akan menjadi permintaan sederhana pra-ArcGIS 10 karena Anda bisa memanggil ArcObjects untuk bertanya apakah poligon memiliki lubang tetapi ESRI telah menghapus banyak dukungan ini di lingkungan VBScripting ke titik yang cukup tidak berguna sekarang, sedikit memalukan ...

Pokoknya Anda dapat menyelesaikan pertanyaan ini dengan beberapa Python:

def hasHole(geom):
  parts = geom.partCount
  boundaries = geom.boundary().partCount
  if boundaries > parts:
    return 1
  else:
    return 0

Di kotak ekspresi Anda akan menempatkan yang berikut ini:

hasHole(!Shape!)
Hornbydd
sumber
Terima kasih atas jawaban yang elegan. Yang saya gunakan karena tidak ada ArcView 3 kurang dapat diandalkan, lihat komentar saya di
@ChrisW
1

Apakah Anda mengacu pada perbedaan antara dua ekspresi? Jika ya, sepertinya bagian bawah menggunakan Python sebagai pengurai sedangkan yang di atas menggunakan VB. Untuk mengubahnya di jendela Field Calculator di ArcGIS, cukup pilih VB daripada Python dan ekspresi teratas seharusnya berfungsi.

gistech007
sumber
Apa ungkapan dalam VB tolong
FelixIP