การเลือกรูปหลายเหลี่ยม ArcSDE ทีละจุดใน ArcGIS Desktop โดยใช้ ArcPy?


15

ฉันคิดอยู่เสมอว่าจะต้องมีบางอย่างหายไป แต่ดูเหมือนว่าจะไม่มีเครื่องมือใน ArcGIS 10 ที่จะเลือกคุณสมบัติ (โดยเฉพาะรูปหลายเหลี่ยม) จากเลเยอร์ที่ตำแหน่ง (X, Y) ผ่าน ArcPy พารามิเตอร์สำหรับเครื่องมือเช่นนี้จะเป็นชื่อเลเยอร์และตำแหน่ง XY เท่านั้น

ในขณะนี้ฉันแก้ไขปัญหานี้โดยการสร้างคุณลักษณะระดับจุดที่มีจุดและดำเนินการ SelectLayerByLocation บนมัน อย่างไรก็ตามเมื่อคลาสคุณลักษณะรูปหลายเหลี่ยมอยู่ใน Oracle (เข้าถึงผ่าน ArcSDE 9.x) และมี 3.5 ล้านรูปหลายเหลี่ยมเวลาที่ใช้ในการเลือกอาจมากกว่า 5 นาทีเมื่อฉันคิดว่าสองหรือสอง (ด้วยรหัสน้อยกว่า) จะเป็น เหมาะสมกว่า คลาสคุณลักษณะมีดัชนีเชิงพื้นที่และฉันได้ลองใช้ arcpy.env.extent (ซึ่ง SelectLayerByLocation ดูเหมือนจะไม่สนใจ) เพื่อ จำกัด การเข้าถึงพื้นที่ทางภูมิศาสตร์ แต่ประสิทธิภาพยังคงแย่มาก

มีวิธีที่รวดเร็วกว่าในการทำเช่นนี้โดยใช้ ArcGIS Desktop 10 และ ArcPy?


ขณะนี้มีวิธีแก้ไขปัญหานี้ที่ฟอรัม.arcgis.com/threads/…และฉันจะแก้ไขข้อมูลในที่นี้ในวันนี้ - ขอบคุณมากไปที่ Jason Scheirer และ Chris Snyder
PolyGeo

2
เช่นเดียวกับบันทึกนี้คุณสามารถค้นหาสภาพแวดล้อมที่ได้รับเกียรติจากเครื่องมือที่ด้านล่างของหน้าอ้างอิงของเครื่องมือ SelectByLocation เท่านั้นให้เกียรติพื้นที่ทำงานปัจจุบันและระบบพิกัดพิกัด help.arcgis.com/th/arcgisdesktop/10.0/help/index.html#//…
blord-castillo

คำตอบ:


9

อีกวิธีในการดำเนินการนี้คือการใช้เครื่องมือ Spatial Join ใช้จุดเป็นเลเยอร์คุณลักษณะการป้อนข้อมูลของคุณตามด้านบนและเลเยอร์รูปหลายเหลี่ยมเป็นคุณสมบัติตัวตนของคุณ
ซึ่งแตกต่างจาก SelectLayerByLocation, SpatialJoin ไม่เคารพสภาพแวดล้อมขอบเขต

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 อาจดูเหมือนเคาน์เตอร์ง่าย แต่เนื่องจากคุณมีเพียงหนึ่งคุณสมบัติการเข้าร่วมฟังก์ชั่นหลักของตัวเลือกนี้คือการปิดการรวมและกฎการรวม KEEP_COMMON จะตรวจสอบให้แน่ใจว่าผลลัพธ์ของคุณถูก จำกัด เฉพาะรูปหลายเหลี่ยมที่ตัดกันจุดของคุณ การแมปฟิลด์จะ จำกัด แอตทริบิวต์เอาท์พุทให้กับรูปร่างและคุณลักษณะของชั้นรูปหลายเหลี่ยมเท่านั้น ค่าเริ่มต้นจะรวมถึงคุณลักษณะของเลเยอร์ของจุดด้วย

ส่วนที่เหลือของค่าเริ่มต้นจะทำงานได้ดีดังนั้นคุณสามารถละทิ้งอาร์กิวเมนต์ที่เหลือได้


ขอบคุณมากสำหรับรหัสนี้ซึ่งมีเทคนิคสองสามอย่างที่ฉันไม่ได้ลอง ก่อนหน้านี้ฉันได้ลอง SpatialJoin (เพื่อที่ฉันจะได้รับสภาพแวดล้อมในการประมวลผลทางภูมิศาสตร์ที่เคารพ) แต่การทดสอบนั้นรวมถึงการทดสอบเทคนิคของคุณในตอนนี้ยังคงทิ้งฉันไว้กับเวลาตอบสนอง 4-5 นาทีเทียบกับ 10-12 วินาที Chris Snyder พาฉันไปที่
PolyGeo

คุณลองใช้เทคนิคของ Chris Snyder กับ SpatialJoin ด้วยหรือไม่ ฉันคิดว่าเหตุผลหลักที่เทคนิคบัฟเฟอร์เร็วมากคือมันใช้หน่วยความจำในคลาสโพลีกอน ฉันคิดว่าการเลือกตามสถานที่ควรเร็วกว่าการเข้าร่วมเชิงพื้นที่ แต่ฉันไม่แน่ใจ
blord-castillo

ลงเอยด้วยการไม่ใช้บิต in_memory มันเร่งความเร็วขึ้นมากจนฉันเก็บมันไว้เป็นสำรอง ฉันคิดว่าสิ่งสำคัญคือการกำหนดขอบเขตเพื่อรับรูปหลายเหลี่ยมหนึ่ง / สาม (จาก 3.5 ล้าน) ที่ฉันต้องการตรวจสอบ X, Y กับคัดลอกออกอย่างรวดเร็วลงในฐานข้อมูลไฟล์ทางภูมิศาสตร์ในท้องถิ่น ดังนั้นการทำส่วนนั้นก่อนที่ SpatialJoin ฉันจะคิดว่านำไปสู่การปรับปรุงประสิทธิภาพการทำงานเหมือนกัน / ที่คล้ายกัน
PolyGeo

1

ฉันเพิ่งรู้อะไรบางอย่าง ...

หากคุณกำลังใช้สิ่งนี้เพื่อดำเนินการบริการประมวลผลทางภูมิศาสตร์คุณสามารถใช้งานบริการคุณลักษณะด้วยรูปหลายเหลี่ยมเลเยอร์ของคุณแทนและใช้การดำเนินการค้นหาบนบริการคุณลักษณะ

คุณสามารถใช้ตำแหน่ง XY แบบง่าย ๆ ได้พร้อมกับการทำงานของ Service Service Query รวมถึงควบคุมแอตทริบิวต์เอาต์พุตรวมถึงรูปร่าง

คุณอาจมีข้อ จำกัด เกี่ยวกับจำนวนที่คุณสามารถเปิดเผยคลาสรูปหลายเหลี่ยมได้ แต่หากคุณสามารถเข้าถึงบริการการประมวลผลทางภูมิศาสตร์ได้แล้วคุณควรสร้างบริการคุณลักษณะได้เช่นกัน


นี่เป็นความคิดที่มีประโยชน์เพื่อตอบสนองความต้องการอื่น ๆ แต่ในกรณีนี้แอปพลิเคชันไคลเอนต์นั้นง่ายมากและอยู่นอกเหนือการควบคุมของฉันดังนั้นฉันจึงสามารถให้บริการการประมวลผลทางภูมิศาสตร์เท่านั้น
PolyGeo

ฉันคิดว่าอาจมีข้อ จำกัด ในการใช้สิ่งอื่นนอกเหนือจากบริการประมวลผล GeoProcessing :) โดยปกติแล้วฉันคิดว่า Feature Service เป็นเส้นทางที่ง่ายกว่ามากในการนำไปใช้และบำรุงรักษา นี่อาจอธิบายได้ว่าทำไมฟังก์ชั่นที่คุณต้องการไม่สามารถใช้ได้; คุณสามารถทำได้ในทุกระดับแอปพลิเคชัน ตรวจสอบให้แน่ใจว่าคุณส่งคำขอไปยัง ESRI เพื่อใช้เป็นเครื่องมือในเวอร์ชันถัดไป
blord-castillo

1

คำตอบนี้มาจากเก่าฟอรั่ม ArcGIS อภิปราย

ขอบคุณ Jason Scheirer สำหรับโค้ดที่กระชับกว่านี้:

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

และโดยเฉพาะ Chris Snyder สำหรับเคล็ดลับการแสดง:

การทำงานที่เร็วขึ้นอาจเป็นการบัฟเฟอร์จุดของคุณเล็กน้อยจากนั้นใช้ขอบเขตบัฟเฟอร์เป็นขอบเขตการวิเคราะห์เพื่อทำสำเนา in_memory (เครื่องมือ CopyFeatures) ของข้อมูล SDE ของคุณจากนั้นเลือก SelectByLocation บนชุดข้อมูล in_memory ที่มีขนาดเล็กและท้องถิ่น ด้วยวิธีการที่คุณจัดทำเครื่องมือ SelectByLocation ตามสภาพแวดล้อมขอบเขตการวิเคราะห์ซึ่งปกติแล้วจะไม่ทำ BTW: คุณสมบัติใด ๆ ที่ทับซ้อนกับขอบเขตการวิเคราะห์จะถูกคัดลอกด้วยเครื่องมือ CopyFeatures ฉันต้องการให้เครื่องมือ SelectByLocation และเมธอดเคอร์เซอร์ให้เกียรติขอบเขตการวิเคราะห์ ...

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