Рассчитать площадь перекрывающихся полигонов одной темы

Arcview GIS 3.x, Arcinfo Workstation, Mapobjects
Ответить
Rapt
Новоприбывший
Сообщения: 9
Зарегистрирован: 22 ноя 2008, 02:55
Репутация: 0

Рассчитать площадь перекрывающихся полигонов одной темы

Сообщение Rapt » 24 ноя 2008, 16:21

Есть буферная тема, построенная вокруг точек, причем буфер точки в виде отдельного полигона. Задача - рассчитать количество и площадь перекрывающихся полигонов-буферов, а в идеале вывести все перекрытия в отдельную тему, причем без наложения друг на друга. Можно ли это сделать как-нибудь? Ну или хотя бы на автомате произвести пересечение для всех полигонов в теме?
Иного способа не нашла, кроме как в Spatial Analyst считать плотность по методу Simle, задавая расстояние поиска (как для построения буфера). Но площадь перекрытий все равно приходится считать вручную, т.к. получившийся грид не конвертируется в шейп, а инструмент контур не обводит почему-то большинство перекрытий.

Аватара пользователя
Игорь
Интересующийся
Сообщения: 33
Зарегистрирован: 19 ноя 2008, 12:25
Репутация: 6

Re: Рассчитать площадь перекрывающихся полигонов одной темы

Сообщение Игорь » 25 ноя 2008, 05:41

На самом деле расчет плотности методом Simple неплох.
После того как посчитали делаем следующее.
Лезем на сайт http://arcscripts.esri.com/details.asp?dbid=11673
грузим расширение Грид-конвертер
элементарно конвертируем грид в шейп, причем легенда для шейпа создается автоматически такая же как у грида. полигоны создаются топологически выверенными, без пересечений, для полигонов переносится атрибутика грида - для каждой ячейки указывается гридкод. Значение гридкода минус еденица - это и есть количество пересечений.
Дальше считаем площадь для всех полигонов, в конструкторе запросов выбираем нужную для любого количества пересечений буферов ну и делаем с ней дальше что хотим.
На рисуночках видно что получилось из грида. Чтобы границы были менее кривые, размер ячейки надо увеличить на самом первом этапе расчета плотности.
Вложения
Untitled-2.jpg
результат конвертации в шейп
Untitled-2.jpg (35.72 КБ) 11553 просмотра
Untitled-1.jpg
расчет плотности методом Simple
Untitled-1.jpg (17.54 КБ) 11554 просмотра

geologic
Гуру
Сообщения: 852
Зарегистрирован: 15 сен 2005, 13:19
Репутация: 6
Откуда: москва
Контактная информация:

Re: Рассчитать площадь перекрывающихся полигонов одной темы

Сообщение geologic » 25 ноя 2008, 11:29

Это задача из разряда топологических . В ArcMap топология чинится (и изучается) штатными средстами. Если именно для AV, то есть модули разные, EdiTools... SantiTools... Для выделения наложений в отдельный файл есть удобный скрипт topocheck.ave - прорезает все наложения в слое (overlap), закрывает дыры (gaps) и маркирует эти новые полигоны - бывшие топо-ошибки - соответствующим атрибутом.
Последний раз редактировалось geologic 25 ноя 2008, 16:44, всего редактировалось 1 раз.

gis
Гуру
Сообщения: 515
Зарегистрирован: 24 янв 2007, 15:46
Репутация: 17
Откуда: Липецк
Контактная информация:

Re: Рассчитать площадь перекрывающихся полигонов одной темы

Сообщение gis » 25 ноя 2008, 12:18

Я вот тоже не могу понять зачем здесь Spatial Analyst.

Скриптов таких много, написать их просто а найти еще проще.

Вот пример скрипта - записывает все наложения одного объекта на другой.
Наложения трех и более объектов также ищутся повторным применением скрипта.
Скрипт написан за 20 минут - пришлось вспоминать авеню :)

В исходной теме должно быть поле id числовое с нумерацией объектов. Исходная тема должна быть активна.
Целевая тема должна быть полигональной и содержать текстовое поле IdText (куда будет записан какой с каким полигоном пересечен). Целевая тема должна стоять на редактировании.

Код: Выделить всё

theView = av.GetActiveDoc
theTheme = theView.GetActiveThemes.get(0)
theFTab = theTheme.GetFtab
shpFld = theFTab.FindField("shape")
idfld = theFTab.FindField("Id")
aList = List.Make
eFTab = theView.GetEditableTheme.getFtab
eshpFld = eFTab.FindField("shape")
eidfld = eFTab.FindField("IdText")
for each i in theFTab  
  TheShape = theFTab.ReturnValue(shpFld,i)
  theFTab.SelectByPolygon (TheShape,#VTAB_SELTYPE_NEW)
  TheID = theFTab.ReturnValue(idfld,i)
  for each rec in theFTab.GetSelection
    aShape = theFTab.ReturnValue(shpFld,rec)
    aID = theFTab.ReturnValue(idfld,rec)
    if (TheID > aID) then
      aString = aID.AsString + "@" + TheID.AsString
      if (aList.FindbyValue(aString) = -1) then
        inShape = TheShape.ReturnIntersection(aShape)
        aList.Add(aString)
        newRec = eFTab.AddRecord
        eFTab.SetValue(eshpFld,newRec,inShape)
        eFTab.SetValue(eidfld,newRec,aString)
      end
    elseif (TheID < aID) then
      aString = TheID.AsString + "@" + aID.AsString
      if (aList.Find(aString) = -1) then
        inShape = TheShape.ReturnIntersection(aShape)
        aList.Add(aString)
        newRec = eFTab.AddRecord
        eFTab.SetValue(eshpFld,newRec,inShape)
        eFTab.SetValue(eidfld,newRec,aString)
      end
    end    
  end
end

Аватара пользователя
Игорь
Интересующийся
Сообщения: 33
Зарегистрирован: 19 ноя 2008, 12:25
Репутация: 6

Re: Рассчитать площадь перекрывающихся полигонов одной темы

Сообщение Игорь » 25 ноя 2008, 15:39

Rapt писал(а): Задача - рассчитать количество и площадь перекрывающихся полигонов-буферов, а в идеале вывести все перекрытия в отдельную тему, причем без наложения друг на друга. Можно ли это сделать как-нибудь? Ну или хотя бы на автомате произвести пересечение для всех полигонов в теме?
В действительности Spatial Analyst необходим если требуется рассчитать площадь наложения для зон с определенным количеством наложений.
Если же надо рассчитать просто количество и площадь перекрытий и вывести их в отдельную тему с верной топологией - т.е. без перекрытий, то лучше конечно же использовать topocheck.ave, ссылку на который дал geologic. Этот скрипт из исходной темы создаст результирующую, в которой будут содержаться исходные, оверлейные и полигоны и дырки, а в стобце Type будет приведена информация о том оригинальный это полигон, наложение (Overlap) или дырка (Gap). Количество объектов с названием overlap и есть количество наложений. Вроде первая задача решена. Далее все наложения надо экспортировать в новый шейп, слить их. Запустить функцию Explode - разделение объектов не имеющих общей границы, которая есть в EditTools (см. ссылку ниже) и ряде других расширений (http://www.dataplus.ru/Root/Scripts/Vie ... criptID=91; http://arcscripts.esri.com/details.asp?dbid=10879; http://arcscripts.esri.com/details.asp?dbid=10531), после чего пересчитать площадь для всех объектов.

На автомате произвести пересечение всех полигонов в теме можно с помощью EditTools 3.6 for ArcView 3.2 Full http://www.ian-ko.com/downloads/et/ET36.zip
Для этого надо перевести тему в проекцию dd, начать редактирование темы и в меню расширения открыть Edit Theme/Clean - создается новый файл с выверенной топологией, в котором все пересечения в виде отдельных полигонов.
Как-то давно правда заметил глюк. Если из темы с множеством наложений скриптом topocheck.ave извлечь в отдельную тему наложения, а потом к ней применить Clean из ET, то создается определенное количество дубликатов полигонов, часть из которых невозможно вытравить даже с помощью скриптов поиска/удаления дубликатов, например http://gis-lab.info/qa/remove-duplicates.html - приходится искать и изводить вручную.

Rapt
Новоприбывший
Сообщения: 9
Зарегистрирован: 22 ноя 2008, 02:55
Репутация: 0

Re: Рассчитать площадь перекрывающихся полигонов одной темы

Сообщение Rapt » 25 ноя 2008, 16:34

Огромное всем спасибо! Ваша помощь просто неоценима.
:D Все оказывается просто когда знаешь что делать и где искать. А я пока еще только учусь методом тыков и кликов.

geologic
Гуру
Сообщения: 852
Зарегистрирован: 15 сен 2005, 13:19
Репутация: 6
Откуда: москва
Контактная информация:

Re: Рассчитать площадь перекрывающихся полигонов одной темы

Сообщение geologic » 25 ноя 2008, 16:52

Чтобы не применять вообще никаких скриптов, есть еще простой старый способ для правки топологии. Берется слой с дырками или наложениями, и UNIONится с пустым слоем. Все дырки и наложения автоматически прорезаются. Разумеется будут лишние полигоны-дубликаты, как и в вышеописанных случаях. С атрибутами придется возиться самостоятельно.

Как вариант Union можно делать не с пустым слоем, а со слоем-полигоном максимального размера. Глюков при этом меньше - правда, лишних полигонов больше (на один в каждой стопке).

Ответить

Вернуться в «Arcview GIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя