¿Es posible devolver el perímetro límite (exterior) de una capa de polígono?
Digamos que tiene el mapa de los EE. UU., Por simplicidad, desglosado a nivel de condado, ¿es posible devolver el mapa de límites de todo el país desde ese mapa?
¿Es posible devolver el perímetro límite (exterior) de una capa de polígono?
Digamos que tiene el mapa de los EE. UU., Por simplicidad, desglosado a nivel de condado, ¿es posible devolver el mapa de límites de todo el país desde ese mapa?
Respuestas:
Puede hacer una disolución en la capa del condado (asegúrese de tener seleccionados solo los condados que desea disolver).
Permítame conectar mi propio proyecto ... Boundary Generator le proporcionará límites externos e internos de cada polígono (como entidades de línea).
Los límites internos se atribuyen con el FID para cada uno de los dos polígonos que comparten ese borde. Los límites externos deben tener un FID de cero para uno de esos dos, por lo que son fáciles de seleccionar del resultado completo.
Lo bueno de esto vs hacer disoluciones es que he agregado un par de botones sobre la precisión para que pueda manejar datos no del todo perfectos. (¿Qué tan separados deberían estar dos bordes poligonales para considerarse un borde compartido? ¿Cuánta desviación de ángulo se requiere?)
Todavía está en alfa y ha pasado un tiempo desde que aborde una actualización; ¡Me encantaría saber qué tan bien te funciona!
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;
}
}
Obtiene líneas cuando disuelve porque los límites no son transparentes.
Independientemente del producto de software, haga lo siguiente:
Haz una integración .
Luego disuelve .
Parece que la muestra Bounding Containers publicada en arcgis.com funcionará para lo que desea.
Sé que esta es una pregunta antigua, pero creo que la respuesta que acabo de encontrar se introdujo desde las anteriores aquí, así que la comparto para las personas que encuentran esto en una búsqueda.
QGIS (a partir de la versión 2.14 al menos), tiene un "Rellenar agujeros" en la caja de herramientas Procesamiento, en Geoalgoritmos de QGIS> Herramientas de geometría vectorial. Encuentro que disolver formas y luego ejecutar Fill Holes con el parámetro Max area set muy alto resuelve este problema.
También puede estar buscando lo que solía llamarse funcionalidad DROPLINE.
Aunque no sobrevivió a la transición de ArcInfo Workstation a ArcGIS Desktop, actualmente existe una idea de ArcGIS para restaurarlo:
Sería bueno tener la opción de soltar las líneas entre los polígonos que tienen los mismos valores para un campo específico. Esta funcionalidad solía estar disponible en ArcPlot como el comando DROPLINE y se usaba ampliamente como una forma de evitar crear un nuevo conjunto de datos con el comando disolver.
Puede usar la ST_UNION
función en PostGIS desde QGIS DB Manager para agregar todos los polígonos en la capa (o muchos grupos de polígonos en polígonos más grandes). De la documentación:
La variante 2 es una función agregada que toma un conjunto de geometrías y las une en una única ST_Geometry que no genera regiones que se crucen