選択した複数のフィーチャから1つのジオメトリへのジオメトリ


8

私がやろうとしていることを説明できるかどうか見てみましょう。まず、レイヤー上の選択した1つのフィーチャ(ポリゴン)を取得し、そのフィーチャのジオメトリを取得してSQL Serverデータベースに保存できる、ArcMapのアドインを開発しました。私がしたいことは、個別のジオメトリ(つまり、フィーチャ/ジオメトリごとに1行)ではなく、選択したポリゴンを含む1つの「ジオメトリのピース」として、選択した複数のフィーチャを保存することです。これは私がこれまでに持っているコードです:

IFeatureLayer featureLayer = ArcMap.Document.CurrentContentsView.SelectedItem as IFeatureLayer;
        if (featureLayer != null)
        {
            IFeatureSelection featSel = featureLayer as IFeatureSelection;
            IEnumIDs idList = featSel.SelectionSet.IDs;

            int index = idList.Next();
            List<int> indexes = new List<int>();

            while (index != -1)
            {
                indexes.Add(index);
                index = idList.Next();
            }

            IFeatureClass featureClass = featureLayer.FeatureClass;
            IFeature feature = featureClass.GetFeature(indexes[0]);
            IGeometry geometry = feature.Shape as IGeometry;
            // Save to database
        }

ご覧のように、選択したレイヤーの選択したフィーチャのすべてのインデックスを取得し、ジオメトリを取得できます。課題は、すべてのジオメトリを1つに「連結」することです。

助言がありますか?

PS ...そしてあなたがidListをループするより良い方法を持っているなら...私に知らせてください:)

更新:

ペトルの大きな感謝!あなたの指示に従って、それは最初の試みでうまくいきました!

これが私が終わったコードです:

IFeatureSelection featSel = featureLayer as IFeatureSelection;

                if (featSel.SelectionSet.Count > 0)
                {
                    ITopologicalOperator resultPolygon = new Polygon() as ITopologicalOperator;
                    IGeometryCollection geometriesToUnion = new GeometryBag() as IGeometryCollection;

                    ICursor cursor;
                    featSel.SelectionSet.Search(null, false, out cursor);

                    IFeatureCursor featureCursor = cursor as IFeatureCursor;
                    IFeature feature;
                    while ((feature = featureCursor.NextFeature()) != null)
                    {
                        geometriesToUnion.AddGeometry(feature.Shape as IGeometry);
                    }

                    resultPolygon.ConstructUnion(geometriesToUnion as IEnumGeometry);

                    // Save resultPolygon to a database
                }

余談ですが、これを複雑なスクリプトにすることを考えましたか?それは物事を行うためのはるかに簡単な方法です。
毛深い

@毛深い-私はarcpyの経験がないので、.... :)上記のコードは、お客様に送信するアドインの一部であると言えます。アドインを選択したのは、お客様ができる限り簡単にできるようにするためでした:)
Claus_L

私が今まで使った中で最も簡単な言語の1つであるpythonよりも簡単なことはありません。ツールボックス内のツールとしてクライアントに送信できます。私は真剣にこれを見ています。
毛深い

回答:


8

ITopologicalOperator.ConstructUnionを使用できます。

手順は次のとおりです。

  1. Polygonクラスのインスタンスを作成し、それをにキャストしITopologicalOperatorます。このポリゴンインスタンスには結果が含まれます。
  2. ITopologicalOperator.ConstructUnionIEnumGeometryunionにジオメトリを指定するために(または連結すると)をとるのでGeometryBag、を実装するクラスのインスタンスを作成しますIEnumGeometry
  3. IGeometryCollectionソースポリゴンを追加できるように、ジオメトリバッグをにキャストします。
  4. ITopologicalOperator.ConstructUnionステップ1で作成したポリゴンのメソッドにジオメトリバッグを渡します。

選択の列挙に関する限り、IDのリストを取得してすべてのIDの行を取得する方法は非常に非効率的です。IFeatureSelection.SelectionSet.Search()メソッドだけを使用すると、パフォーマンスが大幅に向上します。null選択にすべての機能が必要なため、このメソッドを呼び出すときにクエリフィルター引数を指定します。結果は、列挙可能なカーソルになります。


GIS初心者を支援してくれてありがとう!完璧に動作しました:)
Claus_L

1
要素を追加SpatialReferenceするGeometryBag前にを設定する必要がありました。そうでなければ、ConstructUnion失敗します。
gumo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.