ジオプロセシングでの ArcSDE データの注意事項
データベース接続ファイル(*.sde)
ArcSDE エンタープライズ ジオデータベース またはデータベースからデータにアクセスする場合、ジオプロセシング ツールにはデータベース接続ファイル(*.sde)が必要です。
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 以外の場所に格納します。さまざまな種類のジオデータベースの比較については、「ジオデータベースの種類」をご参照ください。どの種類のジオデータベースがニーズに最適か判断するのに役立ちます。
既存の ArcSDE フィーチャクラスを更新する場合、更新数が非常に多いと処理負荷が大きくなります。以下のツールは、いずれも既存のフィーチャクラスを更新します。
既存のフィーチャクラスをすべて更新します。ArcSDE フィーチャクラスに対して多数の行を更新する場合は、Auto Commit ジオプロセシング環境を使用して、データベースでコミット前に処理されるフィーチャ数を増やしてください。ただし、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)は、特にアクセスするデータがスキーマ外である場合、オブジェクト名を完全修飾する必要があります。完全修飾名を使用すると、明瞭にオブジェクト名を修飾して、正しいオブジェクト(フィーチャクラス、リレーショナル テーブル、テーブルなど)を使用できます。オブジェクト名の完全修飾については、データベースごとに若干基準が異なっています。詳細については、データベースのマニュアルをご参照ください。
完全修飾テーブル名またはフィーチャクラス名の使用
スクリプトで、接続ユーザとは異なるユーザからデータにアクセスする必要がある場合は、テーブル名またはフィーチャクラス名を完全修飾してください。接続ユーザを使用して名前が修飾されないようにするためです。スクリプトで、接続ユーザとは異なるユーザからデータにアクセスする必要がある場合は、テーブル名またはフィーチャクラス名を完全修飾して、接続ユーザを使用して名前が修飾されないようにする必要があります。そうしないと、処理が失敗したり、間違ったデータをツールが使用することになります。
接続ユーザ以外のユーザが所有する完全修飾フィーチャクラスの使用法を以下に示します。ツールボックスのデータベース ユーザは、マップ ユーザのデータに対する SELECT 権限を持つ必要があります。
import arcpy
# Create an 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.
# 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)] ツールを使用してレイヤを作成します。接続ファイルのバージョンのプロパティで親バージョンまたは開始バージョンが指定された ArcSDE 接続ファイルを使用します。
- すべてのツールでこのレイヤを使用します。
- 作業対象のバージョンを変更するときは、[接続バージョンの変更(Change Version)] ツールを使用します。
- ツールでは、引き続きフィーチャ レイヤを使用します。[接続バージョンの変更(Change Version)] ツールの実行後は、開いているワークスペースが指しているバージョンが尊重されます。
- プロジェクトの必要に応じて、[接続バージョンの変更(Change Version)] ツールを使用して他のバージョンに変更して、解析を実行します。
次の Python スクリプトでは、バージョン対応フィーチャ レイヤを使用するワークフローを示します。
# VersionedFeatureLayersExample.py
# Description: Simple example showing how to access versioned feature classes using layers.
# 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"))