Извлечь границу из детализированных слоев в ArcGIS Desktop или QGIS?


10

Можно ли вернуть граничный (внешний) периметр многоугольного слоя?

Допустим, у вас есть карта США, для простоты с разбивкой до уровня графства, возможно ли вернуть карту границ всей страны с этой карты?


Таким образом, в примере США, вы имеете в виду на самом деле получить план штатов, а не ограничивающий прямоугольник, верно? Если так, то как насчет растворения слоя округов?
Чед Купер

@Chad Cooper - когда я распускаю слой, у меня все еще появляются линии для округов и штатов.
Дассуки

Ответы:


6

Вы можете просто расторгнуть слой округа (убедитесь, что выбраны только округа, которые вы хотите распустить).


Я получаю некоторые внутренние линии, все еще появляющиеся в распаде.
Дассуки

3
Можете ли вы буферизовать дважды, чтобы устранить внутренние линии? Выйти, чтобы «съесть» линии, а затем обратно, чтобы восстановить первоначальный размер.
mwalker

по какой-то причине это сработало. Я знаю, что это «самые хакерские» решения, но это было единственное решение, которое избавилось от линий
dassouki

1
+1 Это действительно отличное решение. Он работает, приспосабливая крошечные осколки и перекрытия в многоугольниках компонентов (а также преодолевает многие присущие ошибки в программном обеспечении).
whuber

1
Я воспользовался советом mwalker для буферизации. Надеюсь, вы можете включить это в свой ответ.
Дассуки

4

Вы можете использовать модуль GRASS: v.dissolve вам нужно только импортировать ваши данные в GRASS. Вот скриншот передачи ваших данных в Grass из QGis.


3

Позвольте мне подключить свой собственный проект ... Boundary Generator предоставит вам как внешние, так и внутренние границы каждого полигона (в виде линейных объектов).

Внутренние границы приписываются FID для каждого из двух полигонов, которые разделяют эту границу. Внешние границы должны иметь 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;
        }

    }

2

Вы получаете линии, когда вы делаете растворение, потому что границы не являются бесшовными.

Независимо от программного продукта, сделайте следующее:

Сделать интеграцию . альтернативный текст

Тогда распускайся . альтернативный текст


Я пробовал это несколько раз, и это не сработало :(, я продолжаю терять некоторые полигоны, я использовал очень маленький и очень большой
допуск

1

Похоже, образец Bounding Containers, размещенный на arcgis.com, будет работать для того, что вы хотите.


Это хорошая мысль, но вряд ли это решение сработает в этом направлении. Он предназначен для предоставления дополнительной геометрической информации об элементах путем нахождения наименьшего члена класса фигур, который содержит элементы, такие как прямоугольник, круг, эллипс или выпуклый многоугольник. Результат всегда один из тех, которые содержат фигуры. В общем, оно не будет точно совпадать с исходной формой, если эта граница уже не имеет желаемой формы.
whuber

1

Я знаю, что это старый вопрос, но я думаю, что ответ, который я только что нашел, был введен после предыдущих здесь, поэтому я делюсь им с людьми, которые находят это в поиске.

В QGIS (по крайней мере, начиная с версии 2.14) есть «Заполнить отверстия» в наборе инструментов Обработка, в разделе геоалгоритмы QGIS> Инструменты геометрии Vectory. Я считаю, что растворение форм, а затем запуск Fill Holes с очень высоким параметром Max area решает эту проблему.


0

Вы также можете искать то, что раньше называлось функциональностью DROPLINE.

Хотя он не пережил переход ArcInfo Workstation к ArcGIS Desktop, в настоящее время существует идея ArcGIS для его восстановления:

Было бы неплохо иметь возможность отбрасывать линии между полигонами, которые имеют одинаковые значения для указанного поля. Эта функциональность раньше была доступна в ArcPlot как команда DROPLINE и широко использовалась как способ избежать создания нового набора данных с помощью команды disolve.


0

Вы можете использовать ST_UNIONфункцию в PostGIS из QGIS DB Manager для объединения всех многоугольников в слое (или многих групп многоугольников в более крупные многоугольники). Из документации:

Вариант 2 - это агрегатная функция, которая берет набор геометрий и объединяет их в одну ST_Geometry, что приводит к отсутствию пересекающихся областей

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.