Ich versuche, einer Add-In-Symbolleiste ein Tool hinzuzufügen, um Features aus einer vorhandenen Feature-Class auszuwählen und in eine andere Feature-Class zu kopieren. Ich brauche zwei Werkzeuge, eines für einen Punkt und eines für ein Rechteck. Add-In-Tools verarbeiten nur Rechtecke. Daher versuche ich, die Punktkoordinate aus dem onMouseDown-Ereignis zu generieren und einfach das X- und Y-Feedback zu verwenden, das ich erhalte. Das Problem ist, dass ich diese Koordinaten scheinbar nicht an irgendetwas Nützliches übergeben kann, um die Features zu extrahieren. Ich habe versucht, Umgebungsbereiche zu verwenden und dann einfache CopyFeatures auszuführen, aber das funktioniert nicht, da es den gesamten fc kopiert und die von mir festgelegten Umgebungseinstellungen nicht zu berücksichtigen scheint.
Kann ich Koordinaten irgendwie an das Werkzeug Nach Standort auswählen übergeben, oder gibt es eine andere Möglichkeit, Koordinaten an etwas zu übergeben, das in diesem Umfang extrahiert werden kann?
Das habe ich jetzt:
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)
quelle
fc
eingestellt? In diesem Code ist nichts anderes als eine leere Zeichenfolge festgelegt. Außerdem muss die EingabeSelectLayerByLocation
ein Verweis auf ein Ebenenobjekt oder der Name eines Feature-Layers im aktuellen Kartendokument sein.ELAtemplate
ist eine Zeichenfolge, die auf ein Shapefile zeigt.fc
wird aus einer Kombinationsfeldauswahl festgelegt. Also habe ich das global gemacht.ELAtemplate
ist hier ein Shapefile, aber ich habe versucht, dies im Python-Fenster als Ebene, Shapefile oder aus dem Inhaltsverzeichnis gezogen auszuführen, und keines davon funktioniert.pointGeom
:arcpy.MakeFeatureLayer_management("nsw_map_units","unit_layer")
wonsw_map_units
aus dem TOC kommt. Ich benutze das dann, um zu laufenarcpy.SelectLayerByLocation_management('unit_layer',"INTERSECT",pointGeom,"#","ADD_TO_SELECTION")
, aber ich bekomme keine Auswahl. Ich habe sogar versucht, eine Punktebene physisch zu erstellen.pointGeom
sich nichts darin überschneidetunit_layer
. Vielleicht müssen Sie nur die Ansicht aktualisieren?Antworten:
Sie möchten wahrscheinlich
onMouseDownMap
eher verwenden, als dassonMouseDown
dies die Position in Kartenkoordinaten zurückgibt, nicht in Fensterkoordinaten.Stellen Sie außerdem sicher, dass Sie ein gültiges
SpatialReference
Objekt an denPointGeometry
Konstruktor übergeben, da es sonst höchstwahrscheinlich nicht funktioniert. Im folgenden Beispiel verwende ich den Raumbezug des aktiven Datenrahmens.Zuletzt möchten Sie möglicherweise ein
search_distance
auf Ihrem angeben,SelectLayerByLocation
damit Punkt- und Linien-Features ausgewählt werden können, ohne genau darauf zu klicken. In ArcObjects würden Sie normalerweise ArcMap die Verwendung Auswahl Toleranz in Pixel und Ihre Punkt des Umschlags um diesen Betrag in Kartenkoordinaten erweitern. Ich konnte in arcpy keine Möglichkeit finden, auf die Auswahltoleranzeinstellung von ArcMap zuzugreifen. Wenn Sie jedoch die Standardeinstellung von 3 Pixel verwenden möchten (oder Ihre eigenen übergeben möchten), können Sie die Ausgabe der Funktion in dieser Antwort alssearch_distance
(übergeben) in Zoll) zu SelectLayerByLocation.quelle
Ich gehe davon aus, dass Sie die in Antwort auf Beschriebenen Techniken verwenden. Ist es mit ArcGIS 10.0 ArcPy möglich, die Koordinaten eines vom Benutzer angeklickten Punkts in einer aktuellen MXD abzurufen? früher heute oder so ähnlich.
Sobald Sie in der Lage sind, Ihre Punkt- oder Polygongeometrie (Rechteck) mit dem folgenden Code zu erstellen, sollten Sie diese als select_features für Select Layer By Location verwenden können.
Von dort aus sollten Kopierfunktionen die Funktionen erhalten, nach denen Sie suchen.
quelle