Считаете ли вы перекрывающиеся полигоны из одного шейп-файла с помощью ArcGIS Desktop?

10

У меня есть шейп-файл с 16 400 полигонами. Каждый полигон показывает распространение вида птиц на весь мир.

введите описание изображения здесь

Теперь я должен посчитать перекрывающиеся полигоны. Я попробовал это с объединением и распадением (считайте объединение), но объединение не работает для очень многих полигонов.

Затем я попытался обрезать континенты, но это также не работает из-за огромного количества полигонов. Более того, я попробовал этот метод , также безуспешно.

Поэтому я спрашиваю вас, есть ли способ подсчета перекрывающихся полигонов, если 16400 полигонов находятся в одном шейп-файле?

Я работаю с 10.0 и могу работать с 10.2. Решение ArcPy также прекрасно.

В данный момент я думаю о создании рыболовной сети и итерации по строкам shp с 16400 полигонами и записи 1 в поле значения ячейки рыболовной сети, если многоугольник находится в этой ячейке, а затем взять следующую строку (многоугольник) и если это также в числе ячеек ажурной сети +1.

Но я не знаю, является ли это хорошим решением и как его реализовать. Или я должен изучить R, чтобы использовать этот подход.

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

Таким образом, в конце должен быть шейп-файл, где вы можете увидеть, сколько видов птиц найдено в одном и том же месте.

Нора
источник
ваша проблема - проблема из-за размера вашего набора данных. Ответы (и предлагаемая вами ссылка) верны, но у вас будут проблемы с памятью. Возможно, вы могли бы сначала попробовать интегрировать ваши данные с несколькими сотнями метров (исходя из ожидаемой точности), чтобы избежать создания миллиардов изрезанных полигонов). Обязательно работайте с копией, потому что это изменит ваши данные.
Radouxju
1
Разделите наш шейп-файл на региональные шейп-файлы, затем запустите анализ региональных шейп-файлов, затем распустите их, чтобы снова получить полный файл.
til_b
Я попытался обрезать эту форму только с одной страной, но получил ошибку 999999.
Нора
1
Вы смотрели на инструмент Dice, чтобы уменьшить сложность ваших полигонов? Кроме того, если вы получаете сообщение об ошибке 999999, просто пытаясь обрезать ваши данные, вы пробовали использовать инструмент проверки геометрии, чтобы увидеть, не выдает ли какой-либо смысл?
Хорнбидд
2
Я сделал частичную проверку геометрии данных, и есть много самопересечений. Я бы посоветовал: 1. Обеспечить максимальное использование ОЗУ и большой файл подкачки 2. Восстановить геометрию 3. При необходимости упростить полигоны 3. Подмножество данных должно составлять 1/3 или 1/4 (или что угодно) 4. Запустить рабочий процесс Union-Dissolve-Rasterize как в этом ответе 5. Суммируйте растры.
Коттон.Роквуд

Ответы:

9

Я бы порекомендовал использовать инструмент Count Overlapping Features (Analysis) .

Создает плоские перекрывающиеся элементы из входных объектов. Количество перекрывающихся элементов записывается в выходные элементы.

введите описание изображения здесь

Аарон
источник
Я также попробовал это, и это не работает для моего shp (слишком большой). спасибо за ответ
Нора
1
@ Аарон, ссылка мертва. В Pro теперь есть такая реализация: pro.arcgis.com/en/pro-app/tool-reference/analysis/…
Альберт
1
Спасибо @Albert, пост был обновлен на основе ваших рекомендаций.
Аарон
5

Используя лексемы геометрии arcpy, вы можете попробовать что-то вроде этого:

введите описание изображения здесь

import os
import arcpy

arcpy.env.workspace = r"" #path to workspace
arcpy.env.overwriteOutput = 1

polygon_fc = r"" #path to polygon fc

base = [row for row in arcpy.da.SearchCursor(polygon_fc,["OID@","SHAPE@"])]
compare = base

overlaps_stats = {}

for b in base:
    for c in compare:
        if b[1].overlaps(c[1]):
            #print "{0} overlaps {1}".format(b[0],c[0])
            if overlap_stats.has_key(b[0]):
                overlap_stats[b[0]].append(c[0])
            else:
                overlap_stats[b[0]] = [c[0]]

for key,value in overlap_stats.iteritems():
    print "Polygon {0}:  Overlaps: {1}.".format(key,len(value))

Для приведенных выше примеров данных код вернет следующее число совпадений: введите описание изображения здесь

Код как есть будет возвращать счетчики только для тех многоугольников, у которых есть хотя бы одно перекрытие.

Nxaunxau
источник
@ Nxau: Ладно, я допустил ошибку, объяснив, как должен выглядеть результат. Это должна быть форма, в которой у вас есть новые полигоны из перекрывающихся. Например, на вашей картинке круги 4 и 5 перекрываются. Новая форма должна иметь три полигона. (Союз не работает для этой большой фигуры). Область перекрытия должна иметь значение 2 в поле, а остальные кружки 4 и 5 должны иметь значение 1 в этом поле. Таким образом, в конце должен быть шейп-файл, где вы можете увидеть, сколько видов птиц найдено в одном и том же месте. Спасибо за ваш сценарий!
Нора
5

Очень простой метод:

  1. Союз шейпфайл с самим собой;
  2. Преобразовать многочастный вывод в одну часть ;
  3. Используйте инструмент пространственного соединения для подсчета перекрытий (используйте опцию соответствия ARE_IDENTICAL_TO);
  4. Символизировать с помощью join_countполя.

введите описание изображения здесь

user2856
источник
1

Я полагаю, вы пробовали этот метод: подсчитывать и растеризовывать перекрытия полигонов в ArcGIS Desktop?

16 400 полигонов не так много. Тем не менее, одним из возможных решений является простое регулярное пространственное соединение. В ArcMap toolbox, > Analysis Tools -> Overlap -> Spatial Join.

Задайте для обоих объектов targetи joinобъектов один и тот же набор данных и укажите выходные данные. Оставьте остальные настройки.

Через несколько секунд вы должны получить шейп-файл, который содержит столбец «количество соединений». Вычтите 1 из этого (как, очевидно, каждый объект должен пересекаться сам), и это должно быть количество «перекрытий» (фактически пересечений) для каждого многоугольника.

Я просто выполнил это на

ГИС-Jonathan
источник
Да, я уже попробовал подход по ссылке. Но использовать союз невозможно для этого лг. Попытка пространственного соединения Я получил это обратно: ОШИБКА 000426: Недостаточно памяти.
Нора
Я использую его на машине с 4 ГБ ОЗУ и примерно в 5 раз больше функций, поэтому я удивлен, что он не работает с гораздо меньшим числом. В ваших данных может быть слишком много вершин (у меня было около 60 МБ; насколько велик ваш файл .shp?). Попробуйте обобщить это.
ГИС-Джонатан
Если в fgdb находится только shp, то у fgdb есть 1,73 ГБ. В папке форма имеет 2,00 ГБ.
Нора
Я также использовал этот набор данных и думаю, что многие проблемы возникают из-за того, что довольно много полигонов имеют много частей. Это в сочетании с резолюцией делает это очень трудоемкой задачей.
Коттон.Роквуд
@ Cotton.Rockwood: И вы найдете решение в R, верно? Я думаю об использовании панели инструментов «Количество перекрывающихся многоугольников» с вводом 500 полигонов (33 выбора), а не полигона в растр со значением «число соединений» и в конце расчета растра (ModelBuilder). Это занимает много времени ...
Нора
1

Я скачал и попробовал инструмент «Подсчет перекрывающихся полигонов». Это может работать, но это занимает очень много времени (вероятно, из-за размера файла, но мой входной FC имел только <5000 записей).

Пока я ждал запуска этого инструмента, я открыл еще одно окно ArcMap, и мне потребовалось всего несколько быстрых шагов, чтобы получить то, что я хотел. 1) Пространственное соединение - использование того же класса пространственных объектов, что и в объектах Target и Join, и выбор опции «Соединить один со многими». 2) Растворить - используя вывод последнего шага. Используйте «TARGET_FID» в качестве поля растворения, а для статистики вы можете СУММАТЬ поле «Join_Count» или СЧИТАТЬ поле «JOIN_FID». 3) В выходном файле из шага 2 используйте калькулятор поля, вычтите 1 из поля статистики («SUM_Join_Count» или «COUNT_JOIN_FID») - поскольку каждая функция пересекается сама.

Я предлагаю использовать этот метод над инструментом «Count Overlapping Polygon». Я начал запускать инструмент COP ~ за 5 минут до запуска этого метода Join-> Dissolve, и он дал мне результат с достаточным количеством времени, чтобы записать его еще до того, как инструмент «Count Overlapping Polygon» даже закончил.

Надеюсь это поможет!

Брайан в Буффало
источник