Python スクリプトでの Web ツールの作成

詳細:

お使いのコンピューターで適切に稼働しているほとんどの Python スクリプト ツールは、Web ツールとして適切に発行および実行されます。この場合、スクリプトを修正する必要はありません。ただし、問題が発生した場合は、スクリプトで大量のプロジェクト データが使用されているか、開発した Python モジュールのインポートに import ステートメントを使用していることが原因と考えられます。そのような場合、このトピックは、以下のシナリオについて説明しているため、解決に役立ちます。

  • プロジェクト データのパスの構築とその検出方法。
  • インポートされたモジュールを発見して、ツール実行においてこれを使用可能にする方法。
  • サードパーティ ライブラリの操作方法。
  • ツールの整合チェック コードの操作方法、およびクライアントと Web ツール間のやり取り。

Python、ArcPy またはスクリプト ツールを使い慣れていない場合は、下記の「Python、ArcPy およびスクリプト ツールの概要」にスキップして便利なトピックの一覧をご参照ください。

プロジェクト データのパスの構築とその検出方法

多くの Python スクリプトにおいて重要なのは、データを参照するパスを適切に構築することです。これには、スクリプト内にあるプロジェクト データや、中間 (一時) データも含まれます。データを参照するパスを Python で記述するには、いくつかの方法があります。フル パスを記述する方法について詳しくは、「データのパスの設定」をご参照ください。

既知の場所に対するデータのパスは、os.path.join を使用して構築できます。これは、インメモリに存在する出力場所へのパスを構築したり、一時データのテンポラリの場所からディスクへのパスを構築する場合にも便利です。os.path.join の使用方法については、次の例をご参照ください。

ツールを Web ツールとして共有するとスクリプトがスキャンされ、Python 変数で使用されるまたは関数への引数として使用されるそれぞれの引用符 (一重または二重のいずれか) で囲まれた文字列がテストされ、存在するデータへのパスであるかどうかが確認されます。この場合、プロジェクト データとは以下のものを指します。

  • マップまたはシーンの [コンテンツ] ウィンドウのレイヤー
  • フォルダー
  • ファイル
  • ジオデータセット。フィーチャクラス、シェープファイル、ジオデータベース、マップ (*.mapx)、レイヤー ファイル (*.lyrx) など

スクリプトに引用符で囲まれた文字列が発見されると、データの存在を確認する以下のようなテストが実行されます。

  1. 文字列は [コンテンツ] ウィンドウのレイヤーを参照するか?
  2. 文字列にデータへの絶対パス (「e:\Warehousing\ToolData\SanFrancisco.gdb\streets」など) が含まれているか?
  3. 文字列は、プロジェクト ファイル .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 スクリプトで照合および使用する方法を示しています。

Python スクリプト ツール内で使用されるレイヤー

変数 (extentMaskrasterLayer) は、マップ内のレイヤー名と一致する単純な文字列を指しています。データは統合され、ポータルで共有されたときに Web ツールで使用できるようになります (データ ストアで参照されていない場合)。また、メモリ内のレイヤーへの参照も保持します。マップのレイヤーとスクリプトの文字列の名前が一致すると、ツールをレイヤーで使用できるようになります。

メモ:

レイヤーを内部プロジェクト データとしてスクリプト ツールで使用する場合、このスクリプト ツールは関連するマップに依存するようになります。それらのレイヤーが存在しないと、別のマップからツールを実行できません。このパターンにより、スクリプト ツールの一般的な移植性が低下します。そのため、このパターンは Web ツールの作成に特に適しています。

他の Python モジュールのインポート

スクリプトが、開発した他のスクリプトをインポートする場合があります。たとえば、次のコードは、myutils.py という名前の Python モジュールのインポートを示しています。このモジュールは、親スクリプトと同じディレクトリ内にあり、getFIDName という名前のルーチンが含まれています。

import arcpy
import myutils
inFeatures = arcpy.GetParameterAsText(0)
inFID = myutils.getFIDName(inFeatures)

import ステートメントが使用されると必ず、次の順序でスクリプトが特定されます。

  1. スクリプトと同じフォルダー。スクリプトがツールボックスに埋め込まれている場合、ツールボックスが格納されているフォルダーが使用されます。
  2. システムの PYTHONPATH 変数が参照するフォルダー。
  3. システムの 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 インストールの一部でないモジュール) は、統合されません。サーバー上にモジュールが存在していて正しく実行されることを確認する必要があります。これは numpymatplotlib、およびフェデレートされた ArcGIS Server とともにデフォルトでインストールされているその他のモジュールには適用されません。サードパーティの Python モジュールを配置する方法については、「ArcGIS Server へのカスタム Python パッケージの配置」をご参照ください。

ツールの整合チェック コード

スクリプト ツールの作成経験がある場合は、ユーザー独自のツールの整合チェックのロジックを指定してもかまいません。Web ツールのクライアントは、ツールの整合チェック ロジックを実行する機能がありません。この機能があるのはサーバーだけです。クライアントがその実行タスク要求をサービスに送信すると、サーバー上で整合チェック ロジックが実行されます。整合チェック ルーチンによってエラーがスローされると、タスクは実行を停止します。サービスからメッセージを返すと、整合チェック ルーチンによってスローされたメッセージがクライアントに表示されます。一般に、公開された Web ツールの一部であるツールの整合チェック コードがツールに与える価値は、デスクトップで使用された場合よりも低くなります。整合チェック コードが削減、または削除された Web ツールのコピーを使用し、それを Web ツールとして共有することもできます。Web ツールを使用するには、アプリケーションで整合チェック ロジックを開発する必要があります。

整合チェック ロジックは、Python を使用して実装されます。整合チェック コードは、他のすべての Python スクリプトと同様に、プロジェクト データとモジュールについてスキャンされます。たとえば、整合チェック ロジックは、投影情報ファイル (*d:\approved_projections) を含むフォルダー (.prj など) を開き、クライアントがツールの実行時に使用できる空間参照の選択リストを構築します。このフォルダーはツール パラメーターではなく、ツールの整合チェック スクリプトで使用されるプロジェクト データです。Python スクリプトについて上記で説明されたルールと同じルールが、ここでも適用されます。その結果、d:\approved_projections フォルダーが統合され、サーバーのデータ ストアにそれがなければ、サーバーにコピーされます。

Python、ArcPy およびスクリプト ツールの概要

Python、ArcPy およびスクリプト ツールを使い慣れていない方は、下の表に記載した、使用開始にあたって参考になるトピックをご参照ください。

ヘルプ トピックコンテンツ

カスタム ツール作成のクイック ツアー

独自のプロセシング ツール作成の基本概要

Python とは

ArcPy とは

Python および ArcPy の入門トピック。これらのトピックでは、Python および ArcPy サイト パッケージの詳細を説明しています。

Python でのツールの作成のクイック ツアー

スクリプト ツールとは

Python を使用したカスタム スクリプト ツール作成の入門トピック。

スクリプト ツール パラメーターの設定

このトピックでは、スクリプト ツール パラメーターの定義方法を詳しく説明しているため、スクリプト ツール作成プロセスを学習した後に参照する機会が多くなります。