私がやろうとしていることを説明できるかどうか見てみましょう。まず、レイヤー上の選択した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よりも簡単なことはありません。ツールボックス内のツールとしてクライアントに送信できます。私は真剣にこれを見ています。
—
毛深い