詳細:
お使いのコンピューターで適切に稼働しているほとんどの 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 向けに作成されたサービスに適用されます。ToolData フォルダーに SanFrancisco.gdb が含まれています。SanFrancisco.gdb の中に、Streets という名前のフィーチャクラスがあります。以下のサンプル コードでは、スクリプトの場所 (Warehouse.tbx と同じディレクトリ) からの相対で ToolData フォルダーへのパスと内部のデータセットが作成されます。
import arcpy
import os
import sys
# Get the directory the script lives in.
# Folders and data will be found relative to this location.
#
scriptPath = sys.path[0]
# Construct paths to ../ToolData/SanFrancisco.gdb/Streets and
# ../ToolData/Warehouse.lyr
streetFeatures = os.path.join(scriptPath, "ToolData\\SanFrancisco.gdb\\Streets")
streetLyr = os.path.join(scriptPath, "ToolData\\Warehouse.lyr")
上のコードでは、存在するデータを参照しているか確認するために、変数 streetFeatures と streetLyr がテストされます。これらのデータセットは統合され、サーバーにアップロードされます (データセットの存在するフォルダーがサーバーのデータ ストアの一部である場合を除く)。
フォルダーへの相対パス
ToolData フォルダー自体は、アイテムを参照する開始点として参照および使用できます。以下のサンプル コードでは、スクリプトの場所 (Warehouse.tbx と同じディレクトリ) からの相対で ToolData フォルダーへのパスが作成されます。
import arcpy import os import sys
# Get the directory the script lives in. # Folders and data will be found relative to this location. #
scriptPath = sys.path[0]
# Construct paths to the ToolData folder toolDataFolder = os.path.join(scriptPath, "ToolData")
# Construct path to items inside the folder streetFeatures = os.path.join(toolDataFolder, "SanFrancisco.gdb\\Streets")
上のコードでは、変数 toolDataFolder が、Python スクリプトを通じて参照できるさまざまなアイテムのフォルダーへの相対パスになります。この ToolData フォルダーが統合されます。そのすべてのコンテンツ (上記で説明したように、サブフォルダーは除く) がパッケージ化またはサーバーにアップロードされます (ToolData フォルダーがサーバーのデータ ストアの一部である場合を除く)。
フォルダーを参照するとき、個々のファイルがコピーされるのではなく、フォルダーのコンテンツがコピーされることに注意してください。たとえば、上のコードでは、Warehouse.lyr への明示的なパスは作成されていませんが、ファイルは参照されるフォルダー内に存在するので統合されます。
ジオデータセットへの絶対パス
以下のサンプル コードに示すように、絶対パスは、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 が参照するデータとともに統合されます。
プロジェクト データとしてのレイヤーの参照
レイヤーをプロジェクト データとして使用する一般的でないワークフローを使用すると、Python スクリプト ツールのパフォーマンスを大幅に向上させることができます。上の Python スニペットは、フィーチャクラスとレイヤー ファイルへの絶対パスを使用します。ジオプロセシング サービスを実行すると、最初にデータセットが開かれ、これがパフォーマンスの向上につながります。レイヤーをスクリプト内で使用すると、データへの自由なアクセスと、作成されたデータのキャッシュが維持されるため、高速に実行できます。次の図は、ArcMap の [コンテンツ] ウィンドウ内のレイヤーを Python スクリプト内で照合および使用する方法を示しています。
[コンテンツ] ウィンドウにある 2 つのレイヤーがスクリプト ツール内で使用されています。変数は、マップ ドキュメント内のレイヤー名と一致する単純な文字列を指しています。このワークフローを ArcGIS Server で公開するとき、データは統合されサーバーに移動されます (データ ストアで参照されていない場合)。サービスはレイヤーへの参照をメモリ内に保持します。そのサービス内では、ツールはこの名前と照合することで、レイヤーを検索および使用します。
メモ:
レイヤーを内部プロジェクト データとしてスクリプト ツールで使用する場合、このスクリプト ツールは関連するマップ ドキュメントに依存するようになります。それらのレイヤーが存在しないと、ArcCatalog や別のマップ ドキュメントからツールを実行できません。このパターンは、バックグラウンド処理では機能せず、ワークフローの一般的な移植性が低下します。そのため、このパターンはジオプロセシング サービスの作成に主に適しています。
スラッシュとバックスラッシュ
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)
import ステートメントが使用されると必ず、次の順序でスクリプトが特定されます。
- スクリプトと同じフォルダー。スクリプトがツールボックスに埋め込まれている場合、ツールボックスが格納されているフォルダーが使用されます。
- システムの 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 メソッドは引数としてフォルダーを必要とすることに注意してください。r'e:\Warehousing\Scripts' はフォルダーであるため、フォルダーのコンテンツ全体が統合されます。ここでも、フォルダーのコンテンツをコピーするためのルールが適用されます。ジオデータセットでないサブフォルダーを除く、フォルダー内のすべてがコピーされます。
メモ:
フォルダー内の Python スクリプトをスキャン対象として、プロジェクト データやインポート済みモジュールが検索されることはありません。
ツールの整合チェック コード
スクリプト ツールの作成経験がある場合は、ユーザー独自のツールの整合チェックのロジックを指定してもかまいません。ジオプロセシング サービスのクライアントは、ツールの整合チェック ロジックを実行する機能がありません。この機能があるのはサーバーだけです。クライアントがその実行タスク要求をサービスに送信すると、サーバー上で整合チェック ロジックが実行されます。整合チェック ルーチンによってエラーがスローされると、タスクは実行を停止します。サービスからメッセージを返すと、整合チェック ルーチンによってスローされたメッセージがクライアントに表示されます。
整合チェック ロジックは、Python を使用して実装されます。整合チェック コードは、他のすべての Python スクリプトと同様に、プロジェクト データとモジュールについてスキャンされます。たとえば、整合チェック ロジックは、投影情報ファイル (* d:\approved_projections) を含むフォルダー (.prj など) を開き、クライアントがツールの実行時に使用できる空間参照の選択リストを構築します。このフォルダーはツール パラメーターではなく、ツールの整合チェック スクリプト内で使用されるプロジェクト データです。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 を使用したカスタム スクリプト ツール作成の入門トピック。 | |
このトピックでは、スクリプト ツール パラメーターの定義方法を詳しく説明しているため、スクリプト ツール作成プロセスを学習した後に参照する機会が多くなります。 |