フィーチャのジオメトリが不正かどうかを判定する方法

      2015/02/10

ArcGIS Destkopの[エディタ]ツールバーでフィーチャの形状を描く限り,基本的には図形の形状は正しく作成されますが,他社ソフトやArcView 3.xなどで作成したデータをArcGISに読み込む際に,ArcGISが認識できない不正なジオメトリを格納してしまう可能性があります。

これは,「ArcGISの空間演算はジオデータベースで行っている」ということと,「シェープファイルの仕様と,ジオデータベースの仕様は異なる」ということを知っている人なら理解できるのですが,「シェープファイルはESRIが作ったフォーマットだからArcGISのデータはシェープファイルではないといけない。」なんて言われてる方々にとってはショッキングなことでしょう。

シェープファイルはArcGISのネイティブ フォーマットではなく,インポート・エクスポート形式の一種だと考えるのが妥当だと思います。 仕様の違いについてですが,たとえばシェープファイルの座標空間は浮動小数点型なのに対し,ArcGISのジオメトリ 座標空間は53bitの長整数型で保持します。このとき,シェープファイルを直接編集したり,ジオプロセシング処理などを行うと一旦内部的にはデータ フォーマットをジオデータベースに変換してから処理を行うため,頂点のシフトや場合によっては欠損となる場合があります。

また,コーディングや高度なフィールド演算によってジオメトリを作成させた場合は,ArcGISでは正しく認識できない不正なジオメトリを作成することもできてしまいます。

これを防ぐために,ArcGISにはArcToolboxに「ジオメトリのチェック」ツールや「ジオメトリの修正」ツールが用意されていますが,あまり使えるツールじゃないと世間では言われてるみたいです。ただ,「他社のソフトで作ったシェープファイルが自社のArcGISフォーマットに準拠しているかどうかを完全に検査できる訳がない。」というのが実情だと思います。そもそもシェープファイルの仕様では座標精度や許容値なんて定義されていないのですから。 その検査方法ですが,ジオプロセシング ツールとArcObjectsの2種類で検査できます。

ArcGIS Desktop(ArcToolbox)

[ジオメトリのチェック]ツールでは,フィーチャクラスを指定すると,該当フィーチャのObjectIDとエラー種類を返してくれるテーブルを出力します。[ジオメトリの修正]ツールでは,フィーチャクラスを指定すると,ArcGISで正しく認識できるジオメトリにフィーチャの形状を修正してくれます。このうち,上述の仕様によってセグメント長が短かったりするとセグ面を消去し,結果としてジオメトリ形状がNullになってフィーチャを削除するような修正を行う場合もあるので,バックアップが必要です。 [ArcToolbox] > [データ管理 ツール]> [フィーチャ] > [ジオメトリのチェック] [ArcToolbox] > [データ管理 ツール]> [フィーチャ] > [ジオメトリの修正]

ArcObjects

ArcObjectsを使うと,フィーチャクラス単位ではなく,ジオメトリ単位でエラーのチェックができて,よりきめ細かい検査ができます。

'ジオメトリを取得
Dim pGeometry As IGeometry
Set pGeometry = pFeature.Shape

Dim pTopologicalOperator  As ITopologicalOperator3
Set pTopologicalOperator = pGeometry        'QI

pTopologicalOperator.IsKnownSimple = False  'あらかじめIsKnownSimpleをFalseに設定

Debug.Print pTopologicalOperator.IsSimple   'ジオメトリがシンプルであるかどうか判定

If pGeometry.GeometryType = esriGeometryPolygon Or pGeometry.GeometryType = esriGeometryPolyline Then
    Dim reason As esriNonSimpleReasonEnum
    reason = esriNonSimpleOK

    Debug.Print pTopologicalOperator.IsSimpleEx(reason) 'Trueの場合シンプル
    Debug.Print reason  'エラー種別の取得.
    pTopologicalOperator.Simpily  'ジオメトリの修正

End If

ArcGIS(厳密にはArcInfo 8.0)がリリースされてからもうすぐ10年になるんだから,そろそろジオデータベース中心の世の中になって欲しいところです。

 - ArcGIS, ArcObjects, GIS