FAQ
レイヤーのデータソースを変更する方法

ナレッジ番号:5330 | 登録日:2023/07/26 | 更新日:2024/11/21

概要

レイヤーのデータソースを変更する方法をご紹介いたします。

レイヤーのデータソースを変更するには、IFeatureLayer::FeatureClass プロパティを変更し、その後で IMapAdmin2::FireChangeFeatureClass メソッドを呼んでフィーチャクラスが変更されたことを通知します。

Image

サンプル コード

下記のサンプル コードでは、[コンテンツ] ウィンドウの最上位にあるレイヤーのデータソースを、指定のファイル ジオデータベースの中にある指定のフィーチャ データセットに格納されている、Chiba という名前のフィーチャクラスに変更します。
using ESRI.ArcGIS.ArcMapUI;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesGDB;

protected override void OnClick()
{
   //この例では、変更先のフィーチャクラスのワークスペースはファイルジオデータベースとする
   IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactoryClass();
   string strDatasource = @"C:\ArcMap\myFGDB.gdb";
   IWorkspace workspace = workspaceFactory.OpenFromFile(strDatasource, 0);
   // IWorkspaceからIFeatureWorkspaceへキャスト
   IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;

   //フィーチャデータセットをオープン
   string strFeatureDatasetName = "dataset";
   IFeatureDataset featureDataset = featureWorkspace.OpenFeatureDataset(strFeatureDatasetName);
   IFeatureClassContainer featureClassContainer = (IFeatureClassContainer)featureDataset;

   //フィーチャクラス(変更先)をオープン
   string strFeatureClassName = "Chiba";
   IFeatureClass newFeatureClass = featureClassContainer.get_ClassByName(strFeatureClassName);

   //マップの最上位のレイヤーを取得
   IMxDocument mxDocument = ArcMap.Document;
   IMap map = mxDocument.FocusMap;
   ILayer layer = map.get_Layer(0);
   IFeatureLayer featureLayer = (IFeatureLayer)layer;
   IFeatureClass oldFeatureClass = featureLayer.FeatureClass;

   //レイヤーのフィーチャクラスを変更
   featureLayer.FeatureClass = newFeatureClass;
   IMapAdmin2 mapAdmin2 = (IMapAdmin2)map;
   mapAdmin2.FireChangeFeatureClass(oldFeatureClass, newFeatureClass);

   //アクティブ ビューの範囲を新しいフィーチャクラスの範囲に合わせる
   IActiveView activeView = (IActiveView)map;
   IGeoDataset geoDataset = (IGeoDataset)featureLayer;
   activeView.Extent = geoDataset.Extent;  

   //マップの再描画
   activeView.Refresh();

   //[コンテンツ] ウィンドウの再描画
   IFeatureDataset newFeatureDataset = (IFeatureDataset)featureClassContainer;
   featureLayer.Name = newFeatureClass.AliasName;
   IContentsView contentsView = mxDocument.CurrentContentsView;
   contentsView.Refresh(null);
}
Imports ESRI.ArcGIS.ArcMapUI
Imports ESRI.ArcGIS.Carto
Imports ESRI.ArcGIS.Geodatabase
Imports ESRI.ArcGIS.DataSourcesGDB

Protected Overrides Sub OnClick()

   ' この例では、変更先のフィーチャクラスのワークスペースはファイル ジオデータベースとする
   Dim workspaceFactory As WorkspaceFactory = New FileGDBWorkspaceFactoryClass
   Dim strDatasource As String = "C:\ArcMap\myFGDB.gdb"
   Dim workspace As IWorkspace = workspaceFactory.OpenFromFile(strDatasource, 0)
   'IWorkspaceからIFeatureWorkspaceへキャスト
   Dim featureWorkspace As IFeatureWorkspace = CType(workspace, IFeatureWorkspace)

   'フィーチャデータセットをオープン
   Dim strFeatureDatasetName As String = "dataset"
   Dim featureDataset As IFeatureDataset = featureWorkspace.OpenFeatureDataset(strFeatureDatasetName)
   Dim featureClassContainer As IFeatureClassContainer = CType(featureDataset, IFeatureClassContainer)

   'フィーチャクラス(変更先)をオープン
   Dim strFeatureClassName As String = "Chiba"
   Dim newFeatureClass As IFeatureClass = featureClassContainer.ClassByName(strFeatureClassName)

   'マップの最上位のレイヤーを取得
   Dim mxDocument As IMxDocument = My.ArcMap.Document
   Dim map As IMap = mxDocument.FocusMap
   Dim layer As ILayer = map.Layer(0)
   Dim featureLayer As IFeatureLayer = CType(layer, IFeatureLayer)
   Dim oldFeatureClass As IFeatureClass = featureLayer.FeatureClass

   'レイヤーのフィーチャクラスを変更
   featureLayer.FeatureClass = newFeatureClass
   Dim mapAdmin2 As IMapAdmin2 = CType(map, IMapAdmin2)
   mapAdmin2.FireChangeFeatureClass(oldFeatureClass, newFeatureClass)

   'アクティブ ビューの範囲を新しいフィーチャクラスの範囲に合わせる
   Dim activeView As IActiveView = CType(map, IActiveView)
   Dim geoDataset As IGeoDataset = CType(featureLayer, IGeoDataset)
   activeView.Extent = geoDataset.Extent

   'マップの再描画
   activeView.Refresh()

   '[コンテンツ] ウィンドウの再描画
   Dim newFeatureDataset As IFeatureDataset = CType(featureClassContainer, IFeatureDataset)
   featureLayer.Name = newFeatureClass.AliasName
   Dim contentsView As IContentsView = mxDocument.CurrentContentsView
   contentsView.Refresh(Nothing)

End Sub

メタデータ

機能

種類

製品