FAQ
ArcObjects でのフィーチャの選択

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

概要

フィーチャを選択することにより、マップ上でフィーチャのサブセットを特定したり、操作したりすることができます。多くの場合、選択したフィーチャは、データを検索、調査、解析、編集する際に使用します。選択を適用することで、統計を計算したり、属性を表示したり、マップ レイヤーを構成するフィーチャを編集または定義するフィーチャを指定できます。

ArcMap の標準 GUI では、 属性検索空間検索対話形式での操作によってフィーチャを選択することができます。ここでは、ArcObjects を使用してフィーチャを選択したり、選択されたフィーチャの情報を取得する方法について説明します。

フィーチャを選択する方法

IFeatureSelection::SelectFeatures メソッドによりフィーチャを選択します。第 1 引数にクエリ フィルターを指定し、第 2 引数にどのような選択を行うかを指定します。第 2 引数の定数は以下のとおりです。

  • esriSelectionResultEnum.esriSelectionResultNew           :フィーチャを新規に選択します。
  • esriSelectionResultEnum.esriSelectionResultAdd            :既存の選択セットに追加します。
  • esriSelectionResultEnum.esriSelectionResultSubtract      :既存の選択セットから削除します。
  • esriSelectionResultEnum.esriSelectionResultAnd            :選択結果から絞り込んで選択します。
  • esriSelectionResultEnum.esriSelectionResultXOR           :選択結果から排他的論理和で選択します。

第 3 引数を True に設定すると、選択対象のフィーチャが 1 つ見つかった時点で処理を停止します。あらかじめ選択対象のフィーチャが 1 つしか存在しないことが分かっている場合に処理のパフォーマンスを上げることに役立ちます。

選択されたフィーチャ情報の取得

選択されたフィーチャの情報は、SelectionSet オブジェクトで管理されます。ISelectionSet の主なメンバーは以下のとおりです。

  • Count プロパティ    :選択フィーチャ数
  • IDs プロパティ        :選択されたフィーチャの ObjectID の列挙
  • Add メソッド          :既存の選択セットに ObjectID を指定して 選択フィーチャを追加
  • Search メソッド      :現在の選択セット内のフィーチャをカーソルに格納
  • Select メソッド       :クエリ フィルターを使用してフィーチャを選択

サンプル コード

条件に一致したフィーチャを選択

特定のフィーチャ レイヤーに対してクエリ フィルターで指定した条件に一致するフィーチャを選択します。

//条件を指定
IQueryFilter pQueryFilter = new QueryFilterClass();
pQueryFilter.WhereClause = "KEN = '東京都'";

//最上位のレイヤーを取得
IMxDocument pMxDocument = ArcMap.Document;
IMap pMap = pMxDocument.FocusMap;
ILayer pLayer = pMap.get_Layer(0);

//条件に一致するフィーチャを選択状態にする
IFeatureLayer   pFeatureLayer = (IFeatureLayer)pLayer;
IFeatureSelection pFeatureSelection = (IFeatureSelection)pFeatureLayer;
pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, false);

//ビューの再描画
pMxDocument.ActiveView.Refresh();
'条件を指定
Dim pQueryFilter As IQueryFilter = New QueryFilterClass()
pQueryFilter.WhereClause = "KEN = '東京都'"

'最上位のレイヤーを取得
Dim pMxDocument As IMxDocument = My.ArcMap.Document
Dim pMap As IMap = pMxDocument.FocusMap
Dim pLayer As ILayer = pMap.Layer(0)

'条件に一致するフィーチャを選択状態にする
Dim pFeatureLayer As IFeatureLayer = CType(pLayer, IFeatureLayer)
Dim pFeatureSelection As IFeatureSelection = CType(pFeatureLayer, IFeatureSelection)
pFeatureSelection.SelectFeatures(pQueryFilter, esriSelectionResultEnum.esriSelectionResultNew, False)

'ビューの再描画
pMxDocument.ActiveView.Refresh()

フィーチャ レイヤーから現在選択されているフィーチャを取得

 //最上位レイヤーの取得
IFeatureSelection pFeatureSelection = (IFeatureSelection)ArcMap.Document.FocusMap.get_Layer(0);
ISelectionSet pSelectionSet = pFeatureSelection.SelectionSet;

//選択フィーチャ数を出力
System.Diagnostics.Debug.WriteLine(pSelectionSet.Count.ToString());

IEnumIDs pEnumIDs = pSelectionSet.IDs;
pEnumIDs.Reset();
int ID = pEnumIDs.Next();

while (ID != -1)
{
    //ObjectID を出力
    System.Diagnostics.Debug.WriteLine(ID.ToString());
    ID = pEnumIDs.Next();
}
'最上位レイヤーの取得
Dim pFeatureSelection As IFeatureSelection = DirectCast(ArcMap.Document.FocusMap.Layer(0), IFeatureSelection) 
Dim pSelectionSet As ISelectionSet = pFeatureSelection.SelectionSet

'選択フィーチャ数を出力
System.Diagnostics.Debug.WriteLine(pSelectionSet.Count.ToString())

Dim pEnumIDs As IEnumIDs = pSelectionSet.IDs
pEnumIDs.Reset()
Dim ID As Integer = pEnumIDs.Next()

Do While ID <> -1
     'ObjectID を出力
     System.Diagnostics.Debug.WriteLine(ID.ToString())     
     ID = pEnumIDs.Next()
Loop

マップ上で現在選択されているフィーチャを取得

//アクティブなデータ フレームを取得
IMap pMap = ArcMap.Document.FocusMap; 

IEnumFeature pEnumFeature = (IEnumFeature)pMap.FeatureSelection;
IEnumFeatureSetup pEnumFeatureSetup = (IEnumFeatureSetup)pEnumFeature;
pEnumFeatureSetup.AllFields = true;

//読み取り専用の場合 true, 属性を変更する場合は false
pEnumFeatureSetup.Recycling = true; 

IFeature pFeature = pEnumFeature.Next();

while (pFeature != null)
{
    //選択しているフィーチャのエイリアス名の取得 & 出力
    System.Diagnostics.Debug.WriteLine(pFeature.Class.AliasName); 
    //選択しているフィーチャの ObjectID取得 & 出力
   System.Diagnostics.Debug.WriteLine(pFeature.OID.ToString());   
    pFeature = pEnumFeature.Next();
}
'アクティブなデータ フレームを取得
Dim pMap As IMap = ArcMap.Document.FocusMap 
Dim pEnumFeature As IEnumFeature = CType(pMap.FeatureSelection, IEnumFeature)

Dim pEnumFeatureSetup As IEnumFeatureSetup = CType(pEnumFeature, IEnumFeatureSetup)
pEnumFeatureSetup.AllFields = True

'読み取り専用の場合 True, 属性を変更する場合 False
pEnumFeatureSetup.Recycling = True 
Dim pFeature As IFeature = pEnumFeature.Next()

Do While Not pFeature Is Nothing
    '選択しているフィーチャのエイリアス名の取得&出力
    System.Diagnostics.Debug.WriteLine(pFeature.Class.AliasName) 
     '選択しているフィーチャの ObjectID
    System.Diagnostics.Debug.WriteLine(pFeature.OID.ToString())
    pFeature = pEnumFeature.Next()
Loop

編集可能なフィーチャを取得

編集セッション内でフィーチャを選択した場合には、編集することができるフィーチャを取得することができます。その場合、IEditor::EditSelection プロパティでフィーチャ (群) を取得することができます。
編集可能なフィーチャの数をカウントするには、IEditor::SelectionCount プロパティで取得します。

//IEditor クラスのオブジェクトを取得
IEditor sEditor = ArcMap.Application.FindExtensionByName("ESRI Object Editor") as IEditor;
//選択したフィーチャのうち、編集可能なフィーチャを取得
IEnumFeature enumFeature = sEditor.EditSelection;
enumFeature.Reset();
IFeature selFeature = enumFeature.Next();
//取得したフィーチャ数分ループ
for (int fCount = 0; fCount < sEditor.SelectionCount; fCount++)
{
    //ジオメトリを取得
    IGeometry selGeometry = selFeature.Shape;
    //ジオメトリタイプ、OIDとフィーチャクラス名を表示
    MessageBox.Show(selGeometry.GeometryType.ToString() +", " +  selFeature.Class.AliasName + ", " + selFeature.OID.ToString());
    selFeature = enumFeature.Next();
}

参考情報

メタデータ

機能

種類

製品