FAQ
ArcObjects でのカーソルを使用したフィーチャの検索

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

概要

フィーチャクラスから特定の条件に一致したフィーチャを取得するにはカーソルを使用します。カーソルには検索、更新、挿入の 3 種類がありますが、ここでは検索カーソルを使用して特定の条件に一致したフィーチャを抽出する方法について説明します。

フィーチャの検索は以下の手順で行います。

  1. 属性検索条件(QueryFilter)、もしくは空間検索条件(SpatialFilter)を作成します。
  2. フィーチャクラスに対して検索メソッド(Search)を実行します。
  3. 取得された FeatureCursor オブジェクトから個々のフィーチャを取得します。

テーブルに対して検索を行う場合は、ITable::Search メソッドを使用します。Cursor オブジェクトが戻り値として取得され、ICursor::NextRow メソッドで個々のレコードが取得できます。

コード

属性検索条件の作成

属性検索の条件を作成するには、QueryFilter クラスを使用します。ArcMap の [属性検索] ダイアログと同様に、SQL の Where 句を設定します。

IQueryFilter pQueryFilter = new QueryFilterClass();
pQueryFilter.WhereClause = "KEN = '東京都'";                             //Where 句を文字列で入力します。
Dim pQueryFilter As IQueryFilter = New QueryFilter()
pQueryFilter.WhereClause = "KEN = '東京都'"                              'Where 句を文字列で入力します。

空間検索条件の作成

空間検索の条件を作成するには、SpatialFilter クラスを使用します。ArcMap の空間検索ダイアログではレイヤを指定しますが、ArcObjects ではジオメトリ オブジェクトを指定します。

ISpatialFilter pSpatialFilter = new SpatialFilterClass();
pSpatialFilter.GeometryField = "Shape";                                 //ジオメトリ フィールドのフィールド名
pSpatialFilter.Geometry = pGeometry;                                    //pGeometry = ジオメトリ オブジェクト
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;  //空間検索方法(含む)
Dim pSpatialFilter As ISpatialFilter = New SpatialFilter()
pSpatialFilter.GeometryField = "Shape"                                  'ジオメトリ フィールドのフィールド名
pSpatialFilter.Geometry = pGeometry                                     'pGeomery = ジオメトリ オブジェクト
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains   '空間検索方法(含む)

検索の実行

フィーチャクラスに対して検索メソッド(IFeatureClass::Search)を実行します。第 1 引数に QueryFilter もしくは SpatialFilter をセットし、第 2 引数にはメモリのリサイクリングを行うかどうかを設定します。リサイクリングを True に設定するとパフォーマンスが向上しますが、カーソルに取得されたフィーチャを更新する場合は必ず False を設定してください。

IFeatureLayer pFeatureLayer = (IFeatureLayer)ArcMap.Document.FocusMap.get_Layer(0);
IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
IFeatureCursor pFeatureCursor = pFeatureClass.Search(pQueryFilter, true);
Dim pFeatureLayer As IFeatureLayer = CType(My.ArcMap.Document.FocusMap.Layer(0), IFeatureLayer)
Dim pFeatureClass As IFeatureClass = pFeatureLayer.FeatureClass
Dim pFeatureCursor As IFeatureCursor = pFeatureClass.Search(pQueryFilter, True)

フィーチャクラス内のすべてのフィーチャを取得したい場合は、Search メソッドの第 1 引数に null (Nothing) をセットします。

カーソルから個々のレコードを取得

検索メソッドの戻り値である Cursor(FeatureCursor)から個々のレコード(フィーチャ)を取得するには、NextRow もしくは NextFeature メソッドを実行します。カーソルに複数のレコードが含まれている場合は、NextRow もしくは NextFeature メソッドを繰り返し実行するごとに取得できます。

IFeature pFeature = pFeatureCursor.NextFeature();

while (pFeature != null)
{
    System.Diagnostics.Debug.WriteLine(pFeature.OID.ToString());         //フィーチャの ObjectID を取得
    pFeature = pFeatureCursor.NextFeature();
}
Dim pFeature As IFeature = pFeatureCursor.NextFeature()

Do While Not pFeature Is Nothing
   System.Diagnostics.Debug.WriteLine(pFeature.OID.ToString())           'フィーチャの ObjectID を取得
   pFeature = pFeatureCursor.NextFeature()
Loop

メタデータ

機能

種類

製品