Mengekstrak jumlah simpul di setiap poligon?


14

Saya memiliki ArcGIS Desktop 10.2 dan tantangan saya adalah bagaimana mengekstrak simpul jumlah di setiap poligon untuk semua fitur seperti ini:

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Saya memiliki banyak paket di kelas fitur saya dan saya ingin mengekstrak jumlah simpul untuk semua fitur secara terpisah, maka saya ingin menampilkan koordinat XY untuk semua simpul.

untuk informasi lebih lanjut, saya hanya ingin mengkonversi simpul untuk setiap poligon dan menampilkan nomor setiap simpul yang terlihat dari 1 angka, jadi jika saya memiliki poligon dan memiliki 4 simpul, ingin mengkonversi poligon menjadi simpul saya menampilkan jumlah simpul seperti ini (1,2,3,4,5), kemudian menampilkan xy untuk setiap simpul, saya pikir id tantangan sebenarnya, bagaimana mengkonversi semua poligon menjadi simpul dan membuat setiap jumlah simpul mulai dari 1 angka.


Berdasarkan hasil edit Anda, apakah Anda ingin setiap fitur memiliki ID unik (1 .... n) per fitur dan koordinat XY? Apakah Anda lebih suka satu kolom / bidang untuk memiliki semua informasi ini untuk tujuan pelabelan misalnya [1, 942744.1234, 924654.1234] [2, 952744.1234, 925654.1234] ...?
Aaron

ya, jika tidak salah, satu yang diajukan memiliki ID untuk jumlah simpul setiap poligon seperti ini (1,2,3,4), (1,2,3,4,5), (1,2,3,4, 5,6,), (1,2,3,4,5,6,7,8,9) dll, maka saya berpikir tentang xy mungkin mudah jika kita memanggil add xy tool dari arctoolbox
GIS Man

Jawaban:


5

Kode di bawah menggabungkan jawaban lain dan menambahkan sedikit ke nomor simpul. hasil

import arcpy
arcpy.env.workspace = "in_memory"
#paths
fc = r"...\polygons"
fc_out = r"...\vertices"
arcpy.MakeFeatureLayer_management(fc, "lyr")
# add fields if needed
for FIELD in ["DRAW_ORDER", "COUNT"]:
    if FIELD not in [field.name for field in arcpy.ListFields(fc)]:
        try:
            arcpy.AddField_management("lyr", FIELD, "SHORT")
        except Exception as e:
            print e
# get the number of points minus overlapping (@dmahr - GSE)
arcpy.CalculateField_management("lyr", "COUNT", "!Shape!.pointCount-!Shape!.partCount", "PYTHON")
# dict to iterate and check count
OIDS = {}
for row in arcpy.da.SearchCursor("lyr", ["OBJECTID", "COUNT"]):
    OIDS[row[0]] = row[1]
del row
# get vertices as points and add XY (@Aaron - GSE)
arcpy.FeatureVerticesToPoints_management("lyr", fc_out)
arcpy.AddXY_management(fc_out)
# start adding a number to the points
for OID in OIDS:
    order_count = 1
    rows = arcpy.da.UpdateCursor(fc_out, ["DRAW_ORDER", "COUNT"], "ORIG_FID = %d"%OID)
    for row in rows:
        # will leave the overlapping as NULL
        if order_count <= OIDS[OID]:
            row[0] = order_count
            rows.updateRow(row)
            order_count += 1
##        # this can set the overlapping to 0 or some unique value (999)
##        else:
##            row[0] = 0
##            rows.updateRow(row)

Poin diberi label dalam urutan gambar. Titik terakhir (di bawah yang pertama) tidak akan memiliki label dan dapat dihapus dengan memilih semua titik yang memiliki nilai Null, atau unik, "DRAW_ORDER" jika tidak diperlukan untuk rekonstruksi. Kueri definisi dapat digunakan untuk menghapus titik yang tumpang tindih dari tampilan.

Data XY hadir, tetapi saya akan menyerahkannya pada keinginan pelabelan / tampilan Anda. Lihat jawaban Aaron tentang menambahkan bidang XY untuk pelabelan.

Saya juga bermain-main dengan FeatureClass ke array numpy, tapi saya menyelesaikan ini dulu.


terima kasih @ gm70560, saya telah mengikuti variabel kode Anda, dan menyimpannya sebagai .py, tetapi ketika saya ingin menjalankannya, pesan kesalahan muncul, "Nama bidang yang ditentukan tidak ada dalam tabel", jadi apa yang bisa saya lakukan ?
GIS Man

di sini adalah layar cetak dari pc saya, saya hanya mengatur jalur kelas fitur target, dan jalur untuk output kelas fitur baru, dalam kode Anda, jika Anda dapat membuat pedoman untuk bagaimana menggunakan kode Anda, imageshack.com/i/ fvsozep
GIS Man

Itu tidak menambahkan bidang (?). Apa yang terjadi selanjutnya dalam hasil? Saya punya ruang obrolan untuk membuang hasil lengkap. Tinggalkan komentar sehingga saya dapat memeriksa kamar.
gm70560

22

Cara termudah untuk melakukan ini adalah menambahkan bidang bilangan bulat baru ke tabel atribut lapisan parsel. Kemudian, jalankan kalkulator bidang dengan ekspresi berikut:

!Shape!.pointCount-!Shape!.partCount

The !Shape!.pointCountmengembalikan jumlah simpul dalam fitur. Namun, simpul pertama dari setiap bagian diulangi di bagian akhir, untuk menutup fitur. Untuk menangani ini, kurangi satu simpul untuk setiap bagian menggunakan -!Shape!.partCount.

Perhatikan bahwa Anda harus menggunakan pengurai Python untuk ekspresi ini agar berfungsi.

Kalkulator bidang


ini sangat keren, tetapi tidak akan memberikan XY untuk masing-masing simpul ini. Tampaknya jawabannya akan menggunakan kedua tanggapan (yaitu, juga @ Aaron's) untuk mendapatkan semua info yang diminta.
Roland

@Roland Anda benar ... Saya melewatkan bagian pertanyaan tentang simpul XY. Dalam hal ini Anda harus menggunakan SearchCursormetode dalam jawaban Aaron atau alat geoprocessing seperti Feature Vertices To Points (meskipun alat ini memerlukan lisensi ArcGIS untuk Desktop Advanced).
dmahr

terima kasih banyak @ dmahr, saya pikir ada langkah yang hilang, ketika saya menghitung nilai, hasilnya adalah menghitung jumlah simpul, jadi jika saya memiliki kelas fitur paket dengan 5 simpul saya ingin menampilkannya seperti ini 1,2,3 , 4,5 pada setiap simpul, tidak menghitung semua simpul dalam satu angka, tantangan sebenarnya, bagaimana menampilkan nomor untuk setiap simpul mulai dari 1 angka untuk setiap parsel.
GIS Man

12

dmahr memberikan solusi yang baik untuk menghitung simpul. Untuk cara yang tidak terprogram untuk memberi label setiap titik dengan koordinat XY, coba alur kerja berikut:

  1. Fitur Verteks ke Poin
  2. Tambahkan dua bidang baru (ketik: dua kali lipat) di titik baru FC "X", "Y"
  3. Hitung geometri. Klik kanan bidang> Hitung Geometri ...> X Koordinat Titik (ulangi untuk bidang Y)
  4. Tambahkan bidang lain "XY" (ketik: Teks)
  5. Hitung bidang "XY" di kalkulator bidang, di mana XY =

    str (! x!) + "," + str (! y!)

  6. Fitur label. Klik kanan layer> Label> Bidang Label: XY

Ini menghasilkan hasil sebagai berikut:

masukkan deskripsi gambar di sini

Anda juga dapat melakukan tindakan ini secara terprogram menggunakan explode_to_pointsdengan kursor pencarian (sebagai permulaan).

Dekonstruksi fitur menjadi titik atau simpulnya sendiri. Jika explode_to_points disetel ke True, fitur multipoint dengan lima poin, misalnya, diwakili oleh lima baris.

(Nilai standarnya False)

arcpy.da.SearchCursor (in_table, field_names, {where_clause}, {spatial_reference}, {explode_to_points}, {sql_clause})

tampaknya orang akan memerlukan beberapa proses posting atau menggunakan jawaban @ dmahr untuk mendapatkan penjumlahan # fitur dari simpul.
Roland

4

Jika seseorang tidak ingin menghitung bidang baru dan hanya ingin mendapatkan sejumlah simpul per lapisan kembali dengan sangat cepat (untuk keperluan generalisasi seperti ketika mengekspos dataset di web), maka dimungkinkan untuk membuat alat skrip khusus di dalam toolbox atau memaparkan kode sebagai tambahan Python.

Kode alat skrip khusus:

import arcpy
in_fc = arcpy.GetParameterAsText(0)

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"SHAPE@")]
count_vertices = sum([f.pointCount-f.partCount for f in features])
arcpy.AddMessage("***************************************")
arcpy.AddMessage("Number of vertices in the layer: {0}".format(count_vertices))
arcpy.AddMessage("***************************************")

Kode add-in Python (pilih layer di TOC untuk menghitung simpul):

import arcpy
import pythonaddins

arcpy.env.overwriteOutput = True
mxd = arcpy.mapping.MapDocument("current")
in_fc = pythonaddins.GetSelectedTOCLayerOrDataFrame()

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"SHAPE@")]
count_vertices = sum([f.pointCount-f.partCount for f in features])

pythonaddins.MessageBox(count_vertices, 'Number of vertices in {0}'.format(in_fc.name), 0)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.