Pilih dan salin fitur di ArcMap menggunakan alat tambahan Python

8

Saya mencoba menambahkan alat ke toobar add-in untuk memilih fitur dari kelas fitur yang ada dan menyalinnya ke kelas fitur lain. Saya membutuhkan dua alat, satu untuk satu titik dan satu untuk persegi panjang. Alat tambahan hanya menangani persegi panjang, jadi saya mencoba membuat titik koordinat dari acara onMouseDown dan cukup menggunakan umpan balik X dan Y yang saya dapatkan. Masalahnya adalah saya sepertinya tidak bisa meneruskan koordinat ini ke sesuatu yang berguna untuk mengekstrak fitur. Saya sudah mencoba menggunakan Extents Environment dan kemudian melakukan CopyFeatures sederhana, tapi itu tidak berfungsi karena menyalin seluruh fc dan sepertinya tidak menghormati pengaturan lingkungan yang saya atur.

Dapatkah saya meneruskan koordinat ke alat Pilih oleh Lokasi entah bagaimana atau ada cara lain untuk melewatkan koordinat ke sesuatu untuk diekstraksi sejauh itu?

Inilah yang saya miliki sekarang:

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)
MierMoto
sumber
1
Poskan kode lengkap, bukan hanya cuplikan. Juga untuk dengan mudah memformat kode dengan benar, pilih di editor badan pertanyaan dan tekan Ctrl-K.
blah238
Di mana fcdiatur? Itu tidak diatur untuk apa pun kecuali string kosong dalam kode ini. Input juga SelectLayerByLocationharus menjadi referensi ke objek Layer atau nama layer fitur dalam dokumen peta saat ini. ELAtemplateadalah string yang menunjuk ke shapefile.
blah238
1
fcdiatur dari pilihan kotak kombo. Jadi saya membuatnya global. ELAtemplateadalah shapefile di sini, tapi saya sudah mencoba menjalankan ini di jendela Python sebagai layer, shapefile atau diseret dari TOC dan tidak ada yang berfungsi.
MierMoto
Di jendela Python (ArcMap) saya telah menggunakan yang berikut, setelah membuat geometri di pointGeom: arcpy.MakeFeatureLayer_management("nsw_map_units","unit_layer")mana nsw_map_unitsberasal dari TOC. Saya kemudian menggunakannya untuk menjalankan arcpy.SelectLayerByLocation_management('unit_layer',"INTERSECT",pointGeom,"#","ADD_TO_SELECTION"), tetapi saya tidak punya pilihan. Saya bahkan sudah mencoba secara fisik membuat layer titik.
MierMoto
Saya tidak tahu mengapa itu tidak berhasil kecuali pointGeomtidak benar-benar memotong apa pun di dalamnya unit_layer. Mungkin Anda hanya perlu menyegarkan tampilan?
blah238

Jawaban:

4

Anda mungkin ingin menggunakan onMouseDownMapdaripada onMouseDownkarena ini mengembalikan lokasi dalam koordinat peta, bukan koordinat jendela.

Selain itu, pastikan untuk mengirimkan SpatialReferenceobjek yang valid ke PointGeometrykonstruktor, jika tidak maka kemungkinan besar tidak akan berfungsi. Dalam contoh di bawah ini saya menggunakan referensi spasial dari kerangka data aktif.

Terakhir Anda mungkin ingin menentukan search_distancepada Anda SelectLayerByLocationsehingga titik dan garis fitur dapat dipilih tanpa mengklik pada mereka persis. Di ArcObjects Anda biasanya akan menggunakan toleransi seleksi ArcMap dalam piksel dan memperluas amplop poin Anda dengan jumlah itu dalam koordinat peta. Saya tidak dapat menemukan cara untuk mengakses pengaturan toleransi pemilihan ArcMap di arcpy, tetapi jika Anda ingin menggunakan default 3 piksel (atau meneruskannya sendiri), Anda dapat meneruskan output fungsi dalam jawaban ini sebagai search_distance(( dalam inci) ke SelectLayerByLocation.

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()
blah238
sumber
Saya telah mengajukan pertanyaan tentang masalah toleransi seleksi yang saya temui ketika merumuskan jawaban ini, mudah-mudahan ini adalah sesuatu yang dapat dilakukan tanpa ArcObjects tetapi saya ragu: Bagaimana cara buffer poin dalam Add-In Python oleh toleransi seleksi ArcMap?
blah238
Menambahkan solusi parsial untuk masalah toleransi seleksi.
blah238
Ceria blah238 untuk bantuannya. Saya pikir saya hampir sampai. Saya tidak berpikir tentang membuat geometri. Saya harus mengakui, saya masih masuk dalam modul pemetaan karena saya telah bekerja dengan 9.3.1 sampai sekarang. Saya sudah mengerti semuanya, kecuali untuk SelectByLocation. Hanya saja tidak memilih dan saya pikir itu kode yang menyebabkan add-in saya tidak menampilkan ikonnya (menunjukkan kode yang salah). Saya tidak menggunakan jarak pencarian, karena ini merupakan persimpangan. Saya ingin tahu mengapa Anda menggunakan bantuan pencarian. Saya menggunakan arcpy.SelectLayerByLocation_management ("unit_layer", "INTERSECT", pointGeom ,, "ADD_TO_SELECTION")
MierMoto
Ini yang saya gunakan untuk pilih: ("unit_layer", "INTERSECT", pointGeom, "", "ADD_‌ TO_SELECTION") Tidak yakin mengapa tidak memilih apa pun. Saya memeriksa properti objek titik untuk memastikannya mendapatkan koordinat yang tepat dan referensi spasial dan input pertama adalah lapisan fitur.
MierMoto
Jangan gunakan komentar untuk mengirim kode. Edit pertanyaan Anda untuk memasukkan kode Anda saat ini.
blah238
1

Saya berasumsi bahwa Anda menggunakan teknik yang dijelaskan dalam Jawaban untuk Apakah mungkin untuk mendapatkan koordinat titik diklik pengguna dalam MXD saat ini dengan ArcGIS 10.0 ArcPy? sebelumnya hari ini atau yang serupa.

Setelah Anda dapat membuat geometri titik atau poligon (persegi panjang) menggunakan sesuatu seperti kode di bawah ini, Anda harus dapat menggunakannya sebagai select_features untuk Select Layer By Location.

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

Dari sana Fitur Salin harus mendapatkan fitur yang Anda cari.

PolyGeo
sumber
Ceria @PolyGeo Itulah yang saya tidak pikirkan dan berhasil, tapi sekarang skripnya gagal dalam pemilihan. Saya telah menggunakan layer baik dari TOC atau sebagai layer fitur, tetapi tidak berhasil. Saya menggunakan INTERSECT dengan "#" sebagai jarak pencarian dan ADD_TO_SELECTION. Hanya saja tidak memilih apa pun. Saya menjalankannya dari jendela Python tanpa sukacita, tetapi berfungsi dari Toolbox.
MierMoto