Определение линейных размеров полигонов в ArcGis

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
AndreyL
Завсегдатай
Сообщения: 483
Зарегистрирован: 17 авг 2006, 14:04
Репутация: 0
Откуда: Новосибирск

Сообщение AndreyL » 26 ноя 2007, 18:53

Накидал на VBA поиск оптимального угла для четырех случаев (минимальная площадь, периметр, ширина и максимальная длина) – минимаксы дают фигуры, близкие к квадратам. Кто напишет оболочку?

Борис
Интересующийся
Сообщения: 36
Зарегистрирован: 22 ноя 2005, 12:32
Репутация: 0

Сообщение Борис » 26 ноя 2007, 19:07

отлично :!: , думаю это интересно многим :)
в ArcGis-скриптонаписании я новичок :oops: , так что надеюсь на помощь общественности :wink:

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9128
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 747
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Сообщение Максим Дубинин » 28 ноя 2007, 07:51

попробую, только быстро не обещаю
пристегивайтесь, турбулентность прямо по курсу

AndreyL
Завсегдатай
Сообщения: 483
Зарегистрирован: 17 авг 2006, 14:04
Репутация: 0
Откуда: Новосибирск

Сообщение AndreyL » 28 ноя 2007, 17:57

Максим, и все заинтересованные! Предлагаю для обсуждения такой вариант инструмента (делать, так делать):
на входе линейная или полигональная тема и способ оценки
на выходе в таблицу темы добавляем длину, ширину, угол поворота прямоугольника, его площадь, периметр и центр (можно по желанию клиента, тогда на входе нужно предусмотреть выбор добавляемых параметров)
дополнительно можно построить новую тему прямоугольников (на входе нужно будет предусмотреть крыжик и имя темы) – эта штука все равно пригодится при отладке.
Для работы алгоритма понадобится цикл, вытаскивающий вертексы каждого полигона (или линии) в массив, и записывающий нужные атрибуты в таблицу. Еще нужно будет создать полигональную тему по точкам. Все цифры я посчитаю, а вот взаимодействие с АркГИС, боюсь, не потяну – пока писал только простенькие скрипты для точечных шейпов без изменения данных. Надеюсь, совместными усилиями мы эту задачку решим.

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9128
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 747
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Сообщение Максим Дубинин » 28 ноя 2007, 19:36

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

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

Сообщение geologic » 28 ноя 2007, 20:40

При всем уважении к знатокам, пока не понятно с шириной. что вы под ней подразумеваете, если без программных выкладок? Берете ширину как размер описанного прямоугольника? Если так, то это не тоЮ, не годится для природных контуров. Для поймы, например это даст ширину полосы меандрирования, но никак не ширину поймы. Аппроксимация площади таким образом пострадает в десятки раз.

За ширину "изрезанного" многоугольника скорее удобно принимать максимальное его сечение из возможных, перпендикулярно длине. В таком понимании это полезный параметр, для поймы это ее примерная ширина. В случае особо кривой формы (например, серпа) и это будет лишь грубая аппроксимация, нужно будет брать не длину не по прямой, а строить осевую линию ВНУТРИ полигона.

Словом, я бы не торопился ппрограммировать, по-русски бы разобраться не мешало.

Mitrich
Активный участник
Сообщения: 184
Зарегистрирован: 15 сен 2006, 16:15
Репутация: 10
Откуда: Москва

Сообщение Mitrich » 28 ноя 2007, 23:00

Коллеги!
Готов поделиться полезными функциями по заполнению комбобокса полигональными, линейными темами, выборка вертексов в массив, создание полигонов и т.д.
Но вот вопрос. Все с азартом кинулись обсуждать математику. А объясните, пожалуйста, какое практическое применение вы видите для данной программы. Где вы собираетесь использовать данную морфометрию? Просто интересно для общего развития. Тогда будет понятно что программировать и как.

AndreyL
Завсегдатай
Сообщения: 483
Зарегистрирован: 17 авг 2006, 14:04
Репутация: 0
Откуда: Новосибирск

Сообщение AndreyL » 29 ноя 2007, 13:56

Не хиленькие, однако, люди подгреблись к теме. На правах младшего – я предлагал самый простой вариант – вписать полигон в прямоугольник. Действительно, для меандров такой подход смысла не имеет- таки уже давайте разовьем тему, предлагайте канву решения.
Для Максима (координаты задаются через ArX и ArY):

Dim ArX() As Double, ArY() As Double

Function FindMinimum(ByVal proc As Integer) As Double

Const pi = 3.14159265358979
Dim minX As Double, x As Double
Dim lb As Double, rb As Double
Dim lbi As Double, rbi As Double, mbi As Double
rb = pi
stepp = rb / 180

'scan angle for localize minimum
minX = 0
minf = TargetFunc(minX, proc)
For x = stepp To rb Step stepp
r = TargetFunc(x, proc)
If minf > r Then
minf = r
minX = x
End If
Next x

'find minimum
Const pres = 0.0001 / 180 * pi
lb = minX - stepp
rb = minX + stepp
area = rb - lb
While area > 2.4 * pres
mbi = (rb + lb) / 2
lbi = mbi - pres
rbi = mbi + pres
lf = TargetFunc(lbi, proc)
rf = TargetFunc(rbi, proc)
If lf > rf Then
lb = lbi
Else
rb = rbi
End If
area = rb - lb
Wend

FindMinimum = (rb + lb) / 2
End Function

Function TargetFunc(x As Double, ByVal proc As Integer) As Double
Const pi = 3.14159265358979
Dim maxX As Double, minX As Double, maxY As Double, minY As Double
kk = UBound(ArX)
i = 0
nX = ArX(i) * Cos(x) + ArY(i) * Sin(x)
nY = -ArX(i) * Sin(x) + ArY(i) * Cos(x)
maxX = nX
minX = nX
maxY = nY
minY = nY

For i = 0 To kk
nX = ArX(i) * Cos(x) + ArY(i) * Sin(x)
nY = -ArX(i) * Sin(x) + ArY(i) * Cos(x)

If maxX < nX Then maxX = nX
If minX > nX Then minX = nX
If maxY < nY Then maxY = nY
If minY > nY Then minY = nY
Next i

Select Case proc
Case 1 ' min area
TargetFunc = (maxX - minX) * (maxY - minY)
Case 2 ' min perimetr
TargetFunc = (maxX - minX + maxY - minY)
Case 3 ' max length
TargetFunc = -(maxX - minX)
Case 4 ' min width
TargetFunc = (maxX - minX)
End Select
End Function

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

Сообщение geologic » 29 ноя 2007, 20:56

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

"Ширина" через описанный прямоугольник хоть и кажется полезной, в природе не работает. Судите сами - она годится для круга, овала, сектора, сегмента, но никак не годится для серпа и более сложных форм, которые на природных картах преобладают.

Поиск ширины можно упростить, если брать ширину по среднему перпендикуляру к осевой, это будет полезнее, но увы, тоже весьма приблизительно. Для серпа сойдет, для червяка уже нет.

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

AndreyL
Завсегдатай
Сообщения: 483
Зарегистрирован: 17 авг 2006, 14:04
Репутация: 0
Откуда: Новосибирск

Сообщение AndreyL » 30 ноя 2007, 10:45

geologic писал(а):"Ширина" через описанный прямоугольник хоть и кажется полезной, в природе не работает. Судите сами - она годится для круга, овала, сектора, сегмента, но никак не годится для серпа и более сложных форм, которые на природных картах преобладают.
Не соглашусь со столь категоричным заявлением - я, к примеру, геолог, точнее петролог, и все мои плутоны обычно вписываются в овалы, вытянутые в разной степени. Для серпов и червяков действительно получается, что нужна осевая линия, причем желательно ее найти программно, она же не прямая. Возможен, например, такой вариант - сканирование вдоль длины скользящим окном. Но это все, пока, общий треп - нужно брать реальные данные, а оболочку я сам не напишу.

Борис
Интересующийся
Сообщения: 36
Зарегистрирован: 22 ноя 2005, 12:32
Репутация: 0

Сообщение Борис » 30 ноя 2007, 12:43

"Еще мысль - обойтись без ширины вообще. Нам известна площадь прямоугольника, и его длина, так давайте посчитаем некий условный второй размер, исходя из этого. Почему нет?"

- нет, это не пойдет. В этом случае у "змейки" (синусоиды) в случае одинаковой амплитуды, но разной частоты, этот условный критерий может отличаться в разы, хотя вписываться они будут в равные прямоугольники.

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

Соответственно, размеры прямоугольника, который имеет минимальную площадь - это и есть ширина и длина фигуры.

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

AndreyL
Завсегдатай
Сообщения: 483
Зарегистрирован: 17 авг 2006, 14:04
Репутация: 0
Откуда: Новосибирск

Сообщение AndreyL » 30 ноя 2007, 14:00

Борис писал(а):может ли быть несколько прямоугольников с равной минимальной площадью? или будет только один такой прямоугольник? Впрочем, думаю, что это уже не столь принципальный вопрос, тем более что при подсчете даже в случае наличия нескольких прямоугольников будут получаться разные цифры. (так что это скорее теоретический вопрос, нежели практический)
Может. Берем в качестве фигуры равносторонний треугольник – три прямоугольника с минимальной площадью (причем одинаковой)

Борис
Интересующийся
Сообщения: 36
Зарегистрирован: 22 ноя 2005, 12:32
Репутация: 0

Сообщение Борис » 30 ноя 2007, 14:11

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

AndreyL
Завсегдатай
Сообщения: 483
Зарегистрирован: 17 авг 2006, 14:04
Репутация: 0
Откуда: Новосибирск

Сообщение AndreyL » 30 ноя 2007, 18:07

Рассмотрим прямоугольный треугольник. Если в качестве длины прямоугольника взять больший катет, то площадь этого прямоугольника равна удвоенной площади треугольника, причем она и есть минимальная. Если в качестве длины взять гипотенузу, то площадь прямоугольника опять равна удвоенной площади треугольника (нарисуйте, станет понятно), но длина больше, чем в первом случае (и ширина меньше). На промежутке 0-180° площадь имеет четыре одинаковых минимума, отвечающих обоим катетам, гипотенузе и перпендикуляру к гипотенузе. Если же оптимизировать длину, то минимум один, отвечающий гипотенузе. Из этого не следует, что самый правильный путь, это оптимизировать длину – задачи разные бывают.

Борис
Интересующийся
Сообщения: 36
Зарегистрирован: 22 ноя 2005, 12:32
Репутация: 0

Сообщение Борис » 30 ноя 2007, 19:05

Верно.
Для моей конкретной задачи (с которой все началось) применительно к прямоугольному треуголнику - искомым является прямоугольник минимальной площади, но с максимально большей разницей сторон, то есть в качестве длины выступает гипотенуза.

Ответить

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

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

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