Estou tentando adicionar uma ferramenta a um toobar de suplemento para selecionar recursos de uma classe de recurso existente e copiá-los para outra classe de recurso. Preciso de duas ferramentas, uma para um ponto e outra para um retângulo. As ferramentas de suplemento lidam apenas com retângulos, então estou tentando gerar a coordenada do ponto fora do evento onMouseDown e simplesmente usar o feedback X e Y que recebo. O problema é que não consigo passar essas coordenadas para algo útil para extrair os recursos. Eu tentei usar extensões de ambiente e, em seguida, executar um CopyFeatures simples, mas isso não está funcionando, pois copia todo o fc e parece não respeitar as configurações de ambiente definidas.
Posso passar coordenadas para a ferramenta Selecionar por local de alguma forma ou existe outra maneira de passar coordenadas para algo a ser extraído nessa extensão?
Isto é o que eu tenho agora:
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)
fonte
fc
definido? Não está definido para nada além de uma sequência vazia neste código. Além disso, a entradaSelectLayerByLocation
deve ser uma referência a um objeto Camada ou o nome de uma camada de feição no documento de mapa atual.ELAtemplate
é uma string apontando para um shapefile.fc
é definido a partir de uma seleção de caixa de combinação. Então, eu fiz isso global.ELAtemplate
é um shapefile aqui, mas tentei executá-lo na janela do Python como uma camada, shapefile ou arrastada do sumário e nenhum deles funciona.pointGeom
: dearcpy.MakeFeatureLayer_management("nsw_map_units","unit_layer")
ondensw_map_units
vem o sumário. Eu então uso isso para executararcpy.SelectLayerByLocation_management('unit_layer',"INTERSECT",pointGeom,"#","ADD_TO_SELECTION")
, mas não tenho seleção. Eu até tentei criar fisicamente uma camada de pontos.pointGeom
que não cruze nadaunit_layer
. Talvez você precise apenas atualizar a exibição?Respostas:
Você provavelmente desejará usar, em
onMouseDownMap
vez deonMouseDown
retornar a localização nas coordenadas do mapa, não nas coordenadas da janela.Além disso, certifique-se de passar um
SpatialReference
objeto válido para oPointGeometry
construtor, caso contrário, provavelmente não funcionará. No exemplo abaixo, uso a referência espacial do quadro de dados ativo.Por fim, convém especificar um
search_distance
no seu,SelectLayerByLocation
para que os recursos de ponto e linha possam ser selecionados sem clicar exatamente neles. No ArcObjects, você normalmente usaria a tolerância de seleção do ArcMap em pixels e expandiria o envelope do seu ponto por esse valor nas coordenadas do mapa. Não consegui encontrar uma maneira de acessar a configuração de tolerância de seleção do ArcMap no arcpy, mas se você quiser usar o padrão de 3 pixels (ou passar por conta própria), poderá passar a saída da função nesta resposta como umsearch_distance
( em polegadas) para SelectLayerByLocation.fonte
Suponho que você esteja usando as técnicas descritas em Resposta a É possível obter as coordenadas de um ponto clicado pelo usuário em um MXD atual com o ArcGIS 10.0 ArcPy? hoje cedo ou algo semelhante.
Depois de criar sua geometria de ponto ou polígono (retângulo) usando algo como o código abaixo, você poderá usá-lo como recursos selecionados para Selecionar camada por local.
A partir daí, os Recursos de cópia devem obter os recursos que você procura.
fonte