Memilih ArcSDE poligon per poin di ArcGIS Desktop menggunakan ArcPy?

15

Saya terus berpikir bahwa saya harus kehilangan sesuatu, tetapi sepertinya tidak ada alat di ArcGIS 10 untuk memilih fitur (khususnya poligon) dari layer pada titik (X, Y) lokasi melalui ArcPy. Parameter untuk alat seperti itu hanya akan menjadi nama layer dan lokasi XY.

Saat ini saya mengatasinya dengan membuat sebuah titik fitur yang berisi titik dan melakukan SelectLayerByLocation di atasnya. Namun, ketika kelas fitur poligon ada di Oracle (diakses melalui ArcSDE 9.x) dan berisi 3,5 juta poligon, waktu yang dibutuhkan untuk melakukan pemilihan bisa lebih dari 5 menit ketika saya pikir satu atau dua detik (dengan kode lebih sedikit) akan menjadi lebih tepat. Kelas fitur memiliki indeks spasial dan saya sudah mencoba menggunakan arcpy.env.extent (yang SelectLayerByLocation tampaknya diabaikan) untuk membatasi area geografis yang diakses tetapi kinerjanya tetap sangat buruk.

Apakah ada cara yang lebih cepat untuk melakukan ini menggunakan ArcGIS Desktop 10 dan ArcPy?

PolyGeo
sumber
Sekarang ada solusi untuk ini di forums.arcgis.com/threads/… dan saya akan mengedit informasi itu di sini hari ini - banyak terima kasih kepada Jason Scheirer dan Chris Snyder
PolyGeo
2
Sama seperti catatan untuk ini, Anda dapat menemukan lingkungan yang dihormati oleh alat di bagian bawah halaman referensi alat. SelectByLocation hanya menghormati Ruang Kerja Saat Ini dan Sistem Koordinat Output. help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//…
blord-castillo

Jawaban:

9

Pendekatan lain untuk ini adalah dengan menggunakan alat Spatial Join. Gunakan titik sebagai lapisan fitur input Anda seperti di atas dan lapisan poligon sebagai fitur identitas Anda.
Tidak seperti SelectLayerByLocation, SpatialJoin tidak menghormati lingkungan sejauh.

targetlayer = layername
joinlayer=arcpy.PointGeometry(arcpy.Point(x, y))
fieldmappings = arcpy.FieldMappings()
fieldmappings.addTable(targetlayer)
arcpy.SpatialJoin_analysis(targetlayer, joinlayer, outputlayer, "JOIN_ONE_TO_MANY", "KEEP_COMMON", fieldmappings)

JOIN_ONE_TO_MANY mungkin tampak kontra-intuitif, tetapi karena Anda hanya memiliki satu fitur bergabung, fungsi utama opsi ini adalah untuk menonaktifkan agregasi dan menggabungkan aturan. KEEP_COMMON akan memastikan bahwa output Anda hanya terbatas pada poligon yang memotong titik Anda. Pemetaan Field akan membatasi atribut output hanya pada bentuk dan atribut dari layer poligon; default akan menyertakan atribut layer point juga.

Sisa dari default akan bekerja dengan baik, sehingga Anda dapat mengabaikan argumen yang tersisa.

tuan-castillo
sumber
Terima kasih banyak untuk kode ini yang berisi beberapa teknik yang belum saya coba. Saya sebelumnya telah mencoba SpatialJoin (sehingga saya bisa menghargai lingkungan geoprocessing) tetapi pengujian itu, serta tes teknik Anda sekarang, masih meninggalkan saya dengan waktu respon 4-5 menit dibandingkan dengan 10-12 detik untuk jalan Chris Snyder membimbingku.
PolyGeo
Sudahkah Anda mencoba teknik Chris Snyder dengan SpatialJoin juga? Saya pikir alasan utama teknik penyangga begitu cepat adalah karena ia menggunakan salinan memori dalam kelas poligon. Saya-pikir-pemilihan oleh lokasi harus lebih cepat daripada bergabung spasial, tapi saya tidak yakin.
blord-castillo
Akhirnya tidak menggunakan bit in_memory. Itu sudah dipercepat sehingga saya menyimpannya sebagai cadangan. Saya pikir kuncinya adalah menetapkan sejauh mana untuk mendapatkan satu / beberapa poligon (dari 3,5 juta), yang saya butuhkan untuk memeriksa X, Y terhadap, dengan cepat disalin ke file geodatabase lokal. Jadi melakukan bagian itu sebelum SpatialJoin akan saya pikir mengarah pada peningkatan kinerja yang sama / serupa.
PolyGeo
1

Saya baru menyadari sesuatu ...

Jika Anda menggunakan ini untuk mengimplementasikan Layanan Geoprocessing, Anda juga bisa menerapkan Layanan Fitur dengan lapisan poligon Anda dan menggunakan operasi Permintaan pada layanan fitur.

Anda dapat menggunakan lokasi XY sederhana dengan operasi Permintaan Layanan Fitur, serta mengontrol atribut output termasuk bentuk.

Anda mungkin memiliki batasan pada seberapa banyak Anda dapat mengekspos kelas fitur poligon, tetapi jika Anda sudah membuatnya dapat diakses oleh layanan geoprocessing, maka Anda harus dapat membangun Layanan Fitur juga.

tuan-castillo
sumber
Ini adalah pemikiran yang berguna untuk memenuhi persyaratan lain tetapi, dalam hal ini, aplikasi klien sangat sederhana, dan di luar kendali saya, jadi saya hanya dapat memberikan Layanan Geoprocessing.
PolyGeo
Saya pikir mungkin ada batasan dalam menggunakan apa pun selain Layanan Geoprocessing :) Ironisnya, saya pikir Layanan Fitur adalah rute yang jauh lebih sederhana untuk diterapkan dan dipelihara. Ini mungkin juga menjelaskan mengapa fungsi yang Anda inginkan tidak tersedia; Anda sudah dapat melakukannya di setiap level aplikasi. Pastikan Anda mengirim permintaan ke ESRI untuk mengimplementasikannya sebagai alat di versi berikutnya.
blord-castillo
1

Jawaban ini datang dari Forum Diskusi ArcGIS yang lama .

Terima kasih Jason Scheirer untuk beberapa kode yang lebih ringkas:

SelectLayerByLocation(in_layer=arcpy.PointGeometry(arcpy.Point(x, y)), select_features="mylayer") 

Dan terutama kepada Chris Snyder untuk kiat kinerja:

Pekerjaan yang lebih cepat di sekitar mungkin untuk buffer poin Anda sedikit dan kemudian menggunakan batas buffer sebagai tingkat analisis untuk membuat salinan in_memory (alat CopyFeatures) dari data SDE Anda, dan kemudian melakukan SelectByLocation pada dataset in_memory yang lebih kecil dan lokal. Dengan begitu Anda semacam membuat alat SelectByLocation menghormati lingkungan tingkat analisis, yang biasanya tidak dilakukan. BTW: Setiap fitur yang tumpang tindih dengan tingkat analisis akan disalin dengan alat CopyFeatures. Saya yakin berharap alat SelectByLocation dan metode kursor menghormati tingkat analisis ...

PolyGeo
sumber