Apakah ArcPy memiliki fungsi pencarian spasial untuk geometri?

10

Masalah saya: Menggunakan ArcPy Saya ingin mengulang buffer dan memilih geometry_features di dalam setiap buffer dan melakukan sesuatu (perbarui) hanya objek yang ditemukan dalam buffer tertentu. Kode di bawah ini menjelaskan apa yang ingin saya lakukan (kurang lebih):

def _update_connections_inside_buffers(self):
    buffers = arcpy.SearchCursor(self.__buffer_class_name)
    in_layer = "connections"
    for i_buffer in buffers:
        shape = i_buffer.shape
        # can not use a geometry to do a selection.. very inconvenient!!
        connections = arcpy.SelectLayerByLocation_management(in_layer, "WITHIN", shape) 
        self._update_connections(connections)

Namun: ini tidak akan berfungsi karena SelectLayerByLocation_management () tidak menerima geometri, "bentuk" sebagai argumen tetapi mengharapkan feature_class_name (nama layer). Apakah ada metode arcpy yang dapat melakukan pencarian menggunakan predikat spasial. Saya tidak dapat menemukan cara melakukan ini dari manual ESRI.

pengguna8175
sumber

Jawaban:

13

Saya yakin hal seperti ini dapat dilakukan karena kami menggunakan kode di bawah ini di salah satu kursus pelatihan kami. Jika tampaknya tidak berfungsi, maka saya curiga bahwa Anda tidak mendefinisikan objek layer dengan menggunakan layer di Daftar Isi ArcMap, atau dengan menggunakan MakeFeatureLayer di luar ArcMap.

Atau, lebih mungkin saya pikir itu adalah "koneksi =" di sebelah SelectLayerByLocation yang memberi Anda masalah Anda karena Anda menetapkan itu ke objek Hasil dan tidak mengekstraksi apa pun darinya sebelum meneruskannya kembali.

import arcpy
schoolsLayer = "Schools"
suburbsLayer = "Suburbs"
# get an update cursor as we will be changing values
rows = arcpy.UpdateCursor(suburbsLayer)
# loop through each suburb in the layer
for row in rows:
    polygon = row.SHAPE
    arcpy.SelectLayerByLocation_management(schoolsLayer,"INTERSECT",polygon)
PolyGeo
sumber
2

Ini bisa dilakukan, tetapi sejauh yang saya tahu, hanya melalui penggunaan Feature Layers w / arcpy. Pada dasarnya Anda akan membuat klausa tempat dan memperbaruinya dengan OID (atau bidang pengidentifikasi unik lainnya) dan mengulang melalui SelectLayerByLocation.

Lihatlah tutorial ini dari program master PSU - ini mencakup apa yang Anda cari jika saya tidak salah.

Tidak diperlukan referensi geometri; kueri spasial menggunakan geometri berdasarkan pada tipe kueri apa yang Anda tetapkan (mis. sepenuhnya berisi, berbagi perbatasan, dll.). Jika Anda perlu mereferensikan geometri dari titik-titik ini, setelah mereka ditentukan berada dalam buffer menambahkannya (OID) ke daftar python dan bekerja dengan kumpulan data asli menggunakan klausa where.

Roy
sumber
Saya menemukan solusi untuk masalah ini. Saya harus memberikan feature_layer sebagai argumen pertama alih-alih string yang merujuk ke class_layer.
user8175
1

Saya menemukan solusi untuk masalah ini. Saya harus menyediakan feature_layer sebagai argumen pertama alih-alih string yang merujuk ke class_layer. "

    # Make a feature layer from the feature class
    class_layer = arcpy.env.workspace + "." + "connections"
    arcpy.MakeFeatureLayer_management(class_layer, "feature_layer")

    # Do selection using feature_layer 
    arcpy.SelectLayerByLocation_management("feature_layer", "WITHIN", p_polygon)

    # get result
    connections_found_in_polygon = arcpy.SearchCursor("feature_layer")
    self._update_connections(connections_found_in_polygon)
pengguna8175
sumber
3
Saya cukup yakin jawaban PolyGeo membahas hal ini. Anda harus berhati-hati untuk mencatat perbedaan antara kelas fitur dan lapisan fitur .
blah238