Можно ли вернуть граничный (внешний) периметр многоугольного слоя?
Допустим, у вас есть карта США, для простоты с разбивкой до уровня графства, возможно ли вернуть карту границ всей страны с этой карты?
Можно ли вернуть граничный (внешний) периметр многоугольного слоя?
Допустим, у вас есть карта США, для простоты с разбивкой до уровня графства, возможно ли вернуть карту границ всей страны с этой карты?
Ответы:
Вы можете просто расторгнуть слой округа (убедитесь, что выбраны только округа, которые вы хотите распустить).
Позвольте мне подключить свой собственный проект ... Boundary Generator предоставит вам как внешние, так и внутренние границы каждого полигона (в виде линейных объектов).
Внутренние границы приписываются FID для каждого из двух полигонов, которые разделяют эту границу. Внешние границы должны иметь FID, равный нулю для одного из этих двух, чтобы их было легко выбрать из полного результата.
Хорошая вещь в этом отношении против распада - это то, что я добавил пару ручек по точности, чтобы он мог работать с не совсем идеальными данными. (Как далеко друг от друга следует считать две границы многоугольника общей границей? Какое отклонение угла требуется?)
Он все еще в альфа-версии, и я давно уже занимался обновлением; Я хотел бы услышать, как хорошо это работает для вас!
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;
}
}
Вы получаете линии, когда вы делаете растворение, потому что границы не являются бесшовными.
Независимо от программного продукта, сделайте следующее:
Сделать интеграцию .
Тогда распускайся .
Похоже, образец Bounding Containers, размещенный на arcgis.com, будет работать для того, что вы хотите.
Я знаю, что это старый вопрос, но я думаю, что ответ, который я только что нашел, был введен после предыдущих здесь, поэтому я делюсь им с людьми, которые находят это в поиске.
В QGIS (по крайней мере, начиная с версии 2.14) есть «Заполнить отверстия» в наборе инструментов Обработка, в разделе геоалгоритмы QGIS> Инструменты геометрии Vectory. Я считаю, что растворение форм, а затем запуск Fill Holes с очень высоким параметром Max area решает эту проблему.
Вы также можете искать то, что раньше называлось функциональностью DROPLINE.
Хотя он не пережил переход ArcInfo Workstation к ArcGIS Desktop, в настоящее время существует идея ArcGIS для его восстановления:
Было бы неплохо иметь возможность отбрасывать линии между полигонами, которые имеют одинаковые значения для указанного поля. Эта функциональность раньше была доступна в ArcPlot как команда DROPLINE и широко использовалась как способ избежать создания нового набора данных с помощью команды disolve.
Вы можете использовать ST_UNION
функцию в PostGIS из QGIS DB Manager для объединения всех многоугольников в слое (или многих групп многоугольников в более крупные многоугольники). Из документации:
Вариант 2 - это агрегатная функция, которая берет набор геометрий и объединяет их в одну ST_Geometry, что приводит к отсутствию пересекающихся областей