Посчитать количество шейпов на точку

0 голосов
спросил 09 Апр, 10 от Romancer (720 баллов) в категории Программные продукты Esri
    Помогите решить вопрос!
Есть слой с шейпами, некие ареалы распространения. Они перекрывают друг друга, таким образом в одной точке, один над другим, может находится несколько шейпов.
Необходимо создать грид/растер, который отображал бы количество шейпов на ячейку/пиксель.
То есть там, где на точку приходится одновременно 3 шейпа, значение было бы 3 и тп...
Как это сделать?
    

10 Ответы

0 голосов
ответил 09 Апр, 10 от self-improving1 (2,780 баллов)
Ммм... не факт, что понравится такой вариант, но что-то ничего больше пока в голову не приходит  Smile
1) Для каждого шейпа добавляется поле (del_1, del_2...del_n), в котором для всех объектов прописывается значение 1
2) Инструмент Union
3) В полученном шейпе добавляем новое поле и вычисляем как сумму всех этих поле del_n. Число = ваше кол-во шейпов для этой точки.
4) Если нужно обязательно в растр - Feature to Raster
Пункт 1, если шейпов много, можно прогнать через MB - все получится быстро и красиво  =)
0 голосов
ответил 09 Апр, 10 от Romancer (720 баллов)
спасибо за ответ, хотя думал конечно, что будет попроще =)
ладно, не ищем простых решений
но остается непонятным пункт 1
поле одно, а как в него вписать два значения? del_1 и 1?
и еще, шейпов действительно много (около 10 000) поэтому собственно про автоматизацию:
что такое МВ, и как это автоматизировать...
0 голосов
ответил 09 Апр, 10 от self-improving1 (2,780 баллов)
10 000?!.. Stern Smile  Предупреждать надо  ))))
У меня уже родилась пара альтернативных идей, но вот я не знаю, запустится ли хоть один инструмент Batch'ем для 10 000 шейпов?..
Вопрос скорее к гуру либо просто в воздух
0 голосов
ответил 09 Апр, 10 от self-improving1 (2,780 баллов)
В общем... прадлагаю вариант, но есть большой шанс, что с 10 000 файлов он загнется  )))  В любом случае, предварительно - попробуйте на 3-10, проверьте, все ли работает

1) Добавляем всем шейпам новое поле Del (например - можете называть как вам хочется). Add  Field в пакетном режиме (правая кнопка на инструменте -> Batch)
2) Вычисляем значение. Calculate Field в пакетном же режиме - присваиваем 1
3) Перегоняем все шейпы в растры. Feature to Raster в пакетном режиме
    а) Указываем наше поле Del
    б) Определяем общий экстент. Environments -> General -> Extent. Нужно, чтобы у всех полученных растров экстент был максимальный. У меня Union of Inputs не сработал. Можно создать шейп, покрывающий все, можно все шейпы закинуть в Group Layer - и выбрать экстент, как у него. Экспериментируйте.
4) Пересчет NoData в 0 (ноль). Reclassify в пакетном режиме
5) И, наконец-то, Cell Statistics. Никакого Batch, просто запускаете и добавляете все свои итоговые растры. Указываете тип SUM (сумма).
0 голосов
ответил 09 Апр, 10 от self-improving1 (2,780 баллов)
Чтобы найти все эти инструменты - в ArcToolbox используйте закладку Поиск.
При использовании Batch есть нюансы, которые могут сильно облегчить/усложнить вам жизнь (в зависимости от того, знаете вы их или нет Smile). Так что настоятельно рекомендую почитать справку  =)
0 голосов
ответил 09 Апр, 10 от Romancer (720 баллов)
пункт 3 вызывает вопросы...
перегоняем все шейпы в растры, то есть это мне 10 000 растров делать? =)
в любом случае споткнулся на тестовом файле из 100...
у меня один растр создает после Feature to Raster

ЗЫ и вопрос новичка, что значит в пакетном режиме?
0 голосов
ответил 09 Апр, 10 от pooperec (10,820 баллов)
А Вы ребята, я смотрю, не ищете лёгких путей =))))

Автоматизаторы - механизаторы епть )))

Вот VBA код для калькулятора поля:
'On Error Resume Next
Dim pMxDoc As IMxDocument
Dim pMap As IMap
Dim pGeometry as IGeometry
Dim pLayer As IFeatureLayer
Dim pFilter As ISpatialFilter
Dim pFeatureClass As IFeatureClass
Dim pFeatureCursor As IfeatureCursor
Dim pFeature as IFeature
Dim Output as integer

If (Not IsNull([Shape])) Then
  Set pGeometry = [Shape]
  If (Not pGeometry.IsEmpty) Then
    Set pFilter = New SpatialFilter
    With pFilter
    Set .Geometry = pGeometry
    .GeometryField = "SHAPE"
    .SpatialRel = esriSpatialRelIntersects
    End With
     Set pMxDoc =ThisDocument
     Set pMap = pMxDoc.FocusMap
     Set pLayer = pMap.Layer(0)
     Set pFeatureClass = pLayer.FeatureClass
     Set pFeatureCursor = pFeatureClass.Search(pFilter, False)
     Set pFeature = pFeatureCursor.NextFeature
     Do While (Not pFeature Is Nothing) 
        Output = Output +1
         Set pFeature = pFeatureCursor.NextFeature
     Loop
  End If
End If

./index.php?qa=blob&qa_blobid=6181656631284997873
0 голосов
ответил 11 Апр, 10 от self-improving1 (2,780 баллов)
хм
все-таки пора учится программировать  Smile
PS.  И нечего тут механизаторами обзываться )
0 голосов
ответил 14 Апр, 10 от dsavitskiy (10,720 баллов)
шейпов действительно много (около 10 000) поэтому собственно про автоматизацию:
...

Давайте, сразу называть вещи своими именами: шейпов может быть любое количество. А то людей в заблуждение вводите, они пытаются делать автоматизацию на уровне исполнения, а не архитектурно :) Я бы пошел по стандартному в этом случае для нормализованных БД пути: хранил бы отдельно таблицу связей с полями ID исходного полигона и ID с кпм он пересекся. Например, сделал через Relationship class связь один ко многим. Как только штатными инструментами такую таблицу заполнить в 12 ночи не скажу, чувствую что можно, но как конкретно, честное слово разбираться времени нет :)
    
0 голосов
ответил 29 Апр, 10 от Romancer (720 баллов)
Denis, я исходил из постановки проблемы, как она есть, при отсутствии таблиц с полями связи, собственно так тему и следовало воспринимать, а не "если бы, да кабы"
поэтому смысл вашего поста остался для меня загадкой, тем более вам было "честное слово разбираться времени нет"

всем остальным спасибо за помощь, pooperec за скрипт, self-improving за участие =) с меня пиво

ну и главный вывод
все-таки пора учится программировать (с)self-improving
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...