ArcSDE と Microsoft 空間タイプ
ArcSDE ジオデータベースは、Microsoft の Geometry 空間データ タイプおよび Geography 空間データ タイプを使用したベクタ データの格納をサポートしています。これらのタイプは SQL Server 2008 で利用可能であり、個別のインストールは不要です。SQL を使用して空間データにアクセスする場合には、これらのデータ タイプを使用します。
Microsoft の Geometry タイプは既存の GIS 空間データ タイプと同様に、定義済みの投影などの任意の面で座標系を使用します。
Microsoft の Geography タイプは、緯度経度の座標系とともに格納される楕円体上のデータに使用されます。
2 つのタイプは、空間の計算方法が異なります。Microsoft 空間タイプの詳細については、SQL Server 2008 のマニュアルをご参照ください。
Microsoft 空間タイプを指定するコンフィグレーション キーワードの使用
デフォルトでは、SQL Server の ArcSDE ジオデータベースは ArcSDE Compressed Binary タイプを使用します。したがって、Microsoft の Geometry タイプまたは Geography タイプを格納に使用する場合は、(1)SDE_dbtune テーブルで DEFAULTS コンフィグレーション キーワードの GEOMETRY_STORAGE パラメータを GEOMETRY または GEOGRAPHY に変更するか、(2)フィーチャクラスの作成時に GEOMETRY_STORAGE パラメータが GEOMETRY または GEOGRAPHY に設定されているコンフィグレーション キーワードを指定します。DEFAULTS キーワードの GEOMETRY_STORAGE パラメータを変更するのは、ほとんどのユーザが Geometry タイプまたは Geography タイプをデータに使用するケースが大半を占める場合のみにしてください。一部のデータだけが Geometry タイプまたは Geography タイプで格納される場合は、フィーチャクラスの作成時に別のキーワードを指定します。GEOMETRY と GEOGRAPHY という 2 つのキーワードが用意されています。ユーザが固有のカスタム キーワードを作成することもできます。
ジオデータベースで Microsoft の Geometry または Geography を使用するための前提条件
Microsoft の Geometry 列または Geography 列が含まれるテーブルを、サードパーティ アプリケーションや SQL を使用して作成した場合は、このテーブルを ArcSDE およびジオデータベースに登録してジオデータベースの機能を利用できます。これを実行するには、テーブルが次の前提条件を満たしている必要があります。
- テーブルを登録するユーザがテーブルの所有者でなくてはいけません。
- テーブルの空間列が Geometry タイプまたは Geography タイプのいずれかでなくていはいけません。
- 列内のすべてのシェープが、ポイント、ライン、ポリゴン、マルチポイント、マルチストリング、マルチポリゴンのうちいずれかの、同じ空間タイプでなくてはいけません。
テーブルを ArcSDE に登録したあとで、SQL を使用して異なるタイプのシェープを列に追加することはサポートされておらず、その場合、フィーチャクラスは予測できない振舞いをします。
- 列のすべてのシェープが同じ空間参照 ID(SRID)を使用しなくてはいけません。
- 登録時に指定した ArcSDE SRID は SDE_spatial_references システム テーブルに存在していなくてはいけません。存在しない場合、登録時に投影法を定義する必要があります。メモ:
ArcSDE SRID と Microsoft の Geometry または Geography SRID は同じものではありません。ArcSDE SRID は、座標系を SDE_spatial_references システム テーブルに追加したときに ArcSDE によって割り当てられます。
- テーブルに主キーが含まれている場合は、テーブルをクラスタリングしなくてはいけません。
ArcSDE およびジオデータベースに対する既存の Geometry または Geography テーブルの登録
ArcSDE にテーブルを登録するには、sdelayer コマンドで register 操作を使用します。
次に、features というジオメトリ列にポリゴン ジオメトリ タイプ(-e a)が含まれている spdata というテーブルを登録する例を示します。このテーブルには、一意なフィーチャ ID 列として使用される fid という整数列があり、この列に対する値は ArcSDE で管理されます(-C fid,SDE)。レイヤの登録に使用される空間参照 ID(SRID)は 5(-R 5)です。これは SDE_spatial_references テーブルの SRID です。
sdelayer –o register –l spdata,features –e a –C fid,SDE –t GEOMETRY –R 5 –i sde:sqlserver:tornado –D agency1 –u vijay –p open.septagenarian
必要な空間参照が SDE_spatial_references テーブルに存在しない場合は、その空間参照を使用するテンプレートのフィーチャクラスを ArcCatalog で作成してから、SDE_spatial_references テーブルにクエリを実行してそのテーブルに割り当てられた SRID を確認します。
sde スキーマのジオデータベースの場合
SELECT * FROM sde.SDE_spatial_references
dbo スキーマのジオデータベースの場合
SELECT * FROM dbo.SDE_spatial_references
テンプレート フィーチャクラスを使用して、追加した空間参照を見つけて、SRID 番号を特定します。ジオメトリ列を持ち、同じ座標参照系にある他のテーブルを登録する際に、この番号を -R オプションで指定します。
また、–R オプションを使用する代わりに、–G オプションで投影 ID を指定することもできます。Geography 列を持つテーブルを登録するときは、使用する投影 ID が、SQL Server の sys.spatial_references_systems テーブルに格納された SRID の 1 つに一致する必要があります。
sdelayer –o register –l spgeogdata,features –e a –C fid,SDE –t GEOGRAPHY –G 4326 –i sde:sqlserver:tornado –D agency1 –u vijay –p open.septagenarian
どちらかの空間データ格納タイプのテーブルに大量のレコードが含まれる場合は、RowID 列をユーザ管理として登録した方が登録に時間がかからない場合があります。しかし、ユーザ管理の RowID を使用することはお勧めしません。
sdelayer –o register –l polsamples,shape –e p –C fid,USER –t GEOMETRY –R 300 –i 6543 –D agency1 –u guadalupe –p overnout
注意点として、フィーチャ ID 列をユーザ管理として登録してからフィーチャクラスをジオデータベースで登録すると、ArcGIS でフィーチャ ID 列の object_ID がさらに追加されます。ArcGIS はこの列の値を自動的に管理します。テーブルに大量のレコードが含まれる場合は、この object_ID 列の追加に時間がかかることがあります。
sdelayer -o register を実行すると、テーブルが ArcSDE に登録されます。これによってジオデータベースの SDE_layers、SDE_geometry_columns、SDE_column_registry および SDE_table_registry のシステム テーブルにレコードが追加されます。空間インデックスは作成されません。ArcGIS 外部で作成されたテーブルに SQL を使用して空間インデックスを作成した後、ArcSDE に登録することができます。別の方法として、テーブルを ArcSDE に登録した後、空間インデックスを作成することもできます。そのためには、sdelayer コマンドを使用して alter 操作でレイヤ範囲を定義し、続いて load_only_io 操作でテーブルを LOAD_ONLY_IO モードに切り替え、normal_io 操作で NORMAL_IO モードに戻します。これで自動的に空間インデックスが作成されます。その後、レイヤをジオデータベースに登録すると、ArcCatalog を使用して空間インデックスを作成できます。sdelayer または ArcCatalog を使用して空間インデックスを作成するときは、SDE_dbtune テーブルで指定された空間インデックス パラメータ、および、レイヤのデータの現在の範囲を使用して空間インデックスが作成されます。
sdelayer コマンドを使用する方法については、『ArcSDE コマンド リファレンス』をご参照ください。
リレーションシップ クラス、トポロジ、ジオメトリック ネットワーク、Cadastral Fabric、テレイン、スキーマなどのジオデータベース機能に属するフィーチャクラスや、サブタイプ、デフォルト値、ドメインまたは整合性ルールを持つフィーチャクラスが必要な場合は、これらもジオデータベースに登録する必要があります。
データセットは次のようにして ArcCatalog に登録できます。
- ArcCatalog を起動します。
- 登録するレイヤを含むジオデータベースに接続します。必ずレイヤの所有者として接続してください。
- ジオデータベースに登録するレイヤを右クリックします。
- [ジオデータベースに登録] をクリックします。
空間インデックスの作成
空間インデックスを作成するための SQL Server の前提条件は、テーブルに主キーがあることです。
ArcGIS 以外のアプリケーションで作成された空間テーブル、たとえば SQL を使用して作成されたテーブルの場合は、テーブルに主キーを作成してから SQL を使用して空間インデックスを作成します。次に、Geometry または Geography タイプの列が含まれるテーブルに空間インデックスを作成するための SQL 構文を示します。
CREATE SPATIAL INDEX <index_name> ON <table> (<spatial column>) USING GEOMETRY_GRID WITH ( BOUNDING_BOX = minx,miny,maxx,maxy), GRIDS = (low|medium|high, low|medium|high, low|medium|high, low|medium|high), CELLS_PER_OBJECT = n, <other regular btree index options like filegroups, fill factors, etc> )
Geometry または Geography 空間列を持つレイヤを ArcGIS で作成すると、フィーチャクラスのバウンディング ボックスが、インデックス付けされるデータの範囲として計算されます。この範囲外にあるフィーチャはインデックス付けされませんが、空間検索では検索の対象となります。レイヤの範囲が設定されていない場合は、レイヤの空間参照系に対する最大座標範囲がバウンディング ボックスで使用されます。レイヤが LOAD_ONLY_IO モードから NORMAL_IO モードに切り替わるときは常に、バウンディング ボックスが最新のレイヤ範囲で調整されます。
また、ArcGIS を使用して Geometry または Geography 列を持つフィーチャクラスを作成すると、デフォルトで、ArcSDE はビジネス テーブルの RowID 列にクラスタリングされた主キーを作成してから、フィーチャクラスの作成時に使用された、SDE_dbtune テーブルのコンフィグレーション キーワードの B_MS_SPINDEX パラメータに設定されている値に基づいて空間インデックスを構築します。フィーチャクラスがバージョン対応登録されていると、クラスタリングされた主キーは ADD テーブルの RowID 列とステート ID 列に作成され、フィーチャクラスの作成時に使用されたコンフィグレーション キーワードの A_MS_SPINDEX に設定されている値に基づいて空間インデックスが構築されます。この両方のパラメータのデフォルト値は次のとおりです。
GRIDS = (MEDIUM, MEDIUM, MEDIUM, MEDIUM), CELLS_PER_OBJECT = 16
SDE_dbtune テーブルの値の設定については、「DBTUNE テーブル作成後の内容の変更」をご参照ください。
ArcSDE ジオデータベースにおける SQL Server ジオグラフィの使用に関する既知の制約
SQL Server ジオグラフィ データを ArcSDE ジオデータベースに格納する場合に、注意が必要な制約を次に挙げます。
- ArcSDE は、現在のリリースでは、Geography データ タイプに Z 値または M 値を格納できません。このため、別のジオデータベースのシェープファイルやフィーチャクラスなどの既存のデータをジオデータベースに取り込むときに、Geography データ タイプを使用して格納する必要がある場合、そのデータセットは 3D(Z 値)またはメジャー(M 値)の属性を保持できません。
Z 属性と M 属性は、データをインポートする前に無効にする必要があります。別の方法として、3D 属性またはメジャー属性を持つデータを Geometry またはデフォルトの Compressed Binary 格納タイプを使用するフィーチャクラスにインポートすることはできます。
- ほとんどの場合、Geography データのメジャーはメートル単位です。メジャーの単位は sys.spatial_ref_system で示されるため、ユーザのデータに関連付けられている EPSG 値で使用される単位を確認します。
- 個々のフィーチャとマルチパート フィーチャのすべてのパートは、単一の半球体に属する必要があります。