Pythonアドインツールを使用してArcMapでフィーチャを選択してコピーする


8

アドインのツールバーにツールを追加して、既存のフィーチャクラスからフィーチャを選択し、それらを別のフィーチャクラスにコピーしようとしています。ポイント用と長方形用の2つのツールが必要です。アドインツールは四角形のみを処理するため、onMouseDownイベントからポイント座標を生成し、取得したXおよびYフィードバックを使用しようとしています。問題は、これらの座標を機能の抽出に役立つものに渡すことができないように見えることです。環境エクステントを使用してから単純なCopyFeaturesを実行しようとしましたが、fc全体をコピーし、設定した環境設定を反映していないため、機能しません。

位置選択ツールに何らかの方法で座標を渡すことはできますか、またはその範囲で抽出するために座標を何かに渡す別の方法はありますか?

これは私が今持っているものです:

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)

1
スニペットだけでなく、完全なコードを投稿してください。また、コードを簡単に正しくフォーマットするには、質問の本文エディターでコードを選択し、Ctrl-Kを押します。
blah238 2013

どこにfc設定されていますか?このコードでは、空の文字列以外は何も設定されていません。また、への入力はSelectLayerByLocation、レイヤーオブジェクトへの参照または現在のマップドキュメントのフィーチャレイヤーの名前である必要があります。ELAtemplateシェープファイルを指す文字列です。
blah238 2013

1
fcコンボボックスの選択から設定されます。だから私はそれをグローバルにしました。 ELAtemplateここではシェープファイルですが、これをPythonウィンドウでレイヤー、シェープファイルとして実行するか、目次からドラッグしてみましたが、どれも機能しません。
MierMoto 2013

Pythonウィンドウで(ArcMapは)私は、ジオメトリを作成した後、以下を使用しましたpointGeomarcpy.MakeFeatureLayer_management("nsw_map_units","unit_layer")どこnsw_map_unitsTOCから来ています。その後、それを使用してを実行しますがarcpy.SelectLayerByLocation_management('unit_layer',"INTERSECT",pointGeom,"#","ADD_TO_SELECTION")、何も選択されません。物理的にポイントレイヤーを作成することも試みました。
MierMoto 2013

pointGeom実際に交差しない限り、それが機能しない理由はわかりませんunit_layer。おそらく、ビューを更新するだけですか?
blah238 2013

回答:


4

これは、ウィンドウ座標ではなくマップ座標で位置を返すonMouseDownMapのでonMouseDown、おそらく使用したいでしょう。

さらに、有効なSpatialReferenceオブジェクトをPointGeometryコンストラクターに渡してください。そうしないと、ほとんどの場合機能しません。以下の例では、アクティブなデータフレームの空間参照を使用しています。

最後にを指定しsearch_distanceて、SelectLayerByLocationポイントフィーチャとラインフィーチャを正確にクリックしなくても選択できるようにすることができます。ArcObjectsでは通常、ピクセル単位のArcMapの選択許容値を使用し、マップ座標でその量だけポイントのエンベロープを拡張します。私はarcpyでアクセスのArcMapの選択の許容範囲の設定への道を見つけることができませんでしたが、あなたは3つのピクセルのデフォルトで行く(あるいは自分自身で渡す)したい場合、あなたは、関数の出力を渡すことができ、この答えとしてsearch_distance(インチ単位)から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()

この回答の作成中に遭遇した選択許容値の問題について質問しました。うまくいけば、これはArcObjectsなしで実行できることですが、疑問があります。ArcMapの選択許容値によってPythonアドインのポイントをバッファする方法は?
blah238 2013

選択の許容範囲の問題に部分的な解決策を追加しました。
blah238 2013

どうぞよろしくお願いいたします。もうすぐだと思います。ジオメトリの作成については考えていませんでした。認めざるを得ません。今まで9.3.1で作業してきたので、まだマッピングモジュールに入っています。SelectByLocationを除いて、すべてを理解できました。それは選択しないだけで、私のアドインがアイコンを表示しない原因となっているコードだと思います(正しくないコードを示します)。交差なので、検索距離を使用していません。なぜ検索距離を使用したのか知りたいです。私はarcpy.SelectLayerByLocation_management( "unit_layer"、 "INTERSECT"、pointGeom ,, "ADD_TO_SELECTION")を使用しています
MierMoto

これは私が選択に使用しているものです:( "unit_layer"、 "INTERSECT"、pointGeom、 ""、 "ADD_‌ TO_SELECTION")何も選択していない理由がわかりません。ポイントオブジェクトのプロパティをチェックして、正しい座標と空間参照があり、最初の入力がフィーチャレイヤーであることを確認しました。
MierMoto 2013

コードを投稿するためにコメントを使用しないでください。質問を編集して、現在のコードを含めます。
blah238 2013

1

ArcGIS 10.0 ArcPyを使用して、現在のMXDでユーザーがクリックしたポイントの座標を取得することはできますか?で説明されている手法を使用していることを前提としています今日の初めか、似たようなもの。

以下のコードのようなものを使用してポイントまたはポリゴン(長方形)ジオメトリを作成できたら、それをSelect Layer By Locationのselect_featuresとして使用できるはずです。

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

そこからコピー機能はあなたが求めている機能を取得するはずです。


乾杯@PolyGeoそれは私が考えていなかった少しのことであり、それは機能していますが、スクリプトは選択で失敗しています。TOCから、またはフィーチャレイヤーとしてレイヤーを使用しましたが、うまくいきませんでした。「#」を検索距離としてADD_TO_SELECTIONを指定してINTERSECTを使用しています。何も選択していないだけです。私はそれをPythonウィンドウの外で実行していますが、ツールボックスからは動作します。
MierMoto 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.