Estoy tratando de agregar una herramienta a una barra de complementos para seleccionar entidades de una clase de entidad existente y copiarlas en otra clase de entidad. Necesito dos herramientas, una para un punto y otra para un rectángulo. Las herramientas de complemento solo manejan rectángulos, por lo que estoy tratando de generar la coordenada de punto del evento onMouseDown y simplemente uso los comentarios X e Y que obtengo. El problema es que parece que no puedo pasar estas coordenadas a nada útil para extraer las características. Intenté usar extensiones de entorno y luego hacer un simple CopyFeatures, pero eso no funciona, ya que copia todo el fc y no parece respetar la configuración del entorno que configuré.
¿Puedo pasar las coordenadas a la herramienta Seleccionar por ubicación de alguna manera o hay otra forma de pasar las coordenadas a algo para extraer en esa medida?
Esto es lo que tengo ahora:
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)
fuente
fc
establece? No se establece en nada más que una cadena vacía en este código. Además, la entradaSelectLayerByLocation
debe ser una referencia a un objeto de Capa o el nombre de una capa de entidades en el documento de mapa actual.ELAtemplate
es una cadena que apunta a un archivo de forma.fc
se establece desde una selección de cuadro combinado. Así que lo hice global.ELAtemplate
es un archivo de forma aquí, pero he intentado ejecutar esto en la ventana de Python como una capa, un archivo de forma o arrastrado desde el TOC y ninguno de ellos funciona.pointGeom
: dearcpy.MakeFeatureLayer_management("nsw_map_units","unit_layer")
dóndensw_map_units
viene el TOC. Luego lo uso para correrarcpy.SelectLayerByLocation_management('unit_layer',"INTERSECT",pointGeom,"#","ADD_TO_SELECTION")
, pero no obtengo ninguna selección. Incluso he intentado crear físicamente una capa de puntos.pointGeom
que en realidad no se cruzara con nadaunit_layer
. ¿Quizás solo necesita actualizar la vista?Respuestas:
Probablemente desee usar en
onMouseDownMap
lugar de hacerlo,onMouseDown
ya que esto devuelve la ubicación en las coordenadas del mapa, no en las coordenadas de la ventana.Además, asegúrese de pasar un
SpatialReference
objeto válido alPointGeometry
constructor, de lo contrario, lo más probable es que no funcione. En el siguiente ejemplo, uso la referencia espacial del marco de datos activo.Por último, es posible que desee especificar un
search_distance
en suSelectLayerByLocation
para que las características de punto y línea se puedan seleccionar sin hacer clic en ellas exactamente. En ArcObjects, normalmente usaría la tolerancia de selección de ArcMap en píxeles y expandiría el sobre de su punto en esa cantidad en las coordenadas del mapa. No pude encontrar una manera de acceder a la configuración de tolerancia de selección de ArcMap en arcpy, pero si desea ir con el valor predeterminado de 3 píxeles (o pasar el suyo), puede pasar la salida de la función en esta respuesta como unsearch_distance
( en pulgadas) a SelectLayerByLocation.fuente
Supongo que está utilizando las técnicas descritas en la Respuesta a ¿Es posible obtener las coordenadas de un punto de clic del usuario en un MXD actual con ArcGIS 10.0 ArcPy? hoy temprano o algo similar.
Una vez que pueda crear su geometría de punto o polígono (rectángulo) usando algo como el código a continuación, debería poder usarlo como su select_features para Seleccionar capa por ubicación.
A partir de ahí, Copy Features debería obtener las características que busca.
fuente