FAQ
ArcObjectsで、レイヤーにテーブルを結合する方法

ナレッジ番号:2932 | 登録日:2023/05/29 | 更新日:2023/12/28

概要

このサンプルでは、テーブル オブ コンテンツの最上位レイヤーに、指定したテーブルを結合する方法をご紹介します。テーブル結合を実行するには、まずメモリ上にリレーションシップを作成してフィーチャ レイヤーに結合します。

Image

サンプル コード

このサンプルでは、Excel スプレッド シート(*.xls)をテーブルとして取得しフィーチャ レイヤーに結合しています。

//テーブル オブ コンテンツの最上位レイヤーを取得
IFeatureLayer pFeatureLayer = (IFeatureLayer)pMap.get_Layer(0);
IDisplayTable pDisplayTable = (IDisplayTable)pFeatureLayer;
ITable pLayer = (ITable)pDisplayTable.DisplayTable;

//Excel ファイルをテーブルとして取得
//ExcelWorkspaceFactory クラスを IWorkspaceFactory 型のオブジェクトとして作成します
Type factoryType = System.Type.GetTypeFromProgID("esriDataSourcesOleDB.ExcelWorkspaceFactory");
IWorkspaceFactory pWorkspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);
IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pWorkspaceFactory.OpenFromFile(@"D:\FAQ\JoinTable.xls", 0);
ITable pTable = pFeatureWorkspace.OpenTable("Table$");

//テーブル結合に使用するキーフィールドを設定
//InputBpx 関数を使用して、ダイアログボックスにテキストを入力して設定します
String strOriginPrimaryKeyField = Interaction.InputBox("結合先のキー フィールド名を入力します: ", "レイヤーにテーブルを結合する", "STATE_FIPS");
String strOriginForeignKeyField = Interaction.InputBox("結合元のキー フィールド名を入力します: ", "レイヤーにテーブルを結合する", "STATE_FIPS");

//メモリ上にリレーションシップを作成
//MemoryRelationship クラスのオブジェクトを IMemoryRelationshipClassFactory 型で作成し、Open メソッドを使用して IRelationshipClass 型のオブジェクトを作成します
Type factoryType2 = System.Type.GetTypeFromProgID("esriGeodatabase.MemoryRelationshipClassFactory");
IMemoryRelationshipClassFactory pMemoryRelationshipClassFactory = (IMemoryRelationshipClassFactory)Activator.CreateInstance(factoryType2);
IRelationshipClass pRelationshipClass = pMemoryRelationshipClassFactory.Open("JoinTableToLayer", (IObjectClass)pTable, strOriginPrimaryKeyField, (IObjectClass)pLayer, strOriginForeignKeyField, "forward", "backward", esriRelCardinality.esriRelCardinalityOneToMany);

//テーブル結合を実行
//IDisplayRelationshipClass の DisplayRelationshipClass メソッドを実行してリレーションシップをフィーチャ レイヤーに結合します
IDisplayRelationshipClass pDisplayRelationshipClass = (IDisplayRelationshipClass)pFeatureLayer;
pDisplayRelationshipClass.DisplayRelationshipClass(pRelationshipClass, esriJoinType.esriLeftOuterJoin);
'テーブル オブ コンテンツの最上位レイヤーを取得
Dim pFeatureLayer As IFeatureLayer = CType(pMap.Layer(0), IFeatureLayer)
Dim pDisplayTable As IDisplayTable = CType(pFeatureLayer, IDisplayTable)
Dim pLayer As ITable = CType(pDisplayTable.DisplayTable, ITable)

'Excel ファイルをテーブルとして取得
'ExcelWorkspaceFactory クラスを IWorkspaceFactory 型のオブジェクトとして作成します
Dim factoryType As Type = Type.GetTypeFromProgID("esriDataSourcesOleDB.ExcelWorkspaceFactory")
Dim pWorkspaceFactory As IWorkspaceFactory = CType(Activator.CreateInstance(factoryType), IWorkspaceFactory)
Dim pFeatureWorkspace As IFeatureWorkspace = pWorkspaceFactory.OpenFromFile("D:\FAQ\JoinTable.xls", 0)
Dim pTable As ITable = pFeatureWorkspace.OpenTable("Table$")

'テーブル結合に使用するキー フィールドを設定
'InputBpx 関数を使用して、ダイアログボックスにテキストを入力して設定します
Dim strOriginPrimaryKeyField As String = InputBox("結合先のキー フィールド名を入力します: ", "レイヤーにテーブルを結合する", "STATE_FIPS")
Dim strOriginForeignKeyField As String = InputBox("結合元のキー フィールド名を入力します: ", "レイヤーにテーブルを結合する", "STATE_FIPS")

'メモリ上にリレーションシップを作成
'MemoryRelationship クラスのオブジェクトを IMemoryRelationshipClassFactory 型で作成し、Open メソッドを使用して IRelationshipClass 型のオブジェクトを作成します
Dim factoryType2 As Type = Type.GetTypeFromProgID("esriGeodatabase.MemoryRelationshipClassFactory")
Dim pMemoryRelationshipClassFactory As IMemoryRelationshipClassFactory = CType(Activator.CreateInstance(factoryType2), IMemoryRelationshipClassFactory)
Dim pRelationshipClass As IRelationshipClass = pMemoryRelationshipClassFactory.Open("JoinTableToLayer", pTable, strOriginPrimaryKeyField, pLayer, strOriginForeignKeyField, "forward", "backward", esriRelCardinality.esriRelCardinalityOneToMany)

'テーブル結合を実行
'IDisplayRelationshipClass の DisplayRelationshipClass メソッドを実行してリレーションシップをフィーチャ レイヤーに結合します
Dim pDisplayRelationshipClass As IDisplayRelationshipClass = CType(pFeatureLayer, IDisplayRelationshipClass)
pDisplayRelationshipClass.DisplayRelationshipClass(pRelationshipClass, esriJoinType.esriLeftOuterJoin)
'テーブル オブ コンテンツの最上位レイヤーを取得
Dim pFeatureLayer As IFeatureLayer
Dim pDisplayTable As IDisplayTable
Dim pFeatureClass As IFeatureClass
Dim pLayer As ITable
Set pFeatureLayer = pMap.Layer(0)
Set pDisplayTable = pFeatureLayer
Set pLayer = pDisplayTable.DisplayTable 'Excel ファイルをテーブルとして取得 'ExcelWorkspaceFactory クラスを IWorkspaceFactory 型のオブジェクトとして作成します Dim pWorkspaceFactory As IWorkspaceFactory Dim pFeatureWorkspace As IFeatureWorkspace Dim pTable As ITable Set pWorkspaceFactory = New ExcelWorkspaceFactory Set pFeatureWorkspace = pWorkspaceFactory.OpenFromFile("D:\FAQ\JoinTable.xls", 0) Set pTable = pFeatureWorkspace.OpenTable("Table$") 'テーブル結合に使用するキー フィールドを設定 'InputBpx 関数を使用して、ダイアログボックスにテキストを入力して設定します Dim strOriginPrimaryKeyField As String Dim strOriginForeignKeyField As String strOriginPrimaryKeyField = InputBox("結合先のキー フィールド名を入力します: ", "レイヤーにテーブルを結合する", "STATE_FIPS") strOriginForeignKeyField = InputBox("結合元のキー フィールド名を入力します: ", "レイヤにーテーブルを結合する", "STATE_FIPS") 'メモリ上にリレーションシップを作成 'MemoryRelationship クラスのオブジェクトを IMemoryRelationshipClassFactory 型で作成し、Open メソッドを使用して IRelationshipClass 型のオブジェクトを作成します Dim pMemoryRelationshipClassFactory As IMemoryRelationshipClassFactory Dim pRelationshipClass As IRelationshipClass Set pMemoryRelationshipClassFactory = New MemoryRelationshipClassFactory Set pRelationshipClass = pMemoryRelationshipClassFactory.Open("TabletoLayer", pTable, strOriginPrimaryKeyField, pLayer, strOriginForeignKeyField, "forward", "backward", esriRelCardinalityOneToMany) 'テーブル結合を実行 'IDisplayRelationshipClass の DisplayRelationshipClass メソッドを実行してリレーションシップをフィーチャ レイヤーに結合します Dim pDisplayRelationshipClass As IDisplayRelationshipClass Set pDisplayRelationshipClass = pFeatureLayer pDisplayRelationshipClass.DisplayRelationshipClass pRelationshipClass, esriLeftOuterJoin

備考

*.xlsx 形式のファイルを読み込むには、Microsoft のコンポーネントのインストールが必要です。詳細は下記 FAQ を参照してください。

Excel ファイルを使用すると「基礎データベース エラー」等のエラーメッセージが表示される

メタデータ

種類

製品