ArcMapの内部で実行されるPythonスクリプトと外部で実行されるPythonスクリプト


10

私は仕事のためにPythonスクリプトを使い始めたばかりです。

現在、プロセスを自動化するスクリプトを作成しています。

基本的に、ユーザーにクライアント名を尋ね、可能な場合はプロジェクションを取得し、C:ドライブにクライアント用のディレクトリを作成し、クライアント固有のファイルジオデータベースを作成し、必要なデータセットを作成し、クライアントデータ固有のフィーチャクラスを作成します。最終的には、各フィーチャクラスに必要なフィールドを追加し、おそらく他の項目も追加します。

私は、ArcMapのPythonスクリプトの適切なエチケットを本当に知らずにこれを始めました。しかし、これまでに作成したものは、ArcMapの外でしか実行されません。

これは受け入れられますか?

たった今見つけたarcpy.getparamaterastext()を介してユーザー入力を取得する代わりに、raw_input()を使用しています。

よろしいですか?

これは機能しますが、これがスクリプトを作成する適切な方法であるかどうかはわかりません。

ここに私がこれまでに持っているコードがあります。

import sys
import arcpy
import os

#Records name of the client
client = raw_input("Enter the name of the client: (letters and underscores only) \n")

#Records filepath of client to be created
clientpath = "C:/" + client

#Inquires if projection file exists
projection = raw_input("Is there a .prj or .shp available with correct projection? Y or N \n")

#Records the projection location if available
if projection.upper() == "Y":
    spatialr = raw_input("Drag the .prj or .shp here to record the filepath \n")
    nspatialr = spatialr.replace('"', "")
elif projection.upper() == "N":
    alert = raw_input("You must add the spatial reference manually, hit enter to continue. \n")
elif projection.upper() != "N" or "Y":
    exit = raw_input("That is not a valid response. Try again. \n")
    sys.exit()

#Checks if client folder exists; if not, creates one
if not os.path.exists(clientpath):
    os.makedirs(clientpath)

#Variable for file geodatabase location
FGBpath = clientpath + "/" + client + ".gdb"

#Checks if client file geodatabase exists; if not, creates one
if not arcpy.Exists(FGBpath):
    arcpy.CreateFileGDB_management(clientpath, client)

#Variable for dataset location
FDatasetpath = clientpath + "/" + client + ".gdb" + "/Network"

#Checks if dataset exists; if not, creates one
if not arcpy.Exists(FDatasetpath):
    if projection.upper() == "Y":
        arcpy.CreateFeatureDataset_management(FGBpath, "Network", nspatialr)
    elif projection.upper() == "N":
        arcpy.CreateFeatureDataset_management(FGBpath, "Network")

#Variable for cable feature class location
FCcablepath = clientpath + "/" + client + ".gdb" + "/Network" + "/cable"

#Checks if cable feature class exists; if not, creates one
if not arcpy.Exists(FCcablepath):
    if projection.upper() == "Y":
        arcpy.CreateFeatureclass_management (FDatasetpath, "cable", "POLYLINE", "", "", "", nspatialr)
    elif projection.upper() == "N":
        arcpy.CreateFeatureclass_management (FDatasetpath, "cable", "POLYLINE")

#Variable for splice point feature class location
FCsplicepath = clientpath + "/" + client + ".gdb" + "/Network" + "/splice_point"

#Checks if splice point feature class exists; if not, creates one
if not arcpy.Exists(FCsplicepath):
    if projection == 'Y' or projection == 'y':
        arcpy.CreateFeatureclass_management (FDatasetpath, "splice_point", "POINT", "", "", "", nspatialr)
    elif projection == 'N' or projection == 'n':
        arcpy.CreateFeatureclass_management (FDatasetpath, "splice_point", "POINT")

exit = raw_input("\n\n File geodatabase, dataset, and the cable \n and splice point feature classes successfully created. \n\n Hit enter to exit.")

必要なフィールドを追加するなど、まだやるべきことがいくつかあります。

回答:


18

入力を取得する方法は、エンドユーザーが100%になるかどうかに依存しますが、そうです、ArcMapでraw_inputを使用することはできません。スクリプトを使用する唯一のユーザーになる場合は、raw_inputを介して入力を取得すること、またはスクリプトへの変数としてパスをハードコーディングすることに問題はありません。誰がまたは任意のスクリプトの経験があってもなくてもよいのスクリプトを使用する場合は、それが使用することをお勧めしgetParameterAsTextを()およびスクリプトツールとしてスクリプトを実装して ArcMapをインチ スクリプトツールを作成すると、ほとんどのESRIツール(バッファーなどの標準ツールなど)で使用されるものと同様のインターフェイスがユーザーに提供されます。

注意すべきことの1つは、raw_inputsを設計する方法によって、ユーザーとスクリプト間の対話が段階的に作成されることです。これがArcMapでgetParameterAsText()を使用して実行される場合、ステップバイステップはなくなり、スクリプトを実行する前に入力された一連の設定になります。

スクリプトの主な目的の1つは自動化です。複数のデータセットでこれを実行する場合は、ループをチェックアウトする必要があります。ここまで来たら、少なくともそれらについて読んだことでしょうが、それらの使用方法の例として、同じ操作を実行する必要のある複数のデータセットがあるとします。一度実行する必要のあるプロセスのコードを記述してから、データセットのリストを取得してそれぞれに対して操作を実行する「for」ループを含めることができます。

空間参照などの場合は、arcpy.Describe()を使用して既存のシェープファイルから空間参照を「スチール」するか、getParameterAsText()を使用して空間参照入力を取得できます(パラメーターを空間参照入力として定義する限り)スクリプトツールの設定時)。raw_inputを使用してパス名を取得するのは少し面倒です。


4
+1、私は間違いなく raw_inputではなくパラメーターを取ることに切り替えます。特にArcGISのジオプロセシングツールのようなものに慣れている場合は、GUIではなくコマンドラインインターフェイスを使用するエンドユーザーは多くありません。
blah238

10

@egdettiのすばらしい提案に加えて、あらゆる小さな条件に対してif / elseロジックを記述する代わりに、いくつかの仮定を行うことでスクリプトを大幅に簡略化できます。

例えば:

  • 各項目が事前に存在するかどうかをチェックする代わりに、存在すると仮定し、を設定して上書きしますarcpy.env.overwriteOutput = True。これで、事前にチェックする必要がある理由があるかもしれませんが、多くの場合、上書きは問題ありません。

  • 代わりに空間参照オプションが設定されたかどうかをチェックし、2つの異なる方法で同じコマンドを呼び出すのでは、一度だけコマンドに空間参照変数を渡し、聞かせてそれが nullまたは空の文字列(それがうまくなります)を扱います。

  • os.path.join危険に満ちている文字列連結を使用する代わりに、ファイルパス要素を結合するために使用します。

    例:

    FGBpath = clientpath + "/" + client + ".gdb"

    使用する:

    FGBpath = os.path.join(clientpath, client + ".gdb")

驚くばかり!私が探していたヒントのようなもの、ありがとう!人々が使用する最も一般的な関数/ライブラリを示すリストのタイプを知っていますか?os.path.joinなど?たくさんあるのでちょっと圧倒的です。できれば+1します。彼らは私が質問に賛成投票できるようにするべきです。反対票を投じるだけではありません!
ianbroad

2
私はすでに公式のPythonチュートリアルを済ませていると思いますか?それは便利なセクション(持っている12標準ライブラリにします)。別の優れたリソースは、Doug HellmannのModule of the Weekリストです:doughellmann.com/PyMOTW/contents.html
blah238

また、圧倒されるより圧倒される方がいいと私は言います!
blah238

まあ、私はそれを認めるのが嫌いですが、私はまだチュートリアルを通過していません。私はちょうどそれに飛び込んできた。私は数年前にC ++クラスを受講したので、基本的なことはある程度知っていますが、チュートリアルを完全に確認する必要があります。私はいつも頭の中で最初の種類のダイビングをしてきました。リンクをありがとう。
ianbroad 2012年

あなたもdiveintopython.netが好きかもしれません、それから:)
blah238
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.