Python スクリプトでのジオプロセシング タスクの作成
このトピックの内容
- スクリプトのプロジェクト データを発見する方法
- 他の Python モジュールのインポート
- ツールの整合チェック コード
- プロジェクト データとモジュールのツール パラメーターの作成
- サードパーティ モジュール
- Python、ArcPy およびスクリプト ツールの概要
詳細:
お使いのコンピューターで適切に稼働しているほとんどの Python スクリプト ツールは、GIS サーバーで適切に発行および実行されます。この場合、スクリプトを修正する必要はありません。ただし、問題が発生した場合、それは、数多くのプロジェクト データを使用したスクリプト、または開発した Python モジュールをインポートするためのインポート ステートメントを使用したスクリプトが原因となっている可能性があります。そのような場合、このトピックは、以下について詳しく説明しているため、解決に役立ちます。
- スクリプトで使用されているプロジェクト データを発見して、タスクを実行するサーバーでこれを使用可能にする方法。
- インポートされたモジュールを発見して、タスクを実行するサーバーでこれを使用可能にする方法。
- プロジェクト データと Python モジュール パラメーターを作成してスクリプトに渡す方法。
- ツールの整合チェック コードの操作方法、およびクライアントとサーバー間のやり取り。
- サードパーティ ライブラリの操作方法。
Python、ArcPy またはスクリプト ツールを使い慣れていない場合は、下記の「Python、ArcPy およびスクリプト ツールの概要」にスキップして便利なトピックの一覧をご参照ください。
スクリプトのプロジェクト データを発見する方法
パッケージまたはサービスのどちらの場合も、結果を共有し、その結果がスクリプト ツールを参照する際は必ず、スクリプトで使用されているプロジェクト データを発見するためにスクリプト ツールがスキャンされます。プロジェクト データが発見されると、一時フォルダーに統合され、パッケージ化 (パッケージを共有している場合) されるか、サーバーにアップロード (サービスを共有している場合) されます。
スクリプトがスキャンされると、Python 変数で使用されるまたは関数への引数として使用されるそれぞれの引用符 (一重または二重のいずれか) で囲まれた文字列がテストされ、存在するデータへのパスであるかどうかが確認されます。この場合のデータとは次のものを意味します。
- [コンテンツ] ウィンドウのレイヤー (ArcMap または ArcGlobe)
- フォルダー
- ファイル
- フィーチャクラス、シェープファイル、ジオデータベース、マップ ドキュメント (*.mxd)、レイヤー ファイル (*.lyr) などのジオデータセット
ここでは、ジオプロセシング ツールへの入力としてまたは他の Python モジュールを参照するパスとして使用されるデータのみを対象とします。出力データも統合されますが、プロジェクト データとは見なされません。
スクリプトに引用符で囲まれた文字列が発見されると、データの存在を確認する以下のようなテストが実行されます。
- 文字列は [コンテンツ] ウィンドウのレイヤーを参照するか?
- 文字列にデータへの絶対パス (「e:\Warehousing\ToolData\SanFrancisco.gdb\streets」など) が含まれているか?
- 文字列はスクリプトの場所からの相対で発見できるデータを参照するか? スクリプトの場所は次のように定義されます。
- スクリプトが格納されているフォルダー。
- スクリプトがツールボックスに埋め込まれている場合、場所はツールボックスが格納されているフォルダーになります。
- スクリプトが [Python] ツールボックスにある場合、場所は [Python] ツールボックスが格納されているフォルダーになります。
これらのテストは、順次実行されます。テストに適合しデータが存在するとわかると、データは統合されます。ただし、1 つ例外があります。サービスを共有している場合は、サーバーのデータ ストアが調べられ、データがデータ ストア内に存在するかどうかが判断されます。データがデータ ストア内に存在する場合、データは統合されません。
注意:
フォルダーが統合される場合、フォルダー内のファイルとジオデータセットのみがコピーされ、サブフォルダーはコピーされません。ファイル ジオデータセット、ラスター、TIN などの一部のジオデータセットは実際にはフォルダーですが、ジオデータセットでもあるため、コピーされます。フォルダーにレイヤー ファイル (*.lyr) またはマップ ドキュメント (*.mxd) が含まれている場合、レイヤー ファイルまたはマップ ドキュメントから参照されるすべてのデータも統合され、スクリプト内の arcpy.mapping ルーチンが参照データにアクセスできます。
ヒント:
フォルダーの統合では、ツールで使用されることのない大きなデータセットやファイルによってフォルダーが雑然とするのを避ける必要があります。これは、パッケージ化やサーバーにアップロードするデータのサイズを必要以上に増やさないためです。(サーバーのデータ ストアにあるフォルダーはサーバーにアップロードされないため、これらのフォルダーには当てはまりません。)
例
以下の例は、このフォルダー構造に基づいています。
相対パスとフォルダー
スクリプトの場所からの相対でデータを発見する以下の方法は一般的なパターンで、特に ArcGIS 10.0 向けに作成されたサービスに適用されます。参照する場合、後に続くスクリプト コードが上記の Scripts フォルダーにあります。ToolData フォルダーに SanFrancisco.gdb が含まれています。SanFrancisco.gdb の中に、Streets という名前のフィーチャクラスがあります。以下のコード サンプルでは、スクリプトの場所 (Scripts フォルダー) からの相対で ToolData フォルダーへのパスが作成されます。
import arcpy import os import sys
# Get the directory the script lives in.
# Folders will be found relative to this location.
#
scriptPath = sys.path[0]
# Construct paths to ../ToolData/SanFrancisco.gdb/Streets and
# ../ToolData/Warehouse.lyr
#
toolDataPath = os.path.join(scriptPath, "..", "ToolData")
streetFeatures = os.path.join(toolDataPath, "SanFrancisco.gdb", "Streets")
streetLyr = os.path.join(toolDataPath, "Warehouse.lyr")
以下のコードでは、「ToolData」という文字列 (os.path.join 関数への引数) がテストされ、存在するデータであるかどうかが確認されます。この場合、スクリプトの場所からの相対位置に ToolData という名前のフォルダーがあります。この ToolData フォルダーが統合されます。そのすべてのコンテンツ (上記で説明したように、サブフォルダーは除く) がパッケージ化またはサーバーにアップロードされます (ToolData フォルダーがサーバーのデータ ストアの一部である場合を除く)。
個々のファイルがコピーされるのではなく、フォルダーのコンテンツがコピーされることに注意してください。たとえば、上記のコードで、データセット e:/Warehousing/ToolData/SanFrancisco.gdb/Streets へのパスが作成されるとします。統合処理では、Streets データセットのみを分離してコピーするわけではありません。ToolData フォルダー全体がコピーされます。
ジオデータセットへの絶対パス
以下のコード サンプルに示すように、絶対パスは、e:/ などのドライブ文字から始まるパスです。import arcpy import os
streetFeatures = 'e:/Warehousing/ToolData/SanFrancisco.gdb/Streets'
上記のコードでは、Streets データセットとそれが依存する他のすべてのデータ (リレーションシップ クラス、ドメインなど) が統合されます。
ハイブリッドの例
import arcpy import os
toolDataPath = r'e:\Warehousing\ToolData'
warehouseLyr = os.path.join(toolDataPath, "Warehouse.lyr")
上記のコードでは、ToolData フォルダー全体のコンテンツが統合されます。フォルダーのコンテンツ (サブフォルダーは除く) が統合されるため、Warehouse.lyr も、Warehouse.lyr が参照するデータとともに統合されます。
スラッシュとバックスラッシュ
Windows の表記規則では、パスの区切り文字としてバックスラッシュ (円記号) (\) を使用します。UNIX システムではスラッシュ (/) を使用します。
注意:
ArcGIS ではどちらを使用してもかまいません。スラッシュであっても、バックスラッシュであっても、該当するオペレーティング システムの表記法に変換されます。
スクリプトでのバックスラッシュ
UNIX 関連のプログラミング言語 (Python や C 言語) では、バックスラッシュ (\) はエスケープ文字と見なされます。たとえば、\t はタブを表します。パスにはバックスラッシュが含まれるので、バックスラッシュがエスケープ文字として使用されないようにする必要があります。最も簡単なのは、次のように r ディレクティブを使用して、パスを Python の未処理文字列に変換する方法です。これは、バックスラッシュを無視するよう Python に指示する方法です。
thePath = r"E:\data\telluride\newdata.gdb\slopes"
他の Python モジュールのインポート
スクリプトが、開発した他のスクリプトをインポートする場合があります。たとえば、以下のコードでは、myutils.py という名前の Python モジュールのインポートを示しています。このモジュールは、親スクリプトと同じディレクトリにあり、 getFIDName という名前のルーチンを含んでいます。import arcpy import myutils inFeatures = arcpy.GetParameterAsText(0)
inFID = myutils.getFIDName(inFeatures)
インポート ステートメントが使用されると必ず、以下の順序でスクリプトが特定されます。
- スクリプトと同じフォルダー。スクリプトがツールボックスに埋め込まれている場合、ツールボックスが格納されているフォルダーが使用されます。
- システムの PYTHONPATH 変数が参照するフォルダー。
- システムの PATH 変数が参照するフォルダー。
インポートするモジュールを参照する方法として、 sys.path.append メソッドの使用もあります。この方法を使用すると、インポートする必要のあるスクリプトを格納するフォルダーにパスを設定できます。import arcpy import sys import os
# Append the path to the utility modules to the system path
# for the duration of this script.
#
myPythonModules = r'e:\Warehousing\Scripts'
sys.path.append(myPythonModules)
import myutils # a Python file within myPythonModules
上記のコードでは、sys.path.append メソッドには引数としてフォルダーが必要であることに注意してください。'e:\Warehousing\Scripts' はフォルダーであるため、フォルダー全体のコンテンツが統合されます。ここでも、フォルダーのコンテンツをコピーするためのルールが適用されます。ジオデータセットでないサブフォルダーを除く、フォルダー内のすべてがコピーされます。
注意:
フォルダー内の Python スクリプトをスキャン対象として、プロジェクト データやインポート済みモジュールが検索されることはありません。
ツールの整合チェック コード
スクリプト ツールの作成経験がある場合は、ユーザー独自のツールの整合チェックのロジックを指定してもかまいません。ジオプロセシング サービスのクライアントは、ツールの整合チェック ロジックを実行する機能がありません。この機能があるのはサーバーだけです。クライアントがその実行タスク要求をサービスに送信すると、サーバー上で整合チェック ロジックが実行されます。整合チェック ルーチンによってエラーがスローされると、タスクは実行を停止します。サービスからメッセージを返すと、整合チェック ルーチンによってスローされたメッセージがクライアントに表示されます。
整合チェック ロジックは、Python を使用して実装されます。整合チェック コードは、他のすべての Python スクリプトと同様に、プロジェクト データとモジュールについてスキャンされます。たとえば、整合チェック ロジックにより、投影情報ファイル (*.prj) を格納するフォルダー (d:\approved_projections など) を開いて、ツールの実行時にクライアントが使用できる空間参照の選択リストを作成します。このフォルダーはツール パラメーターではなく、ツールの整合チェック スクリプト内で使用されるプロジェクト データです。Python スクリプトについて上記で説明されたルールと同じルールが、ここでも適用されます。その結果、d:\approved_projections フォルダーが統合され、サーバーのデータ ストアにそれがなければ、サーバーにコピーされます。
プロジェクト データとモジュールのツール パラメーターの作成
上記で説明したように、Python スクリプトは共有時にスキャンされ、コード内の引用符で囲まれた文字列に基づいて、スクリプトが使用するデータが決定されます。この処理を管理する場合、スクリプトが使用するすべてのデータとモジュールのパラメーターを作成するという方法を使用できます。以下のスクリプトのサンプルは概念を示しています。すべてのプロジェクト データとモジュールがパラメーターになり、スクリプトに渡されます。
import arcpy import sys import os
inFeatures = arcpy.GetParameterAsText(0) # Feature Layer projectDataFolder = arcpy.GetParameterAsText(1) # Folder myPythonModules = arcpy.GetParameterAsText(2) # Folder
# Append the path to the utility modules to the system path
# for the duration of this script.
#
sys.path.append(myPythonModules)
import myutils # a Python file within myPythonModules
# Construct a variable to hold the Streets feature class found in the
# project data folder
#
streetsFeatures = os.path.join(projectDataFolder, "SanFrancisco.gdb", "Streets")
上記のように、スクリプトがすべてのデータのパラメーターを使用すると、次のようなメリットがあります。
- スクリプトに必要なデータがわかる - パラメーターであることから、ツールのダイアログ ボックスで確認できます。どのデータを使用するかを決定するためにコードを編集する必要がありません。
- 内部のツール整合チェック ロジックが引き継がれる - パラメーター値が、存在しないデータを参照する場合、ツールのダイアログ ボックスにはエラーが表示され、ツールを実行して結果を作成することはできません。
- データの場所をリセットするには、スクリプトに場所を入力するのではなく (エラーが起こりやすいため)、ツールのダイアログ ボックスを使用して場所を参照できます。
- 結果をサービスとして共有すると、サービス エディターにより、フォルダーのパラメーターが [定数] の [入力モード] に設定されます。パラメーターはクライアントに表示されません。公開時に、2 つのフォルダーはサーバーにコピーされます (フォルダーがデータ ストアに登録されている場合を除きます)。サーバー上でタスクを実行すると、スクリプトは、コピーされたフォルダーへのパスを受け取ります。
サードパーティ モジュール
サードパーティ モジュール (コア Python インストールの一部でないモジュール) は、統合されません。サーバー上にモジュールが存在していて正しく実行されることを確認する必要があります。これは、ArcGIS Server と共にインストールされる numpy または matplotlib モジュールには適用されません。
注意:
サードパーティの Python モジュール ( numpy および matplotlib以外) を Linux にインストールするには、特別な処理が必要です。
Python、ArcPy およびスクリプト ツールの概要
Python、ArcPy およびスクリプト ツールを使い慣れていない方は、下の表に記載した、使用開始にあたって参考になるトピックをご参照ください。
ヘルプ トピック | Contents |
---|---|
独自のプロセシング ツール作成の基本概要 | |
Python および ArcPy の入門トピック。これらのトピックでは、Python および ArcPy サイト パッケージの詳細を説明しています。 | |
Python を使用したカスタム スクリプト ツール作成の入門トピック。 | |
このトピックでは、スクリプト ツール パラメーターの定義方法を詳しく説明しているため、スクリプト ツール作成プロセスを学習した後に参照する機会が多くなります。 |