Рассчитать площадь перекрывающихся полигонов одной темы
-
- Новоприбывший
- Сообщения: 9
- Зарегистрирован: 22 ноя 2008, 02:55
- Репутация: 0
Рассчитать площадь перекрывающихся полигонов одной темы
Есть буферная тема, построенная вокруг точек, причем буфер точки в виде отдельного полигона. Задача - рассчитать количество и площадь перекрывающихся полигонов-буферов, а в идеале вывести все перекрытия в отдельную тему, причем без наложения друг на друга. Можно ли это сделать как-нибудь? Ну или хотя бы на автомате произвести пересечение для всех полигонов в теме?
Иного способа не нашла, кроме как в Spatial Analyst считать плотность по методу Simle, задавая расстояние поиска (как для построения буфера). Но площадь перекрытий все равно приходится считать вручную, т.к. получившийся грид не конвертируется в шейп, а инструмент контур не обводит почему-то большинство перекрытий.
Иного способа не нашла, кроме как в Spatial Analyst считать плотность по методу Simle, задавая расстояние поиска (как для построения буфера). Но площадь перекрытий все равно приходится считать вручную, т.к. получившийся грид не конвертируется в шейп, а инструмент контур не обводит почему-то большинство перекрытий.
- Игорь
- Интересующийся
- Сообщения: 33
- Зарегистрирован: 19 ноя 2008, 12:25
- Репутация: 6
Re: Рассчитать площадь перекрывающихся полигонов одной темы
На самом деле расчет плотности методом Simple неплох.
После того как посчитали делаем следующее.
Лезем на сайт http://arcscripts.esri.com/details.asp?dbid=11673
грузим расширение Грид-конвертер
элементарно конвертируем грид в шейп, причем легенда для шейпа создается автоматически такая же как у грида. полигоны создаются топологически выверенными, без пересечений, для полигонов переносится атрибутика грида - для каждой ячейки указывается гридкод. Значение гридкода минус еденица - это и есть количество пересечений.
Дальше считаем площадь для всех полигонов, в конструкторе запросов выбираем нужную для любого количества пересечений буферов ну и делаем с ней дальше что хотим.
На рисуночках видно что получилось из грида. Чтобы границы были менее кривые, размер ячейки надо увеличить на самом первом этапе расчета плотности.
После того как посчитали делаем следующее.
Лезем на сайт http://arcscripts.esri.com/details.asp?dbid=11673
грузим расширение Грид-конвертер
элементарно конвертируем грид в шейп, причем легенда для шейпа создается автоматически такая же как у грида. полигоны создаются топологически выверенными, без пересечений, для полигонов переносится атрибутика грида - для каждой ячейки указывается гридкод. Значение гридкода минус еденица - это и есть количество пересечений.
Дальше считаем площадь для всех полигонов, в конструкторе запросов выбираем нужную для любого количества пересечений буферов ну и делаем с ней дальше что хотим.
На рисуночках видно что получилось из грида. Чтобы границы были менее кривые, размер ячейки надо увеличить на самом первом этапе расчета плотности.
- Вложения
-
- результат конвертации в шейп
- Untitled-2.jpg (35.72 КБ) 11614 просмотров
-
- расчет плотности методом Simple
- Untitled-1.jpg (17.54 КБ) 11615 просмотров
-
- Гуру
- Сообщения: 852
- Зарегистрирован: 15 сен 2005, 13:19
- Репутация: 6
- Откуда: москва
- Контактная информация:
Re: Рассчитать площадь перекрывающихся полигонов одной темы
Это задача из разряда топологических . В ArcMap топология чинится (и изучается) штатными средстами. Если именно для AV, то есть модули разные, EdiTools... SantiTools... Для выделения наложений в отдельный файл есть удобный скрипт topocheck.ave - прорезает все наложения в слое (overlap), закрывает дыры (gaps) и маркирует эти новые полигоны - бывшие топо-ошибки - соответствующим атрибутом.
Последний раз редактировалось geologic 25 ноя 2008, 16:44, всего редактировалось 1 раз.
-
- Гуру
- Сообщения: 515
- Зарегистрирован: 24 янв 2007, 15:46
- Репутация: 17
- Откуда: Липецк
- Контактная информация:
Re: Рассчитать площадь перекрывающихся полигонов одной темы
Я вот тоже не могу понять зачем здесь Spatial Analyst.
Скриптов таких много, написать их просто а найти еще проще.
Вот пример скрипта - записывает все наложения одного объекта на другой.
Наложения трех и более объектов также ищутся повторным применением скрипта.
Скрипт написан за 20 минут - пришлось вспоминать авеню
В исходной теме должно быть поле id числовое с нумерацией объектов. Исходная тема должна быть активна.
Целевая тема должна быть полигональной и содержать текстовое поле IdText (куда будет записан какой с каким полигоном пересечен). Целевая тема должна стоять на редактировании.
Скриптов таких много, написать их просто а найти еще проще.
Вот пример скрипта - записывает все наложения одного объекта на другой.
Наложения трех и более объектов также ищутся повторным применением скрипта.
Скрипт написан за 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: Рассчитать площадь перекрывающихся полигонов одной темы
В действительности Spatial Analyst необходим если требуется рассчитать площадь наложения для зон с определенным количеством наложений.Rapt писал(а): Задача - рассчитать количество и площадь перекрывающихся полигонов-буферов, а в идеале вывести все перекрытия в отдельную тему, причем без наложения друг на друга. Можно ли это сделать как-нибудь? Ну или хотя бы на автомате произвести пересечение для всех полигонов в теме?
Если же надо рассчитать просто количество и площадь перекрытий и вывести их в отдельную тему с верной топологией - т.е. без перекрытий, то лучше конечно же использовать 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 - приходится искать и изводить вручную.
-
- Новоприбывший
- Сообщения: 9
- Зарегистрирован: 22 ноя 2008, 02:55
- Репутация: 0
Re: Рассчитать площадь перекрывающихся полигонов одной темы
Огромное всем спасибо! Ваша помощь просто неоценима.
Все оказывается просто когда знаешь что делать и где искать. А я пока еще только учусь методом тыков и кликов.
Все оказывается просто когда знаешь что делать и где искать. А я пока еще только учусь методом тыков и кликов.
-
- Гуру
- Сообщения: 852
- Зарегистрирован: 15 сен 2005, 13:19
- Репутация: 6
- Откуда: москва
- Контактная информация:
Re: Рассчитать площадь перекрывающихся полигонов одной темы
Чтобы не применять вообще никаких скриптов, есть еще простой старый способ для правки топологии. Берется слой с дырками или наложениями, и UNIONится с пустым слоем. Все дырки и наложения автоматически прорезаются. Разумеется будут лишние полигоны-дубликаты, как и в вышеописанных случаях. С атрибутами придется возиться самостоятельно.
Как вариант Union можно делать не с пустым слоем, а со слоем-полигоном максимального размера. Глюков при этом меньше - правда, лишних полигонов больше (на один в каждой стопке).
Как вариант Union можно делать не с пустым слоем, а со слоем-полигоном максимального размера. Глюков при этом меньше - правда, лишних полигонов больше (на один в каждой стопке).
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 32 гостя