FAQ
不正なジオメトリを正して有効にする方法

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

概要

既存のフィーチャに変更を施したり、フィーチャを作成する場合、フィーチャに保存されたジオメトリは幾何的に正しく、または単純 (Simple) でなければなりません。ArcGIS はフィーチャから取得したジオメトリは シンプルであることを前提にしています。 ジオメトリを評価したり、単純化するのを可能にするメソッドはたくさんあります。 特定のジオメトリ型に限定されているメソッドもあれば、より特殊な単純化を行うものもあります。 以下のサンプルコードはある入力ジオメトリに対して、その型に応じてジオメトリを単純化し、そして単純化したジオメトリを返します。

サンプル コード

public IGeometry SimplifyGeometry(IGeometry geometry)
{
    if (geometry == null)
        return null;
    //IsKnownSimple プロパティを false にします。 そうしないと単純化が行われません。
    ITopologicalOperator2 topoOp = geometry as ITopologicalOperator2;
    topoOp.IsKnownSimple_2 = false;
    switch (geometry.GeometryType)
    {
        case esriGeometryType.esriGeometryMultipoint:
            // マルチポイントの場合
              topoOp.Simplify();
            break;
        case esriGeometryType.esriGeometryPolygon:
      // ポリゴンの場合
            ((IPolygon)geometry).SimplifyPreserveFromTo();
            break;
              // SimplifyPreserveFromTo は ITopologicalOperator::Simplify と同じ方法でがポリゴンを単純化しますが単純化が完了した後で SimplifyPreserveFromTo は
        // 既存のリングの元の始点、終点が単純化の結果として残るように各リングを再構築します。新しく作成されたリングは再構築されません。
     case esriGeometryType.esriGeometryPolyline:
              // ポリラインの場合
            if (geometry is IPolyline6)
                ((IPolyline6)geometry).SimplifyNonPlanar();
              //長さ0のセグメント(2次元における0)を取り除き、1つのパートの幾何学的配置が広がる方向に逆らうセグメントを再構築します。
                //このメソッドは SimplifyNetwork と似ていますが、終点が共有されている箇所でパートがマージされることはありません。
            else
                ((IPolyline)geometry).SimplifyNetwork();
                //長さ0のセグメント(2次元における0)を取り除き、互いに接続する終点でパートをマージし、ひとつのパートの幾何学的配置が広がる方向に逆らうセグメントを再構築します。
            break;
        default:
            break;
    }
    return geometry;
}
Public Function SimplifyGeometry(ByVal geometry As IGeometry) As IGeometry
    If geometry Is Nothing Then
        Return Nothing
    End If
   ' IsKnownSimple プロパティを false にします。 そうしないと単純化が行われません。
    Dim topoOp As ITopologicalOperator2 = TryCast(geometry, ITopologicalOperator2)
    topoOp.IsKnownSimple_2 = False
    
    Select Case geometry.GeometryType
        Case esriGeometryType.esriGeometryMultipoint
                'マルチポイントの場合
            topoOp.Simplify()
            Exit Select
        Case esriGeometryType.esriGeometryPolygon
                'ポリゴンの場合
            DirectCast(geometry, IPolygon).SimplifyPreserveFromTo()
                '既存のリングの元の始点、終点が単純化の結果として残るように各リングを再構築します。新しく作成されたリングは再構築されません。
            Exit Select
        Case esriGeometryType.esriGeometryPolyline
                'ポリラインの場合
            If TypeOf geometry Is IPolyline6 Then
                DirectCast(geometry, IPolyline6).SimplifyNonPlanar()
                '長さ0のセグメント(2次元における0)を取り除き、ひとつのパートの幾何学的配置が広がる方向に逆らうセグメントを再構築します。
                  'このメソッドは SimplifyNetwork と似ていますが、終点が共有されている箇所でパートがマージされることはありません。
            Else
                DirectCast(geometry, IPolyline).SimplifyNetwork()
                '長さ0のセグメント(2次元における0)を取り除き、互いに接続する終点でパートをマージし、ひとつのパートの幾何学的配置が広がる方向に逆らうセグメントを再構築します。
            End If
            Exit Select
        Case Else
            Exit Select
    End Select
    Return geometry
End Function

参考情報

Simplifying a feature geometry

メタデータ

機能

種類

製品