É possível retornar o perímetro do limite (externo) de uma camada de polígono?
Digamos que você tenha o mapa dos EUA, para simplificar, discriminado no nível do condado, é possível retornar o mapa de fronteira de todo o país a partir desse mapa?
É possível retornar o perímetro do limite (externo) de uma camada de polígono?
Digamos que você tenha o mapa dos EUA, para simplificar, discriminado no nível do condado, é possível retornar o mapa de fronteira de todo o país a partir desse mapa?
Respostas:
Você pode apenas fazer uma dissolução na camada do condado (não deixe de selecionar apenas os municípios que deseja dissolver).
Permita-me conectar meu próprio projeto ... O Boundary Generator fornecerá limites externos e internos de cada polígono (como recursos de linha).
Os limites internos são atribuídos com o FID para cada um dos dois polígonos que compartilham essa borda. Os limites externos devem ter um FID zero para um desses dois, para facilitar a seleção do resultado completo.
O bom de fazer vs dissolver é que adicionei alguns botões sobre a precisão para que ele possa lidar com dados não muito perfeitos. (Qual a distância entre duas bordas poligonais a ser considerada uma borda compartilhada? Quanto desvio angular é necessário?)
Ainda está em alfa e já faz um tempo desde que eu lidei com uma atualização; Eu adoraria ouvir como isso funciona para você!
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;
}
}
Você recebe linhas quando dissolve porque os limites não são perfeitos.
Independentemente do produto de software, faça o seguinte:
Faça uma integração .

Então faça uma dissolução .

Parece que o exemplo de Bounding Containers publicado em arcgis.com funcionará para o que você deseja.
Sei que essa é uma pergunta antiga, mas acho que a resposta que acabei de encontrar foi apresentada desde as anteriores aqui, por isso estou compartilhando-a com as pessoas que a encontrarem em uma pesquisa.
O QGIS (a partir da versão 2.14, pelo menos) possui um "Preencher furos" na caixa de ferramentas Processamento, em QGIS geoalgoritmos> Ferramentas de geometria vetorial. Acho que a dissolução de formas e a execução de Fill Holes com o parâmetro Max area set muito alto resolve esse problema.
Você também pode estar procurando o que costumava ser chamado de funcionalidade DROPLINE.
Embora não tenha sobrevivido à transição da Estação de Trabalho ArcInfo para ArcGIS Desktop, atualmente existe uma idéia do ArcGIS para restaurá-lo:
Seria bom ter a opção de eliminar as linhas entre polígonos que têm os mesmos valores para um campo especificado. Essa funcionalidade costumava estar disponível no ArcPlot como o comando DROPLINE e era amplamente usada como uma maneira de evitar a criação de um novo conjunto de dados com o comando dissolve.
Você pode usar a ST_UNIONfunção no PostGIS do QGIS DB Manager para agregar todos os polígonos da camada (ou muitos grupos de polígonos em polígonos maiores). A partir da documentação:
A variante 2 é uma função agregada que pega um conjunto de geometrias e as une em uma única ST_Geometry, resultando em nenhuma região que se cruza