詳細:
お使いのコンピューターで正常に動作しているほとんどの Python スクリプト ツールは、Web ツールとして適切に発行および実行されます。この場合、スクリプトを修正する必要はありません。 ただし、問題が発生している場合は、スクリプトで大量のプロジェクト データ (パラメーターとして表示されていない入力データ) が使用されているか、開発した Python モジュールのインポートに import ステートメントを使用していることが原因と考えられます。 そのような場合、このトピックは、以下のシナリオについて説明しているため、解決に役立ちます。
- プロジェクト データのパスの構築とその検出方法。
- インポートされたモジュールを検出し、ツールの実装で使用可能にする方法。
- サードパーティ ライブラリの操作方法。
- ツールの検証コードの操作方法、およびクライアントと Web ツール間のやり取り。
Python、ArcPy またはスクリプト ツールを使い慣れていない場合は、下記の「Python、ArcPy およびスクリプト ツールの概要」にスキップして便利なトピックの一覧をご参照ください。
プロジェクト データのパスの構築とその検出方法
多くの Python スクリプトにおいて重要なのは、データを参照するパスを適切に構築することです。 これには、スクリプト内にあるプロジェクト データ (パラメーターとして表示されていない入力データ) や、中間 (一時) データも含まれます。 データを参照するパスを Python で記述するには、いくつかの方法があります。 フル パスを記述する方法について詳しくは、「Python でのデータのパスの設定」をご参照ください。
既知の場所に対するデータのパスは、os.path.join を使用して構築できます。 これは、メモリ ワークスペースに存在する出力場所へのパスを構築したり、ディスクへの一時データのテンポラリの場所を使用したりする場合にも便利です。 os.path.join の使用方法については、次の例をご参照ください。
ツールを Web ツールとして共有するとスクリプトがスキャンされ、Python 変数で使用するか、または関数への引数として使用する、それぞれの引用符 (一重または二重のいずれか) で囲まれた文字列がテストされ、存在するデータへのパスであるかどうかが確認されます。 この場合、プロジェクト データとは以下のものを指します。
- マップまたはシーンの [コンテンツ] ウィンドウのレイヤー
- フォルダー
- ファイル
- ジオデータセット。フィーチャクラス、シェープファイル、ジオデータベース、マップ (.mapx)、レイヤー ファイル (.lyrx) など
スクリプトに引用符で囲まれた文字列が発見されると、データの存在を確認する以下のようなテストが実行されます。
- 文字列は [コンテンツ] ウィンドウのレイヤーを参照するか?
- 文字列にデータへの絶対パス ("e:\Warehousing\ToolData\SanFrancisco.gdb\streets" など) が含まれているか?
- 文字列は、プロジェクト ファイル .aprx やスクリプトなど、既知の場所からの相対で検出されるデータを参照しているか?
これらのテストは、順次実行されます。 テストが正常に終了した後に、データが存在する場合は統合されますが、データがポータルのフェデレーション データ ストアに登録されている場合は、例外的に統合されません。
注意:
フォルダーが統合される場合、フォルダー内のファイルとジオデータセットのみがコピーされ、サブフォルダーはコピーされません。 ファイル ジオデータセットやラスターなどの一部のジオデータセットは実際にはフォルダーですが、ジオデータセットでもあるため、コピーされます。 フォルダーにレイヤー ファイル (.lyrx) またはマップ (.mapx) が含まれている場合は、そのレイヤー ファイルまたはマップが参照しているすべてのデータも統合され、スクリプト内の arcpy.mp ルーチンから参照先のデータにアクセスできるようになります。
ヒント:
フォルダーの統合では、ツールで使用されることのない大きなデータセットやファイルによってフォルダーが雑然とするのを避ける必要があります。これは、パッケージ化やサーバーにアップロードするデータのサイズを必要以上に増やさないためです (サーバーのデータ ストアにあるフォルダーはサーバーにアップロードされないため、これらのフォルダーにはあてはまりません)。
例
以下の例は、このプロジェクト フォルダー構造に基づいています。
データセットへの相対パスとフォルダー
arcpy.mp ルーチンは、指定したプロジェクトの homeFolder または defaultGeodatabase を取得します。 パスは、Python の os モジュールで構築されます。 以下の例では、WebTools.gdb ジオデータベースのフィーチャクラスは LYRXs フォルダー内のレイヤー ファイルを使用して設定され、シンボル化されます。
import arcpy
import os
# The ArcGIS Project is used to build paths from the defaultGeodatabase and
# homeFolder using os.path.join
# Reference the CURRENT project with ArcGIS Pro open, or point to an .aprx on
# disk
prj = arcpy.mp.ArcGISProject("CURRENT")
arcpy.CopyFeatures_management(os.path.join(prj.defaultGeodatabase, "study_sites"),
"in_memory/tempSite")
# Create a variable to reference the LYRX folder
lyrxFolder = os.path.join(prj.homeFolder, "LYRXs")
arcpy.ApplySymbologyFromLayer_management("in_memory/tempSite",
os.path.join(lyrxFolder, "Site4.lyrx"))
上のコードでは、study_sites フィーチャクラスと Site4.lyrx ファイル (およびそのファイルがポイントしているデータ) がテストされ、存在するデータを参照しているかどうかを確認します。 これらのデータセットは統合され、サーバーにアップロードされます (データセットの存在するフォルダーがサーバーのデータ ストアの一部である場合を除く)。
lyrxFolder 変数は、レイヤー ファイルのフォルダーへの相対パスを参照します。 このフォルダーが統合されます。そのすべてのコンテンツ (上記で説明したように、サブフォルダーは除く) がパッケージ化またはサーバーにアップロードされます (lyrxFolder フォルダーがサーバーのデータ ストアの一部である場合を除く)。
プロジェクト データとしてのレイヤーの参照
レイヤーをプロジェクト データとして使用する一般的でないワークフローを使用すると、Python スクリプト ツールのパフォーマンスを大幅に向上させることができます。 上の Python コードは、フィーチャクラスとレイヤー ファイルへの絶対パスを使用します。 Web ツールを実行すると、最初にデータセットが開き、データセットを開いたことで、パフォーマンスが低下します。 レイヤーをスクリプト内で使用すると、データが開かれたまま、キャッシュに維持されるため、迅速な実装が可能になります。 次の図は、プロジェクトのコンテンツ内のレイヤーを Python スクリプトで照合および使用する方法を示しています。
変数 (extentMask と rasterLayer) は、マップ内のレイヤー名と一致する単純な文字列を指しています。 データは統合され、ポータルで共有されたときに Web ツールで使用できるようになります (データ ストアで参照されていない場合)。また、メモリ内のレイヤーへの参照も保持します。 マップのレイヤーとスクリプトの文字列の名前が一致すると、ツールをレイヤーで使用できるようになります。
注意:
レイヤーを内部プロジェクト データとしてスクリプト ツールで使用する場合、このスクリプト ツールは関連するマップに依存するようになります。 それらのレイヤーが存在しないと、別のマップからツールを実行できません。 このパターンにより、スクリプト ツールの一般的な移植性が低下します。 そのため、このパターンは Web ツールの作成に特に適しています。
他の 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 インストールの一部でないモジュール) は、統合されません。 サーバー上にモジュールが存在していて正しく実行されることを確認する必要があります。 これは numpy、matplotlib、および ArcGIS Server とともにデフォルトでインストールされているその他のモジュールには適用されません。 サードパーティの Python モジュールを配置する方法については、「ArcGIS Server へのカスタム Python パッケージの配置」をご参照ください。
ツールの検証コード
スクリプト ツールの作成経験がある場合は、ユーザー独自のツールの検証のロジックを指定してもかまいません。 Web ツールのクライアントは、ツールの検証ロジックを実行する機能がありません。この機能があるのはサーバーだけです。 クライアントがその実行タスク要求をサービスに送信すると、サーバー上で検証ロジックが実行されます。 検証ルーチンによってエラーがスローされると、タスクの実行が停止します。 サービスからメッセージを返すと、検証ルーチンによってスローされたメッセージがクライアントに表示されます。 一般に、公開された Web ツールの一部であるツールの検証コードがツールに与える価値は、デスクトップで使用された場合よりも低くなります。 検証コードが削減、または削除された Web ツールのコピーを使用し、それを Web ツールとして共有することもできます。 Web ツールを使用するには、アプリケーションで検証ロジックを開発する必要があります。
検証ロジックは、Python を使用して実装されます。検証チェック コードは、他のすべての Python スクリプトと同様に、プロジェクト データとモジュールについてスキャンされます。 たとえば、検証 ロジックは、投影情報ファイル (.prj) を含むフォルダー (d:\approved_projections など) を開き、クライアントがツールの実行時に使用できる空間参照の選択リストを構築します。 このフォルダーはツール パラメーターではなく、ツールの検証スクリプトで使用されるプロジェクト データです。 Python スクリプトについて上記で説明されたルールと同じルールが、ここでも適用されます。その結果、d:\approved_projections フォルダーが統合され、サーバーのデータ ストアにそれがなければ、サーバーにコピーされます。
Python、ArcPy およびスクリプト ツールの概要
Python、ArcPy およびスクリプト ツールを使い慣れていない方は、下の表に記載した、使用開始にあたって参考になるトピックをご参照ください。
ヘルプ トピック | コンテンツ |
---|---|
ジオプロセシングの入門トピック。 | |
ArcPy の入門トピック。 | |
Python を使用したカスタム スクリプト ツール作成の入門トピック。 | |
このトピックでは、スクリプト ツール パラメーターの定義方法を詳しく説明しているため、スクリプト ツール作成プロセスを学習した後に参照する機会が多くなります。 |