Chọn và sao chép các tính năng trong ArcMap bằng công cụ bổ trợ Python


8

Tôi đang cố gắng thêm một công cụ vào một toobar bổ trợ để chọn các tính năng từ một lớp tính năng hiện có và sao chép chúng sang một lớp tính năng khác. Tôi cần hai công cụ, một cho một điểm và một cho một hình chữ nhật. Các công cụ bổ trợ chỉ xử lý các hình chữ nhật, vì vậy tôi đang cố gắng tạo tọa độ điểm khỏi sự kiện onMouseDown và chỉ cần sử dụng phản hồi X và Y tôi nhận được. Vấn đề là dường như tôi không thể chuyển các tọa độ này cho bất kỳ thứ gì hữu ích để trích xuất các tính năng. Tôi đã thử sử dụng các phạm vi Môi trường và sau đó thực hiện một CopyFeatures đơn giản, nhưng nó không hoạt động vì nó sao chép toàn bộ fc và dường như không tôn trọng các cài đặt môi trường tôi đã đặt.

Tôi có thể chuyển tọa độ cho công cụ Chọn theo Vị trí bằng cách nào đó hoặc có cách nào khác để chuyển tọa độ sang thứ gì đó để trích xuất theo phạm vi đó không?

Đây là những gì tôi có bây giờ:

import arcpy
import pythonaddins
arcpy.overWriteOutput = True

# Replace this with the SDE layer once it's available.
global ELAtemplate, fc
ELAtemplate = r'C:\Data\nsw_map_units.shp'
fc = ""

class DefineUnitsbyPoint(object):
    """Implementation for DefineUnitsbyPoint.tool (Tool)"""
    def __init__(self):
        self.enabled = True
        self.shape = "Rectangle" # Use onMouseDown to get initial extent of the rectangle.
    def onMouseDownMap(self, x, y, button, shift):
        # fc can be assigned from a combo box selection in another class
        global ELAtemplate, fc
        if fc == "":
            pythonaddins.MessageBox('Choose a layer to select from.', 'Choose a Layer', 0)
        else:
            mxd = arcpy.mapping.MapDocument("CURRENT")
            pointGeom = arcpy.PointGeometry(arcpy.Point(x,y), mxd.activeDataFrame.spatialReference)
            arcpy.SelectLayerByLocation_management(ELAtemplate, "INTERSECT", pointGeom, "", "ADD_TO_SELECTION")
            arcpy.CopyFeatures(ELAtemplate, fc)

1
Đăng mã hoàn chỉnh, không chỉ là một đoạn. Ngoài ra để dễ dàng định dạng mã chính xác, hãy chọn nó trong trình chỉnh sửa nội dung câu hỏi và nhấn Ctrl-K.
blah238

Đặt ở đâu fc? Nó không được đặt thành bất cứ thứ gì ngoại trừ một chuỗi trống trong mã này. Ngoài ra, đầu vào SelectLayerByLocationphải là một tham chiếu đến một đối tượng Lớp hoặc tên của một lớp đối tượng trong tài liệu bản đồ hiện tại. ELAtemplatelà một chuỗi chỉ vào một shapefile.
blah238

1
fcđược thiết lập từ một lựa chọn hộp tổ hợp. Vì vậy, tôi đã làm cho toàn cầu. ELAtemplatelà một shapefile ở đây, nhưng tôi đã thử chạy nó trong cửa sổ Python dưới dạng một lớp, shapefile hoặc được kéo từ TOC và không ai trong số chúng hoạt động.
MierMoto

Trong cửa sổ Python (ArcMap) Tôi đã sử dụng sau đây, sau khi tạo hình học trong pointGeom: arcpy.MakeFeatureLayer_management("nsw_map_units","unit_layer")nơi nsw_map_unitsxuất phát từ TOC. Sau đó tôi sử dụng nó để chạy arcpy.SelectLayerByLocation_management('unit_layer',"INTERSECT",pointGeom,"#","ADD_TO_SELECTION"), nhưng tôi không có lựa chọn nào. Tôi thậm chí đã cố gắng tạo ra một lớp điểm.
MierMoto

Tôi không biết tại sao nó không hoạt động trừ khi pointGeomkhông thực sự giao nhau unit_layer. Có lẽ bạn chỉ cần làm mới quan điểm?
blah238

Câu trả lời:


4

Bạn có thể sẽ muốn sử dụng onMouseDownMaphơn onMouseDownlà vì điều này trả về vị trí trong tọa độ bản đồ, không phải tọa độ cửa sổ.

Ngoài ra, hãy chắc chắn chuyển một SpatialReferenceđối tượng hợp lệ cho hàm PointGeometrytạo, nếu không nó rất có thể sẽ không hoạt động. Trong ví dụ dưới đây tôi sử dụng tham chiếu không gian của khung dữ liệu hoạt động.

Cuối cùng, bạn có thể muốn chỉ định một search_distancetrên SelectLayerByLocationđể có thể chọn các tính năng điểm và đường mà không cần nhấp vào chúng chính xác. Trong ArcObjects, thông thường bạn sẽ sử dụng dung sai lựa chọn của ArcMap bằng pixel và mở rộng đường bao điểm của bạn theo số lượng đó trong tọa độ bản đồ. Tôi không thể tìm cách truy cập cài đặt dung sai lựa chọn của ArcMap trong Arcpy, nhưng nếu bạn muốn đi với mặc định là 3 pixel (hoặc tự truyền), bạn có thể chuyển đầu ra của hàm trong câu trả lời này dưới dạng search_distance( tính bằng inch) để ChọnLayerByLocation.

def onMouseDownMap(self, x, y, button, shift):
    mxd = arcpy.mapping.MapDocument("CURRENT")
    pointGeom = arcpy.PointGeometry(arcpy.Point(x, y), mxd.activeDataFrame.spatialReference)
    searchdistance = getSearchDistanceInches(mxd.activeDataFrame.scale)
    lyr = arcpy.mapping.ListLayers(mxd)[0] # assumes you want to select features from 1st layer in TOC
    arcpy.SelectLayerByLocation_management(lyr, "INTERSECT", pointGeom, "%d INCHES" % searchdistance)
    arcpy.RefreshActiveView()

Tôi đã hỏi một câu hỏi về vấn đề dung sai lựa chọn mà tôi gặp phải trong khi đưa ra câu trả lời này, hy vọng đây là điều có thể được thực hiện mà không có ArcObjects nhưng tôi có nghi ngờ: Làm thế nào để đệm một điểm trong dung sai lựa chọn bổ trợ Python của ArcMap?
blah238

Đã thêm một giải pháp cho vấn đề dung sai lựa chọn.
blah238

Chúc mừng blah238 vì sự giúp đỡ. Tôi nghĩ rằng tôi gần như ở đó. Tôi đã không nghĩ về việc tạo ra hình học. Tôi phải thừa nhận, tôi vẫn tham gia vào mô-đun ánh xạ vì tôi đã làm việc với 9.3.1 cho đến bây giờ. Tôi đã có tất cả, ngoại trừ ChọnByLocation. Nó chỉ không chọn và tôi nghĩ đó là mã khiến bổ trợ của tôi không hiển thị các biểu tượng của nó (biểu thị mã không chính xác). Tôi không sử dụng khoảng cách tìm kiếm, vì đó là một giao điểm. Tôi tò mò muốn biết lý do tại sao bạn sử dụng tìm kiếm. Tôi đang sử dụng arcpy.SelectLayerByLocation_man Quản lý ("unit_layer", "INTERSECT", pointGeom ,, "ADD_TO_SELMENT")
MierMoto

Đây là những gì tôi đang sử dụng cho lựa chọn: ("unit_layer", "INTERSECT", pointGeom, "", "ADD_‌ TO_SELMENT") Không chắc tại sao nó không chọn bất cứ thứ gì. Tôi đã kiểm tra các thuộc tính của đối tượng điểm để đảm bảo nó có tọa độ corect và tham chiếu không gian và đầu vào đầu tiên là một lớp đối tượng.
MierMoto

Không sử dụng ý kiến ​​để gửi mã. Chỉnh sửa câu hỏi của bạn để bao gồm mã hiện tại của bạn.
blah238

1

Tôi giả sử rằng bạn đang sử dụng các kỹ thuật được mô tả trong Trả lời Có thể lấy tọa độ của điểm người dùng đã nhấp trong MXD hiện tại với ArcGIS 10.0 ArcPy không? sớm hơn hôm nay hoặc một cái gì đó tương tự.

Khi bạn có thể tạo hình học điểm hoặc đa giác (hình chữ nhật) của mình bằng cách sử dụng một cái gì đó giống như mã bên dưới, bạn sẽ có thể sử dụng nó làm select_features cho Chọn lớp theo vị trí.

pt=arcpy.PointGeometry(arcpy.Point(x,y))

Từ đó Sao chép các tính năng sẽ có được các tính năng bạn đang theo đuổi.


Chúc mừng @PolyGeo Đó là điều tôi không nghĩ tới và nó đang hoạt động, nhưng bây giờ kịch bản thất bại trong việc lựa chọn. Tôi đã sử dụng lớp này từ TOC hoặc là một lớp tính năng, nhưng không có may mắn. Tôi đang sử dụng INTERSECT với "#" làm khoảng cách tìm kiếm và ADD_TO_SELMENT. Nó chỉ không chọn bất cứ điều gì. Tôi đang chạy nó ra khỏi cửa sổ Python không có niềm vui, nhưng nó hoạt động từ Hộp công cụ.
MierMoto
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.