ジオプロセシングでの ArcSDE データの注意事項
ArcSDE 接続ファイルの動的作成
ArcSDE 接続ファイルは、[ArcSDE 接続ファイルの作成(Create ArcSDE Connection File)] ツールを使用して、必要に応じて作成することができます。このツールを使用すると、ArcSDE データにアクセスするツールを実行する場合に事前に接続ファイルを準備しなくても、必要に応じて ArcSDE 接続ファイルを自動的に作成できます。テキスト ファイルやエンコードされた XML ストリーム、安全なデータベースなど、任意のソースから接続プロパティを取得して、それを [ArcSDE 接続ファイルの作成(Create ArcSDE Connection File)] ツールに渡して、必要な ArcSDE 接続ファイルを作成します。接続ファイルを使い終えたら、[削除(Delete)] ツールまたはオペレーティング システムの適切なコマンドを使用して、ただちに接続ファイルを削除できます。
ジオプロセシングの履歴と結果では、ツールに渡されたパラメータがすべて記録されます。接続情報は [ArcSDE 接続ファイルの作成(Create ArcSDE Connection File)] ツールのパラメータとして入力されるため、履歴ログ機能を無効にしない限り、接続情報も記録されます。ツールを実行するたびに、それがシステム ツールかモデル ツールかスクリプト ツールかを問わず、実行記録が履歴ログ ファイルに書き込まれます。ログ ファイルに記録される情報は、基本的に結果ウィンドウに表示されるものと同じです。[ArcSDE 接続ファイルの作成(Create ArcSDE Connection File)] ツーを実行したときに、接続情報(パラメータで入力するパスワードなどの機密情報)が履歴ログや結果ウィンドウに記録されるのを防ぐには、履歴ログ機能を無効にします。詳細については、履歴ログ ファイルをご参照ください。
ArcSDE データ使用時のジオプロセシング ツールのパフォーマンス
ジオプロセシングは、ArcSDE サーバ、ジオデータベース、またはデータベースのパフォーマンスを制御できません。ArcSDE データ使用時に最高のパフォーマンスを実現するには、データベースの適切なチューニングと、データベースを使用するアプリケーションの設計と実装(ここでは ArcSDE とジオデータベース)が大きな要因になります。ただし、ジオプロセシング ツールで ArcSDE データを使用するときに、ツールとワークフローのパフォーマンスに影響を与える可能性のあるワークフローの落とし穴を避けるために考慮すべき点もいくつかあります。
ジオプロセシング ツールはほとんどがデータの作成と読み込み操作
ほとんどのジオプロセシング ツールは新しいデータを作成します。そのため、たいていの場合、ジオプロセシングの出力は、ツールの出力を ArcSDE に送るという点で、データ読み込み操作と見なすことができます。データベース全体に悪影響を与えないように、すべてのデータ読み込み操作を計画することが大切です。[ユニオン(Union)] ツールの出力レコード数が 5000 万件で、ネットワークとデータベースが混雑する朝の時間帯にそのデータを ArcSDE データベースに読み込むようでは、ほとんどのデータベース管理者(とユーザ)は幸せになれません。あまりに大量のデータ読み込み操作は、データベースのすべてのユーザに影響を与え(ユーザ数は場合によっては数百人から数千人になります)、データを送信するネットワークのユーザにも影響を与えます。ジオプロセシング ツールの入力が非常に大量である場合、または、組み合わせると(オーバーレイ ツールを使用するときなど)非常に大量の出力フィーチャクラスを作成する場合は、ネットワークとデータベースの負荷に最も影響を与えない時間帯に出力を作成するようにスケジュールを組みます。
ほとんどの場合、ファイル ジオデータベースにツールの出力を作成するほうが有利です。ファイル ジオデータベースで出力が正しいことを検証したら、ネットワークとデータベースのパフォーマンスに最も影響を与えない時間帯にそのデータを ArcSDE に転送できます(転送には、たとえば、[フィーチャのコピー(Copy Features)] や [フィーチャクラス → フィーチャクラス(Feature Class to Feature Class)] を使用します)。
データを ArcSDE に格納しない場合
最終出力までに多くの手順を踏むモデルとスクリプトを実行すると、中間データが作成されます。データが ArcSDE に存在していて、中間データもすべて ArcSDE に送る場合、大量のネットワーク トラフィックと競合が発生し、データベース サーバの負荷も無駄に増大します。中間データはすべてファイル ジオデータベースに送るか、シンプル フィーチャクラスの場合は、メモリ内フィーチャクラスに送ることをお勧めします。
分析の出力が一時的である場合、または広く共有されない場合は、出力を ArcSDE 以外の場所に格納します。さまざまな種類のジオデータベースの比較については、「ジオデータベースの種類」をご参照ください。どの種類のジオデータベースがニーズに最適か判断するのに役立ちます。
既存データを編集するジオプロセシング ツールにおける空間インデックスの注意事項
ArcGIS は、空間インデックスを使用して、フィーチャクラス内のフィーチャをすばやく特定します。空間インデックスは、フィーチャを挿入または削除するたびに更新する必要があります。新しい出力の作成時は、すべてのデータが読み込まれるまで、新しいフィーチャクラスの空間インデックスの作成は先送りされます。既存のフィーチャクラスの編集時は、空間インデックスの更新時期に 2 つの選択肢があります。空間インデックスをそのまま残して、編集のたびに更新されるようにすることも、編集の開始前に空間インデックスを削除して、すべての編集の完了後に更新することもできます。
空間インデックスとジオプロセシング ツール
いくつかのジオプロセシング ツールは既存データを編集できます。
既存データを編集するジオプロセシング ツールを使用するときは、環境設定の MaintainSpatialIndex を利用して、挿入、削除、更新(まとめて編集と呼ばれます)操作時の ArcSDE 空間インデックスの処理方法をある程度制御できます。既存データの編集時のパフォーマンスを改善する可能性のあるオプションは 2 つあります。MaintainSpatialIndex を true に設定すると、空間インデックスがそのまま残り、編集のたびに ArcSDE が自動的に空間インデックスを更新します。false に設定すると、既存データを編集するジオプロセシング ツールが編集を開始する前に ArcSDE 空間インデックスが削除されます。すべての編集が完了した後に、空間インデックスを読み込む必要があります。更新カーソルと挿入カーソルの使用時の空間インデックス
更新カーソルと挿入カーソルも既存データを対象とします。更新カーソルと挿入カーソルを使用するときは、[空間インデックスの削除(Remove Spatial Index)] ツールを使用して、非常に大量の行が関係する編集操作の前に ArcSDE 空間インデックスを削除しておくこともできます。編集が完了したら、[空間インデックスの追加(Add Spatial Index)] ツールを使用して、空間インデックスを作り直します。非常に大量の行を編集する場合、こうすることで編集操作全体のパフォーマンスが向上することがあります。空間インデックスの使用法については、「ジオデータベースの空間インデックスの概要」をご参照ください。
スクリプト作成時の ArcSDE データのガイドライン
Oracle、SQL Server、IBM DB2、PostgreSQL のようなリレーショナル データベース管理システム(RDBMS)は、特にアクセスするデータがスキーマ外である場合、オブジェクト名を完全修飾する必要があります。完全修飾名を使用すると、明瞭にオブジェクト名を修飾して、正しいオブジェクト(フィーチャクラス、リレーショナル テーブル、テーブルなど)を使用できます。オブジェクト名の完全修飾については、データベースごとに若干基準が異なっています。詳細については、データベースのマニュアルをご参照ください。
完全修飾テーブル名またはフィーチャクラス名の使用
非修飾テーブル名またはフィーチャクラス名をジオプロセシング ツールに渡すと、ArcSDE 接続ファイルを使用して作成された接続先のワークスペースの現在接続しているユーザ名を使用して、名前が自動的に修飾されます。スクリプトで、接続ユーザとは異なるユーザからデータにアクセスする必要がある場合は、テーブル名またはフィーチャクラス名を完全修飾して、接続ユーザを使用して名前が修飾されないようにする必要があります。そうしないと、処理が失敗したり、間違ったデータをツールが使用することになります。
接続ユーザ以外のユーザが所有する完全修飾フィーチャクラスの使用法を以下に示します。ツールボックスのデータベース ユーザは、マップ ユーザのデータに対する SELECT 権限を持つ必要があります。
import arcpy # Create and ArcSDE connection file that connects as the toolbox database user arcpy.CreateArcSDEConnectionFile_management(r'C:\temp',r'toolboxuser.sde','gpserver','5151','',"DATABASE_AUTH",'toolbox','toolbox') # Perform a union operation using data owned by the connected user, toolbox, # and another feature class owned by the map database user. arcpy.Union_analysis(r'C:\temp\toolboxuser.sde\toolbox.states;C:\temp\toolboxuser.sde\map.counties',r'C:\temp\toolboxuser.sde\statesCountiesUnion')
オブジェクトの完全修飾の使用法は、データベースごとに若干異なります。詳細については、DBMS SQL のマニュアルをご参照ください。
完全修飾フィールド名の使用
フィールドもデータベース内のオブジェクトであり、接続ユーザが所有していないオブジェクトにアクセスするときは、完全修飾名を使用してフィールドにアクセスする必要があります。複雑な SQL ステートメントを作成する場合は、必要な動作を SQL にさせるのに完全修飾フィールド名が役立ちます。ここでも、オブジェクトの完全修飾の使用法は、データベースごとに若干異なります。詳細については、DBMS SQL のマニュアルをご参照ください。
バージョン対応データのジオプロセシング
バージョン対応のジオデータベースは Enterprise ジオデータベースだけで使用できます。ArcSDE は Enterprise ジオデータベースです。ジオプロセシング ツールは、ArcSDE データがデータセット パスとして渡されるか、レイヤ名として渡されるかに応じて、バージョン対応データに 2 つの方法でアクセスします。
フィーチャクラスを使用するときは、ArcSDE フィーチャクラスに対するパスの一部である接続ファイルの接続情報を常に使用してフィーチャクラスが開かれます。つまり、データのアクセス時に、*.sde ファイルの接続プロパティで設定されたバージョンにバインドされることになります。
データを ArcMap に追加する場合、データはフィーチャ レイヤまたはテーブル ビューとして表現されます。ジオプロセシング ツールが入力をフィーチャ レイヤまたはテーブル ビューとして識別すると、ArcSDE 接続ファイルの接続プロパティを使用してフィーチャクラスを開き直すことはありません。その代わりに、レイヤのすでに開かれているワークスペースを使用してフィーチャクラスにアクセスします。ワークスペースが指しているバージョンなど、ワークスペースに変更が加えられた場合、ジオプロセシング ツールはそれを尊重します。ArcMap で、ArcMap のコンテンツ ウィンドウの ArcSDE データに対して、[接続バージョンの変更(Change Version)] ツールを使用した場合は、[接続バージョンの変更(Change Version)] ツールの呼び出し後、ワークスペースが接続しているデータのバージョンが使用されます。
ジオプロセシング ツールでのバージョン対応フィーチャクラスの使用
ジオプロセシング ツールで ArcSDE 接続ファイル(*.sde)を含むパスを使用してフィーチャクラスに直接接続するときは、フィーチャクラスが接続するバージョンを次のように管理します。
- ArcSDE 接続ファイルのパスを使用してフィーチャクラスを参照します。
- [バージョンの作成(Create Version)] ツールを使用して新しいバージョンを作成します。この方法でバージョンを作成すると、新しいバージョンは、ツールへの引数として渡された接続ファイルに挙げられたバージョンの子になります。
- [ArcSDE 接続ファイルの作成(Create ArcSDE Connection File)] ツールを使用して新しい接続ファイルを作成し、この新しく作成したバージョンをツールの Version パラメータで使用するようにします。
- この新しい接続ファイルを使用すると、新しいバージョンに接続してフィーチャクラスにアクセスします。
- 親バージョンに接続してフィーチャクラスを使用するときは、元の接続ファイルを使用します。
ArcSDE 接続ファイルの名前を付けるときは、作成する各接続ファイルを使用して行う作業を明確に区別できるような名前を *.sde ファイルに付けると便利です。
- 接続パラメータを使用します: gpserver5151toolboxVersion1.sde(サーバ名 + ポート + ユーザ名 + バージョン)
- *.sde ファイルを使用する GIS アナリスト名を使用します: Ken.sde
- 使用するプロジェクトにちなんだ名前を *.sde ファイルに付けます: waterDeptJune2010Upgrade.sde
どんな命名規則を使う場合でも、ファイル名が明確で、組織のセキュリティ ポリシーに違反しないようにします。
バージョン対応フィーチャクラスを使用するワークフローを示す Python スクリプト
# VersionedFeatureClassExample.py # Description: Simple example showing how to access versioned feature classes in geoprocessing tools. # Author: ESRI # import system modules import arcpy import sys, os # Set variables sdeConnFilePath = sys.path[0] + os.sep + "sdeconnectionfiles" analysisVersion = "TOOLBOX.proposedStreets2k9" defaultVersionConnection = r'gpserver5151toolboxDEFAULT.sde' proposedStreetsVersion = r'gpserver5151toolboxproposedStreets2k9.sde' # Perform analysis on the Default version to determine current number of streams within 100 meters of streets. inputFC = sdeConnFilePath + os.sep + defaultVersionConnection + os.sep + r'TOOLBOX.Redlands\TOOLBOX.streams' selectFC = sdeConnFilePath + os.sep + defaultVersionConnection + os.sep + r'TOOLBOX.Redlands\TOOLBOX.street' outputFC = sdeConnFilePath + os.sep + defaultVersionConnection + os.sep + r'StreamsNearStreets' arcpy.MakeFeatureLayer_management(arcpy.SelectLayerByLocation_management(inputFC,"WITHIN_A_DISTANCE",selectFC,"100 Meters","NEW_SELECTION",'#'), outputFC,'','','') print "Streams within 100 Meters of current streets: " + str(arcpy.GetCount_management(outputFC)) # Create an ArcSDE connection file for connecting to the proposedStreets2k9 version folderName = sdeConnFilePath fileName = proposedStreetsVersion serverName = "gpserver" serviceName = "5151" databaseName = "" authType = "DATABASE_AUTH" username = "toolbox" password = "toolbox" saveUserInfo = "SAVE_USERNAME" versionName = analysisVersion saveVersionInfo = "SAVE_VERSION" arcpy.CreateArcSDEConnectionFile_management (folderName, fileName, serverName, serviceName, databaseName, authType, username, password, saveUserInfo, versionName, saveVersionInfo) # Perform the same analysis on the proposedStreets2k9 version to see the effect of the proposed changes. inputFC = sdeConnFilePath + os.sep + proposedStreetsVersion + os.sep + r'TOOLBOX.Redlands\TOOLBOX.streams' selectFC = sdeConnFilePath + os.sep + proposedStreetsVersion + os.sep + r'TOOLBOX.Redlands\TOOLBOX.street' outputFC = sdeConnFilePath + os.sep + defaultVersionConnection + os.sep + r'NewStreamsNearStreets' arcpy.MakeFeatureLayer_management(arcpy.SelectLayerByLocation_management(inputFC,"WITHIN_A_DISTANCE",selectFC,"100 Meters","NEW_SELECTION",'#'), outputFC,'','','') print "Streams projected to be within 100 Meters of streets after proposed street additions:" + str(arcpy.GetCount_management(outputFC))
ジオプロセシング ツールでフィーチャ レイヤとテーブル ビューを使用してバージョン対応フィーチャクラスにアクセス
フィーチャ レイヤまたはテーブル ビューを使用してバージョン対応フィーチャクラスにアクセスするときのワークフローは以下のとおりです。
- すべての入力について、[フィーチャ レイヤの作成(Make Feature Layer)] ツールまたは [テーブル ビューの作成(Make Table View)] ツールを使用してレイヤを作成します。接続ファイルの Version プロパティで親バージョンまたは開始バージョンが指定された ArcSDE 接続ファイルを使用します。
- すべてのツールでこのレイヤを使用します。
- 作業対象のバージョンを変更するときは、[接続バージョンの変更(Change Version)] ツールを使用します。
- ツールでは、引き続きフィーチャ レイヤを使用します。[接続バージョンの変更(Change Version)] ツールの呼び出し後は、開いているワークスペースが指しているバージョンが尊重されます。
- プロジェクトの必要に応じて、[接続バージョンの変更(Change Version)] ツールを使用して他のバージョンに変更して、解析を実行します。
バージョン対応フィーチャ レイヤを使用するワークフローを示す Python スクリプト
# VersionedFeatureLayersExample.py # Description: Simple example showing how to access versioned feature classes using layers. # Author: ESRI # import system modules import arcpy from arcpy import env import sys, os # Set Environments env.workspace = sys.path[0] + os.sep + "gpserver5151toolboxDEFAULT.sde" # Create the layers arcpy.MakeFeatureLayer_management(r'TOOLBOX.Redlands\TOOLBOX.street', 'RedlandsStreets') arcpy.MakeFeatureLayer_management(r'TOOLBOX.Redlands\TOOLBOX.streams', 'RedlandsStreams') # Perform analysis on the Default version to determine current number of streams within 100 meters of streets. arcpy.MakeFeatureLayer_management(arcpy.SelectLayerByLocation_management("RedlandsStreams","WITHIN_A_DISTANCE","RedlandsStreets","100 Meters","NEW_SELECTION",'#'), 'StreamsNearStreets','','','') print "Streams within 100 Meters of current streets: " + str(arcpy.GetCount_management("StreamsNearStreets")) # Change to the development version arcpy.ChangeVersion_management('RedlandsStreets','TRANSACTIONAL', 'TOOLBOX.proposedStreets2k9','') # Perform the same analysis on the development version to see the effect of the proposed changes. arcpy.MakeFeatureLayer_management(arcpy.SelectLayerByLocation_management("RedlandsStreams","WITHIN_A_DISTANCE","RedlandsStreets","100 Meters","NEW_SELECTION",'#'), 'NewStreamsNearStreets','','','') print "Streams projected to be within 100 Meters of streets after proposed street additions: " + str(arcpy.GetCount_management("NewStreamsNearStreets"))
ArcSDE データとツールの共有
ツールを共有するお勧めの方法は、ネットワークをまたがって共有する場合でも、ジオプロセシング サービス間で共有する場合でも、下図のように、ツール共有フォルダ構造を使用する方法です。必要な ArcSDE 接続ファイルは、ツールの正常実行に必要な他のデータとあわせて、ToolData フォルダにコピーまたは作成します。
ユーザが開発したモデルとスクリプト ツールでは、接続ファイルの相対パスを使用して ToolData フォルダにある ArcSDE 接続ファイルにアクセスする必要があります。
データにアクセスするもう一つの方法は、ArcSDE 接続ファイルをネットワーク上のアクセス可能な場所に置くことです。ツールは UNC パスを使用して、この ArcSDE 接続ファイルにアクセスします。
この方法は、実際には、ファイル ジオデータベース データなど、他のジオデータベース データを共有する方法と変わりがありません。ファイル ジオデータベースの場合も、ツールと並んで、ファイル ジオデータベース フォルダ(ArcSDE 接続ファイルに相当)を用意するか、ネットワーク上のファイル ジオデータベースにアクセスできるようにして、その UNC パスを使用してツールがデータにアクセスできるようにします。