FAQ
ArcObjects を使用してクエリ レイヤーを作成する方法

ナレッジ番号:5601 | 登録日:2023/07/27 | 更新日:2023/12/28

概要

クエリ レイヤーは、SQL クエリによって定義されるレイヤーまたはスタンドアロン テーブルです。クエリ レイヤーによって、DBMS に格納されている空間情報と非空間情報の両方を、ArcMap 内の GIS プロジェクトに簡単に統合できます。クエリ レイヤーでは SQL を使用してデータベース テーブルとビューを直接検索するので、クエリ レイヤーで使用する空間情報はジオデータベース内に存在する必要はありません。

このトピックでは、ArcObjects を使用してクエリ レイヤーを作成する方法を示します。クエリ レイヤーの実体はフィーチャ レイヤーです。ただし参照先のフィーチャクラスが "クエリ フィーチャクラス" という特殊なオブジェクトとなります。

クエリ レイヤーを用いることでデータベースのビューからレイヤーを表示することができます。クエリ レイヤーに対しては ArcObjects API でフィーチャの編集ができないなどの制限があります。詳細はヘルプをご参照ください。

サンプル コード

クエリ レイヤーは以下の手順で作成します。

  1. データベース接続用の PropertySet の作成
  2. SqlWorkspaceFactory オブジェクトをインスタンス化し、Open メソッドで SqlWorkspace オブジェクトを取得
  3. GetQueryDescription メソッドによりIQueryDescriptionオブジェクトを取得し、ジオメトリ タイプや空間参照などを設定
  4. OpenQueryClass メソッドでクエリ フィーチャクラスを取得

作成したクエリ フィーチャクラスをソースとして、フィーチャレイヤーを作成し、マップに追加します。

public void CreateQueryLayer()
{
   //接続情報の作成
   IPropertySet pPropertySet = new PropertySetClass();

   pPropertySet.SetProperty("DBCLIENT", "sqlserver");
   pPropertySet.SetProperty("SERVERINSTANCE", "EJ123456");                 //PC名, インスタンス名
   pPropertySet.SetProperty("DATABASE", "Geodatabase") ;                   //データベース名
   //pPropertySet.SetProperty("AUTHENTICATION_MODE", "OSA")                //OS認証の場合
   pPropertySet.SetProperty("AUTHENTICATION_MODE", "DBMS");                //DBMS 認証の場合
   pPropertySet.SetProperty("USER", "XXX");                                //データベース ユーザー
   pPropertySet.SetProperty("PASSWORD", "XXX");                            //データベース パスワード

   //ワークスペースへのアクセス
   IWorkspaceFactory pWorkspaceFactory = new SqlWorkspaceFactoryClass();
   ISqlWorkspace pSqlWorkspace = (ISqlWorkspace)pWorkspaceFactory.Open(pPropertySet, 0);

   //クエリの作成
   IQueryDescription pQueryDescription;
   pQueryDescription = pSqlWorkspace.GetQueryDescription("SELECT * FROM GeoDatabase.dbo.Japan");
   //データベースからクエリ レイヤーとして抽出するレコードをSQLで指定
   pQueryDescription.GeometryType = esriGeometryType.esriGeometryPolygon;   //ジオメトリ タイプ
   pQueryDescription.Srid = "4612";                                         //座標系WKID
   //pQueryDescription.SpatialReference = pSpatialReference                 //もしくは座標系オブジェクトを設定
   pQueryDescription.OIDFields = "OBJECTID";                                //ユニークID識別子

   //クエリ 第1引数は%との組み合わせが必用です
   IFeatureClass pFeatureClass = (IFeatureClass)pSqlWorkspace.OpenQueryClass("%" + "Japan", pQueryDescription);  
   
   //フィーチャ レイヤーの追加
   IMxDocument pMxDocument = ArcMap.Document;
   IFeatureLayer pFeatureLayer = new FeatureLayerClass();
   pFeatureLayer.Name = "Query Layer";
   pFeatureLayer.FeatureClass = pFeatureClass;
   pMxDocument.AddLayer(pFeatureLayer);
}
Sub CreateQueryLayer()

   '接続情報の作成
   Dim pPropertySet As IPropertySet = New PropertySetClass()

   pPropertySet.SetProperty("DBCLIENT", "sqlserver")
   pPropertySet.SetProperty("SERVERINSTANCE", "EJ123456")                   'PC名\インスタンス名
   pPropertySet.SetProperty("DATABASE", "GeoDatabase")                      'データベース名
   'pPropertySet.SetProperty("AUTHENTICATION_MODE", "OSA")                  'OS認証の場合
   pPropertySet.SetProperty("AUTHENTICATION_MODE", "DBMS")                 'DBMS 認証の場合
   pPropertySet.SetProperty("USER", "XXX")                                  'データベース ユーザー
   pPropertySet.SetProperty("PASSWORD", "XXX")                              'データベース パスワード

   'ワークスペースへのアクセス
   Dim pWorkspaceFactory As IWorkspaceFactory = New SqlWorkspaceFactoryClass()
   Dim pSqlWorkspace As ISqlWorkspace = pWorkspaceFactory.Open(pPropertySet, 0)

   'クエリの作成
   Dim pQueryDescription As IQueryDescription
   'データベースからクエリ レイヤーとして抽出するレコードをSQLで指定
   pQueryDescription = pSqlWorkspace.GetQueryDescription("SELECT * FROM GeoDatabase.dbo.Japan")  
   pQueryDescription.GeometryType = esriGeometryType.esriGeometryPolygon    'ジオメトリ タイプ
   pQueryDescription.Srid = "4612"                                          '座標系WKID
   'pQueryDescription.SpatialReference = pSpatialReference                  'もしくは座標系オブジェクトを設定
   pQueryDescription.OIDFields = "OBJECTID"                                 'ユニークID識別子

   'クエリ 第1引数は%との組み合わせが必用です
   Dim pFeatureClass As IFeatureClass = pSqlWorkspace.OpenQueryClass("%" + "Japan", pQueryDescription) 

   'フィーチャ レイヤーの追加
   Dim pMxDocument As IMxDocument = My.ArcMap.Document
   Dim pFeatureLayer As IFeatureLayer = New FeatureLayerClass()
   pFeatureLayer.Name = "Query Layer"
   pFeatureLayer.FeatureClass = pFeatureClass
   pMxDocument.AddLayer(pFeatureLayer)

End Sub

ArcGIS Desktop ヘルプ

クエリ レイヤーとは

メタデータ

種類

製品