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)
sumber
fc
diatur? Itu tidak diatur untuk apa pun kecuali string kosong dalam kode ini. Input jugaSelectLayerByLocation
harus menjadi referensi ke objek Layer atau nama layer fitur dalam dokumen peta saat ini.ELAtemplate
adalah string yang menunjuk ke shapefile.fc
diatur dari pilihan kotak kombo. Jadi saya membuatnya global.ELAtemplate
adalah shapefile di sini, tapi saya sudah mencoba menjalankan ini di jendela Python sebagai layer, shapefile atau diseret dari TOC dan tidak ada yang berfungsi.pointGeom
:arcpy.MakeFeatureLayer_management("nsw_map_units","unit_layer")
manansw_map_units
berasal dari TOC. Saya kemudian menggunakannya untuk menjalankanarcpy.SelectLayerByLocation_management('unit_layer',"INTERSECT",pointGeom,"#","ADD_TO_SELECTION")
, tetapi saya tidak punya pilihan. Saya bahkan sudah mencoba secara fisik membuat layer titik.pointGeom
tidak benar-benar memotong apa pun di dalamnyaunit_layer
. Mungkin Anda hanya perlu menyegarkan tampilan?Jawaban:
Anda mungkin ingin menggunakan
onMouseDownMap
daripadaonMouseDown
karena ini mengembalikan lokasi dalam koordinat peta, bukan koordinat jendela.Selain itu, pastikan untuk mengirimkan
SpatialReference
objek yang valid kePointGeometry
konstruktor, 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_distance
pada AndaSelectLayerByLocation
sehingga 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 sebagaisearch_distance
(( dalam inci) ke SelectLayerByLocation.sumber
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.
Dari sana Fitur Salin harus mendapatkan fitur yang Anda cari.
sumber