Czy możliwe jest zwrócenie granicy (zewnętrznej) obwodu warstwy wielokąta?
Załóżmy, że masz mapę USA, dla uproszczenia, w podziale na poziom powiatu, czy możliwe jest przywrócenie mapy granicznej całego kraju z tej mapy?
Czy możliwe jest zwrócenie granicy (zewnętrznej) obwodu warstwy wielokąta?
Załóżmy, że masz mapę USA, dla uproszczenia, w podziale na poziom powiatu, czy możliwe jest przywrócenie mapy granicznej całego kraju z tej mapy?
Odpowiedzi:
Możesz po prostu wykonać rozłożenie na poziomie powiatu (pamiętaj, aby wybrać tylko powiaty, które chcesz rozwiązać).
Pozwól mi podłączyć mój własny projekt ... Generator granic da ci zarówno zewnętrzne, jak i wewnętrzne granice każdego wielokąta (jako cechy linii).
Granice wewnętrzne są przypisywane do FID dla każdego z dwóch wielokątów, które dzielą tę granicę. Granice zewnętrzne powinny mieć FID równy zero dla jednego z tych dwóch, więc można je łatwo wybrać z pełnego wyniku.
Zaletą tego rozwiązania jest to, że dodałem kilka pokręteł w porównaniu z precyzją, aby poradzić sobie z niezupełnie doskonałymi danymi. (Jak daleko od siebie należy uznać dwie granice wielokąta za granicę wspólną? Ile wymagane jest odchylenie kąta?)
Nadal jest w fazie alfa i minęło trochę czasu, odkąd zająłem się aktualizacją; Chciałbym usłyszeć, jak dobrze to dla Ciebie działa!
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;
}
}
Twoje linie pobierania podczas rozpuszczania, ponieważ granice nie są płynne.
Niezależnie od oprogramowania wykonaj następujące czynności:
Zrobić zintegrować .
Następnie wykonaj rozpuszczenie .
Wygląda na to, że próbka Bounding Containers opublikowana na arcgis.com będzie działać dla tego, czego chcesz.
Wiem, że to stare pytanie, ale myślę, że odpowiedź, którą właśnie znalazłem, została wprowadzona od poprzednich tutaj, więc dzielę się nią z osobami, które znajdą to podczas wyszukiwania.
QGIS (przynajmniej od wersji 2.14) ma „Wypełnij dziury” w przyborniku Przetwarzanie, w obszarze Geo-algorytmy QGIS> Narzędzia geometrii wektorowej. Uważam, że rozpuszczenie kształtów, a następnie uruchomienie wypełnienia otworów z ustawionym bardzo wysokim parametrem obszaru Max rozwiązuje ten problem.
Być może szukasz czegoś, co nazywało się DROPLINE.
Chociaż nie przetrwał przejścia ArcInfo Workstation na ArcGIS Desktop, obecnie istnieje pomysł ArcGIS, aby go przywrócić:
Byłoby miło mieć opcję upuszczenia linii między wielokątami, które mają takie same wartości dla określonego pola. Ta funkcja była dostępna w ArcPlot jako polecenie DROPLINE i była szeroko stosowana jako sposób na uniknięcie tworzenia nowego zestawu danych za pomocą polecenia rozpuszczania.
Możesz użyć ST_UNION
funkcji w PostGIS z QGIS DB Manager do agregacji wszystkich wielokątów w warstwie (lub wielu grup wielokątów w większe wielokąty). Z dokumentacji:
Wariant 2 to funkcja agregująca, która pobiera zestaw geometrii i łączy je w jedną geometrię ST_, w wyniku czego nie ma przecinających się regionów