ポリゴンレイヤーの境界(外側)境界を返すことはできますか?
簡単にするために、郡レベルに分解した米国の地図があるとしましょう。その地図から国全体の境界地図を返すことはできますか?
ポリゴンレイヤーの境界(外側)境界を返すことはできますか?
簡単にするために、郡レベルに分解した米国の地図があるとしましょう。その地図から国全体の境界地図を返すことはできますか?
回答:
郡レイヤーでディゾルブを実行できます(ディゾルブする郡だけを選択してください)。
自分のプロジェクトを接続できるようにします... 境界ジェネレーターは、すべてのポリゴンの外部境界と内部境界の両方を(ラインフィーチャとして)提供します。
内部境界は、その境界を共有する2つのポリゴンそれぞれのFIDに起因します。外部境界は、これら2つのうちの1つについてFIDがゼロであるべきであり、その結果、完全な結果から簡単に選択できます。
ディゾルブを実行するのと比較して良い点は、精度を上げるためにいくつかのノブを追加したので、完全ではないデータを処理できることです。(2つのポリゴン境界線を共有境界線と見なすにはどのくらい離れている必要がありますか?どれくらいの角度偏差が必要ですか?)
まだアルファ版であり、アップデートに取り組んでからしばらく経ちました。どれだけ効果があるか聞いてみたい!
public static IPolygon getPolygonFromLayer(ILayer layer)
{
IFeatureLayer FLayer = layer as IFeatureLayer;
IFeatureClass FClass = FLayer.FeatureClass;
return polygonMerge(FClass);
}
private static IPolygon polygonMerge(IFeatureClass featureClass)
{
if (featureClass == null) return null;
IGeoDataset geoDataset = featureClass as IGeoDataset;
//You can use a spatial filter to create a subset of features to union together.
//To do that, uncomment the next line, and set the properties of the spatial filter here.
//Also, change the first parameter in the IFeatureCursor.Seach method.
//ISpatialFilter queryFilter = new SpatialFilterClass();
IGeometry geometryBag = new GeometryBagClass();
//Define the spatial reference of the bag before adding geometries to it.
geometryBag.SpatialReference = geoDataset.SpatialReference;
//Use a nonrecycling cursor so each returned geometry is a separate object.
IFeatureCursor featureCursor = featureClass.Search(null, false);
IGeometryCollection geometryCollection = geometryBag as IGeometryCollection;
IFeature currentFeature = featureCursor.NextFeature();
while (currentFeature != null)
{
//Add a reference to this feature's geometry to the bag.
//Since you don't specify the before or after geometry (missing),
//the currentFeature.Shape IGeometry is added to the end of the geometryCollection.
object missing = Type.Missing;
geometryCollection.AddGeometry(currentFeature.Shape, ref missing, ref missing);
currentFeature = featureCursor.NextFeature();
}
// Create the polygon that will be the union of the features returned from the search cursor.
// The spatial reference of this feature does not need to be set ahead of time. The
// ConstructUnion method defines the constructed polygon's spatial reference to be the
// same as the input geometry bag.
ITopologicalOperator unionedPolygon = new PolygonClass();
unionedPolygon.ConstructUnion(geometryBag as IEnumGeometry);
return unionedPolygon as IPolygon;
}
}
これは古い質問であることはわかっていますが、今見つけた答えは前回の質問以降に導入されたものだと思いますので、検索で見つけた人のために共有します。
QGIS(少なくともバージョン2.14以降)では、QGIS地理アルゴリズム>ベクトルジオメトリツールの下の[処理]ツールボックスに「穴を埋める」機能があります。図形をディゾルブしてから、最大領域パラメータを非常に高く設定して穴埋めを実行すると、この問題が解決することがわかりました。
以前はDROPLINE機能と呼ばれていたものを探している場合もあります。
これは、ArcInfo WorkstationからArcGIS Desktopへの移行後も存続しませんでしたが、現在、ArcGISのアイデアにより、復元することができます。
指定されたフィールドに同じ値を持つポリゴン間のラインをドロップするオプションがあると便利です。この機能は、以前はArcPlotでDROPLINEコマンドとして利用可能でしたが、dissolveコマンドで新しいデータセットを作成しないようにする方法として広く使用されていました。