Підрахунок перекриваючих полігонів з одного Shapefile за допомогою ArcGIS Desktop?


10

У мене формуляр з 16 400 полігонами. Кожен багатокутник показує розширення виду птахів на весь світ.

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

Тепер мені належить порахувати перекриваються багатокутники. Я спробував це з об'єднанням і розпустити (порахуйте союз), але союз не працює для такої кількості багатокутників.

Тоді я спробував обрізати континенти, але це теж не працює через величезну кількість полігонів. Більше того, я спробував цей метод , також без успіху.

Тому я запитую вас, чи існує спосіб підрахунку полігонів, що перекриваються, якщо 16400 багатокутників знаходяться в одному форматі?

Я працюю з 10.0 і можу працювати з 10.2. Рішення ArcPy також чудове.

На даний момент я замислююся над тим, щоб створити риб’ячу мережу і проітеравати над рядами SHP з полігонами 16400 і записати 1 у поле значення осередку ажурної мережі, якщо полігон знаходиться в цій комірці, а потім візьмемо наступний рядок (багатокутник) і якщо це також є в осередку ажурної мережі +1.

Але я не знаю, чи це хороше рішення, і як його реалізувати. Або я повинен навчитися R використовувати цей підхід.

Результат: Це має бути форма, де у вас є нові багатокутники поза перекриваються, і поле, де рахуються перекриття.

Отже, зрештою має бути файл форми, де можна побачити, скільки видів птахів зустрічається на одному місці.


ваша проблема - проблема через розмір вашого набору даних. Відповіді (і посилання, яке ви пропонуєте) правильні, але у вас виникнуть проблеми з пам’яттю. Можливо, ви могли б спершу спробувати інтегрувати свої дані на кілька сотень метрів (виходячи з очікуваної точності), щоб уникнути створення мільярдів полігонів ковзання). Обов’язково працюйте над копією, оскільки вона змінить ваші дані.
radouxju

1
Розділіть наш файл форм на регіональні файли, а потім запустіть аналіз на регіональних файлах, а потім розпустіть їх, щоб отримати повний файл знову.
til_b

Я спробував вирізати цю фігуру лише з однією країною, але повернувся з помилкою 999999.
Нора

1
Ви переглянули інструмент Dice для зменшення складності ваших багатокутників? Крім того, якщо ви отримуєте помилку 999999, просто намагаючись вирізати ваші дані, ви спробували інструмент перевірки геометрії, щоб побачити, чи не підводить якісь уявлення?
Hornbydd

2
Я зробив часткову перевірку геометрії даних і є багато самопересічень. Я б запропонував 1. Забезпечити максимальне використання оперативної пам’яті та великий файл сторінок 2. відновлення геометрії 3. При необхідності спростіть полігони 3. підмножину даних до 1/3s або 1/4s (або що потрібно) 4. Запустіть робочий процес Union-Dissolve-Rasterize як у цій відповіді 5. Підсумуйте растри.
Cotton.Rockwood

Відповіді:


9

Я рекомендую скористатися інструментом " Перерахування функцій (Аналіз)" .

Створює заплановані функції перекриття із вхідних функцій. Кількість функцій, що перекриваються, записується на вихідні функції.

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


Я також спробував це, і він не працює для мого SHP (занадто великий). дякую за відповідь
Нора

1
@Aaron посилання мертва. Зараз ця версія
Альберт

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))

Для наведених вище зразків даних код поверне наступні підрахунки перекриття: введіть тут опис зображення

Код, як є, повертає рахунки лише для полігонів, що мають принаймні одне перекриття.


@ Nxau: Гаразд, я думаю, я помилився, пояснивши, як повинен виглядати результат. Це має бути форма, де у вас є нові багатокутники із перекриваючихся. Наприклад, на вашому малюнку кола 4 і 5 перекриваються. Нова форма повинна мати три багатокутники. (Союз не працює для цієї великої форми). Область перекриття повинна мати значення 2 у полі, а решта кіл 4 і 5 повинні мати значення 1 у цьому полі. Отже, зрештою має бути файл форми, де можна побачити, скільки видів птахів зустрічається на одному місці. Дякуємо за ваш сценарій!
Нора

5

Дуже простий метод:

  1. Союз шейпфайл з самим собою;
  2. Перетворення багаточастинного виводу в одну частину ;
  3. Використовуйте інструмент просторового з'єднання для підрахунку перекриттів (використовуйте параметр відповідності ARE_IDENTICAL_TO);
  4. Символізуйте за допомогою join_countполя.

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


1

Напевно, ви спробували цей метод: підрахунок та растрування перекриттів полігонів у ArcGIS Desktop?

16 400 багатокутників не так вже й багато. Однак одне потенційне рішення - просто зробити звичайний просторовий приєднання. В ArcMap toolbox, > Analysis Tools -> Overlap -> Spatial Join.

Встановіть targetі joinтой самий набір даних та функції та вкажіть вихід. Залиште інші налаштування.

Через кілька моментів вам слід повернути файл форми, який містить стовпчик "кількість приєднань". Відніміть 1 з цього (як очевидно, кожна ознака повинна перетинатися), і це має бути кількість "перекриттів" (фактично перетинається) для кожного багатокутника.

Я щойно виконував це


Так, я вже спробував підхід за посиланням. Але використовувати об'єднання неможливо для цього шп. Спробуючи просторове приєднання, я повернув це: ПОМИЛКА 000426: Поза пам'яттю.
Нора

Я працюю на машині з просто 4 ГБ оперативної пам’яті і мав приблизно в 5 разів більше функцій, тому я здивований, що вона не працює зі значно меншим числом. У вас може бути занадто багато вершин у ваших даних (у мене було близько 60 Мб; наскільки великий ваш .shp файл?). Спробуйте узагальнити його.
GIS-Jonathan

Якщо просто shp знаходиться у fgdb, у fgdb є 1,73 ГБ. У папці форма має 2,00 Гб.
Нора

Я також використав цей набір даних, і я думаю, що багато проблем виникають через те, що досить багато полігонів мають багато частин. Це в поєднанні з резолюцією робить це дуже важким завданням.
Cotton.Rockwood

@ Cotton.Rockwood: І ви знайдете рішення в R, правда? Я думаю використовувати панель інструментів «Підрахунок полігонів, що перекриваються» з введенням 500 многокутників (33 вибору), ніж багатокутник для растру зі значенням «приєднати підрахунок» і в кінці обчислити растр (ModelBuilder). Проходить багато часу ...
Нора

1

Я завантажив і спробував інструмент "Полігони, що перекриваються". Це може спрацювати, але це займає жахливо тривалий час (можливо, тому що розмір файлу, але мій вхідний FC лише мав <5000 записів).

Поки я чекав запуску цього інструменту, я відкрив ще одне вікно ArcMap, і для того, щоб отримати те, що потрібно, було потрібно лише кілька швидких кроків. 1) Просторове приєднання - використовуючи той самий клас функцій, що і цільові та приєднатися, та вибравши опцію "Приєднатись до багатьох". 2) Dissolve - використовуючи вихід з останнього кроку. Використовуйте "TARGET_FID" як поле для розчинення, а для статистики ви можете ПІДПИСАТИ поле "Join_Count" або ЗРОБИТИ поле "JOIN_FID". 3) У вихідному файлі з кроку 2 за допомогою калькулятора поля віднімайте 1 з поля статистики ("SUM_Join_Count" або "COUNT_JOIN_FID") - оскільки кожна функція перетинається сама.

Я пропоную використати цей метод через інструмент "Полігон, що перекривається". Я почав запускати інструмент COP за 5 хвилин до того, як запустити цей метод Join-> Dissolve, і це дало мені результат з достатньою кількістю часу, щоб написати це до того, як інструмент "Count Overlopping Polygon" ще закінчився.

Сподіваюся, це допомагає!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.