Chọn đa giác ArcSDE theo điểm trong ArcGIS Desktop bằng ArcPy?


15

Tôi cứ nghĩ rằng mình phải thiếu thứ gì đó, nhưng dường như không có công cụ nào trong ArcGIS 10 để chọn các tính năng (đặc biệt là đa giác) từ một lớp tại một vị trí (X, Y) thông qua ArcPy. Các tham số cho một công cụ như vậy sẽ chỉ là một tên lớp và một vị trí XY.

Tại thời điểm này, tôi đã khắc phục điều này bằng cách tạo một điểm kỳ công có chứa điểm và thực hiện ChọnLayerByLocation trên đó. Tuy nhiên, khi lớp tính năng đa giác nằm trong Oracle (được truy cập qua ArcSDE 9.x) và chứa 3,5 triệu đa giác, thời gian thực hiện lựa chọn có thể kéo dài hơn 5 phút khi tôi nghĩ rằng một hoặc hai giây (với ít mã hơn) sẽ là thích hợp hơn Lớp tính năng có chỉ mục không gian và tôi đã thử sử dụng arcpy.env.extent (mà ChọnLayerByLocation dường như bỏ qua) để hạn chế khu vực địa lý được truy cập nhưng hiệu suất vẫn rất kém.

Có cách nào nhanh hơn để làm điều này bằng ArcGIS Desktop 10 và ArcPy không?


Bây giờ có một giải pháp cho qua này tại forums.arcgis.com/threads/... và tôi sẽ chỉnh sửa thông tin đó vào đây sau ngày hôm nay - cảm ơn rất nhiều đến Jason Scheirer và Chris Snyder
PolyGeo

2
Cũng như một lưu ý cho điều này, bạn có thể tìm thấy các môi trường được vinh danh bởi một công cụ ở cuối trang tham khảo của công cụ. ChọnByLocation chỉ tôn vinh Hệ thống tọa độ đầu ra và không gian làm việc hiện tại. help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#// Đổi
blord-castillo

Câu trả lời:


9

Một cách tiếp cận khác là sử dụng công cụ Spatial Join. Sử dụng điểm làm lớp tính năng đầu vào của bạn như trên và lớp đa giác làm đặc điểm nhận dạng của bạn.
Không giống như SelectLayerByLocation, SpatialJoin không tôn trọng môi trường ở mức độ.

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)

THAM GIA KEEP_COMMON sẽ đảm bảo rằng đầu ra của bạn chỉ bị giới hạn ở đa giác giao nhau với điểm của bạn. Fieldmappings sẽ giới hạn các thuộc tính đầu ra thành hình dạng và thuộc tính của lớp đa giác; mặc định sẽ bao gồm các thuộc tính của lớp điểm.

Phần còn lại của các mặc định sẽ hoạt động tốt, vì vậy bạn có thể bỏ qua các đối số còn lại.


Rất cám ơn mã này chứa một vài kỹ thuật mà tôi đã không thử. Trước đây tôi đã thử SpatialJoin (để tôi có thể có môi trường xử lý địa lý được tôn trọng) nhưng thử nghiệm đó, cũng như thử nghiệm kỹ thuật của bạn vừa rồi, vẫn để lại cho tôi thời gian phản hồi 4-5 phút so với 10-12 giây Chris Snyder dẫn tôi đến.
PolyGeo

Bạn đã thử kỹ thuật của Chris Snyder với SpatialJoin chưa? Tôi nghĩ lý do chính khiến kỹ thuật đệm quá nhanh là vì nó sử dụng một bản sao trong bộ nhớ của lớp đa giác. Tôi nghĩ rằng lựa chọn theo địa điểm sẽ nhanh hơn tham gia không gian, nhưng tôi không chắc chắn.
blord-castillo

Đã kết thúc không sử dụng bit in_memory. Nó đã được tăng tốc đến mức tôi giữ nó trong dự trữ. Tôi nghĩ rằng điều quan trọng là thiết lập mức độ để có được một / vài đa giác (từ 3,5 triệu), mà tôi cần kiểm tra X, Y, nhanh chóng sao chép vào cơ sở dữ liệu địa lý tệp cục bộ. Vì vậy, làm phần đó trước SpatialJoin tôi nghĩ sẽ dẫn đến sự cải thiện hiệu suất tương tự / tương tự.
PolyGeo

1

Tôi mới nhận ra điều gì đó ...

Nếu bạn đang sử dụng điều này để triển khai Dịch vụ xử lý địa lý, bạn cũng có thể triển khai Dịch vụ tính năng với lớp đa giác của mình và sử dụng thao tác Truy vấn trên dịch vụ tính năng.

Bạn có thể sử dụng một vị trí XY đơn giản với thao tác Truy vấn Dịch vụ Tính năng, cũng như kiểm soát các thuộc tính đầu ra bao gồm cả hình dạng.

Bạn có thể có các hạn chế về số lượng bạn có thể hiển thị lớp tính năng đa giác, nhưng nếu bạn đã làm cho nó có thể truy cập được vào dịch vụ xử lý địa lý, thì bạn cũng có thể xây dựng Dịch vụ Tính năng.


Đây là một suy nghĩ hữu ích để đáp ứng các yêu cầu khác, nhưng trong trường hợp này, ứng dụng khách rất đơn giản và nằm ngoài tầm kiểm soát của tôi, vì vậy tôi chỉ có thể cung cấp Dịch vụ xử lý địa lý.
PolyGeo

Tôi cho rằng có thể có một hạn chế trong việc sử dụng bất cứ thứ gì ngoài Dịch vụ xử lý địa lý :) Trớ trêu thay, tôi nghĩ rằng Dịch vụ tính năng là một cách đơn giản hơn nhiều để thực hiện và duy trì. Điều này cũng có thể giải thích tại sao chức năng bạn muốn không có sẵn; bạn đã có thể làm điều đó ở mọi cấp độ ứng dụng. Đảm bảo rằng bạn gửi yêu cầu tới ESRI để triển khai nó như một công cụ trong phiên bản tiếp theo.
blord-castillo

1

Câu trả lời này đến từ Diễn đàn thảo luận ArcGIS cũ .

Cảm ơn Jason Scheirer cho một số mã ngắn gọn hơn:

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

Và đặc biệt là Chris Snyder cho một mẹo hiệu suất:

Công việc nhanh hơn có thể là đệm điểm của bạn một chút và sau đó sử dụng phạm vi bộ đệm làm phạm vi phân tích để tạo một bản sao in_memory (công cụ CopyFeatures) của dữ liệu SDE của bạn, sau đó thực hiện ChọnByLocation trên tập dữ liệu in_memory nhỏ hơn và cục bộ. Theo cách đó, bạn đang tạo ra công cụ SelectByLocation tôn vinh môi trường phạm vi phân tích, điều mà thông thường nó sẽ không làm. BTW: Bất kỳ tính năng nào trùng lặp với phạm vi phân tích sẽ được sao chép bằng công cụ CopyFeatures. Tôi chắc chắn mong muốn công cụ SelectByLocation và các phương pháp con trỏ tôn vinh phạm vi phân tích ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.