ArcPy มีฟังก์ชันการค้นหาเชิงพื้นที่สำหรับรูปทรงเรขาคณิตหรือไม่


10

ปัญหาของฉัน: การใช้ ArcPy ฉันต้องการวนซ้ำบัฟเฟอร์และเลือก geometry_features ภายในแต่ละบัฟเฟอร์และทำบางสิ่ง (อัปเดต) เฉพาะวัตถุที่พบภายในบัฟเฟอร์นั้น รหัสด้านล่างอธิบายสิ่งที่ฉันต้องการทำ (มากหรือน้อย):

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)

อย่างไรก็ตาม: สิ่งนี้จะไม่ทำงานเนื่องจาก SelectLayerByLocation_management () ไม่ยอมรับรูปทรงเรขาคณิต "รูปร่าง" เป็นอาร์กิวเมนต์ แต่คาดว่าจะมี feature_class_name (ชื่อเลเยอร์) มีวิธี arcpy ที่สามารถทำการค้นหาโดยใช้คำกริยาเชิงพื้นที่ ฉันไม่พบวิธีการทำสิ่งนี้จากคู่มือ ESRI

คำตอบ:


13

ฉันมั่นใจว่าสามารถทำสิ่งนี้ได้เพราะเราใช้รหัสด้านล่างในหนึ่งในหลักสูตรการฝึกอบรมของเรา หากดูเหมือนว่าจะไม่สามารถใช้งานได้ฉันสงสัยว่าคุณไม่ได้กำหนดวัตถุเลเยอร์โดยใช้เลเยอร์ในสารบัญของ ArcMap หรือโดยใช้ MakeFeatureLayer นอก ArcMap

หรือมีโอกาสมากขึ้นที่ฉันคิดว่าเป็น "การเชื่อมต่อ =" ถัดจาก SelectLayerByLocation ที่ทำให้คุณมีปัญหาเพราะคุณตั้งค่าเป็นวัตถุผลลัพธ์และไม่ดึงข้อมูลใด ๆ

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

สิ่งนี้สามารถทำได้ แต่เท่าที่ฉันรู้เพียงผ่านการใช้คุณสมบัติเลเยอร์ w / arcpy โดยพื้นฐานแล้วคุณจะต้องสร้างส่วนคำสั่งย่อยและอัพเดตด้วย OID (หรือฟิลด์ที่ระบุเฉพาะอื่น ๆ ) และวนซ้ำผ่าน SelectLayerByLocation

ลองดูบทช่วยสอนนี้จากโปรแกรมของอาจารย์ PSU - มันครอบคลุมถึงสิ่งที่คุณหลังจากนั้นถ้าฉันไม่เข้าใจผิด

ไม่จำเป็นต้องอ้างอิงถึงเรขาคณิต แบบสอบถามเชิงพื้นที่ใช้รูปทรงเรขาคณิตโดยขึ้นอยู่กับประเภทของแบบสอบถามที่คุณกำหนด (เช่นมีทั้งหมดแบ่งปันเส้นขอบ ฯลฯ ) หากคุณต้องการอ้างอิงรูปทรงเรขาคณิตของจุดเหล่านี้เมื่อพวกมันถูกกำหนดให้อยู่ในบัฟเฟอร์ต่อท้ายพวกเขา (OID) ไปยังรายการหลามและทำงานกับชุดข้อมูลดั้งเดิมโดยใช้ส่วนคำสั่ง where


ฉันพบวิธีแก้ไขปัญหาแล้ว ฉันต้องให้ feature_layer เป็นอาร์กิวเมนต์แรกแทนที่จะเป็นสตริงที่อ้างอิง class_layer
user8175

1

ฉันพบวิธีแก้ไขปัญหาแล้ว ฉันต้องจัดเตรียม feature_layer เป็นอาร์กิวเมนต์แรกแทนที่จะเป็นสตริงที่อ้างอิง 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)

3
ฉันค่อนข้างมั่นใจว่าคำตอบของ PolyGeo ครอบคลุมเรื่องนี้ คุณควรจะระมัดระวังที่จะต้องทราบความแตกต่างระหว่างระดับคุณลักษณะและชั้นคุณลักษณะ
blah238
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.