ArcPy'nin geometri için uzamsal arama işlevi var mı?


10

Benim sorunum: ArcPy kullanarak arabelleklerin üzerinden döngü ve her arabellek içinde geometry_features seçin ve bir şey yapmak (güncelleme) sadece bu arabellek içinde bulunan nesneleri istiyorum. Aşağıdaki kod ne yapmak istediğimi açıklar (az çok):

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)

Ancak, SelectLayerByLocation_management () bir geometriyi "şekil" bağımsız değişken olarak kabul etmediği, ancak bir özellik_sınıf_adı (katman adı) beklediğinden bu çalışmaz. Uzamsal bir yüklem kullanarak arama yapabilen bir arkpy yöntemi var mı? Bunu ESRI kılavuzundan nasıl yapacağımı bulamadım.

Yanıtlar:


13

Aşağıdaki kodu eğitim kurslarımızdan birinde kullandığımız için böyle bir şey yapılabileceğinden eminim. Çalışmıyor gibi görünüyorsa, ArcMap İçindekiler Tablosunda bir katman kullanarak veya ArcMap dışında MakeFeatureLayer kullanarak katman nesnesini tanımladığınızdan şüpheleniyorum.

Ya da daha büyük olasılıkla size bir Sonuç nesnesi için ayarlıyoruz ve onu geri geçmeden önce bir şey ayıklamak değil çünkü size sorun veren SelectLayerByLocation yanındaki "connections =" ​​olduğunu düşünüyorum.

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)

2

Bu, ancak bildiğim kadarıyla, yalnızca arcpy özellik katmanları kullanılarak yapılabilir. Temelde bir where yan tümcesi yaratacak ve OID (veya başka bir benzersiz tanımlayıcı alan) ile güncelleyecek ve SelectLayerByLocation içinde döngü yapacaksınız.

PSU master programından bu eğiticiye göz atın - yanılmıyorsam tam olarak neyin peşinde olduğunuzu kapsar.

Geometriye atıfta bulunulmasına gerek yoktur; uzamsal sorgu, tanımladığınız sorgu türüne göre geometriyi kullanır (yani tamamen bir kenarlık içerir, vb.). Bu noktaların geometrisine başvurmanız gerekiyorsa, arabellek içinde oldukları belirlendikten sonra, bunları (OID) bir python listesine ekleyin ve nerede cümlesi kullanarak orijinal veri kümesiyle çalışın.


Sorunun çözümünü buldum. Ben class_layer atıfta dize yerine ilk argüman olarak bir feature_layer vermek zorunda kaldı.
user8175

1

Sorunun çözümünü buldum. Ben class_layer atıfta dize yerine ilk argüman olarak bir feature_layer sağlamak zorunda kaldı. "

    # 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)

3
PolyGeo'nun cevabının bunu kapsadığından eminim. Bir özellik sınıfı ile bir özellik katmanı arasındaki farkı not etmek için dikkatli olmalısınız .
blah238
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.