Определение линейных размеров полигонов в ArcGis
-
- Завсегдатай
- Сообщения: 483
- Зарегистрирован: 17 авг 2006, 14:04
- Репутация: 0
- Откуда: Новосибирск
-
- Интересующийся
- Сообщения: 36
- Зарегистрирован: 22 ноя 2005, 12:32
- Репутация: 0
- Максим Дубинин
- MindingMyOwnBusiness
- Сообщения: 9128
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 747
- Ваше звание: NextGIS
- Откуда: Москва
- Контактная информация:
-
- Завсегдатай
- Сообщения: 483
- Зарегистрирован: 17 авг 2006, 14:04
- Репутация: 0
- Откуда: Новосибирск
Максим, и все заинтересованные! Предлагаю для обсуждения такой вариант инструмента (делать, так делать):
на входе линейная или полигональная тема и способ оценки
на выходе в таблицу темы добавляем длину, ширину, угол поворота прямоугольника, его площадь, периметр и центр (можно по желанию клиента, тогда на входе нужно предусмотреть выбор добавляемых параметров)
дополнительно можно построить новую тему прямоугольников (на входе нужно будет предусмотреть крыжик и имя темы) – эта штука все равно пригодится при отладке.
Для работы алгоритма понадобится цикл, вытаскивающий вертексы каждого полигона (или линии) в массив, и записывающий нужные атрибуты в таблицу. Еще нужно будет создать полигональную тему по точкам. Все цифры я посчитаю, а вот взаимодействие с АркГИС, боюсь, не потяну – пока писал только простенькие скрипты для точечных шейпов без изменения данных. Надеюсь, совместными усилиями мы эту задачку решим.
на входе линейная или полигональная тема и способ оценки
на выходе в таблицу темы добавляем длину, ширину, угол поворота прямоугольника, его площадь, периметр и центр (можно по желанию клиента, тогда на входе нужно предусмотреть выбор добавляемых параметров)
дополнительно можно построить новую тему прямоугольников (на входе нужно будет предусмотреть крыжик и имя темы) – эта штука все равно пригодится при отладке.
Для работы алгоритма понадобится цикл, вытаскивающий вертексы каждого полигона (или линии) в массив, и записывающий нужные атрибуты в таблицу. Еще нужно будет создать полигональную тему по точкам. Все цифры я посчитаю, а вот взаимодействие с АркГИС, боюсь, не потяну – пока писал только простенькие скрипты для точечных шейпов без изменения данных. Надеюсь, совместными усилиями мы эту задачку решим.
- Максим Дубинин
- MindingMyOwnBusiness
- Сообщения: 9128
- Зарегистрирован: 06 окт 2003, 20:20
- Репутация: 747
- Ваше звание: NextGIS
- Откуда: Москва
- Контактная информация:
-
- Гуру
- Сообщения: 852
- Зарегистрирован: 15 сен 2005, 13:19
- Репутация: 6
- Откуда: москва
- Контактная информация:
При всем уважении к знатокам, пока не понятно с шириной. что вы под ней подразумеваете, если без программных выкладок? Берете ширину как размер описанного прямоугольника? Если так, то это не тоЮ, не годится для природных контуров. Для поймы, например это даст ширину полосы меандрирования, но никак не ширину поймы. Аппроксимация площади таким образом пострадает в десятки раз.
За ширину "изрезанного" многоугольника скорее удобно принимать максимальное его сечение из возможных, перпендикулярно длине. В таком понимании это полезный параметр, для поймы это ее примерная ширина. В случае особо кривой формы (например, серпа) и это будет лишь грубая аппроксимация, нужно будет брать не длину не по прямой, а строить осевую линию ВНУТРИ полигона.
Словом, я бы не торопился ппрограммировать, по-русски бы разобраться не мешало.
За ширину "изрезанного" многоугольника скорее удобно принимать максимальное его сечение из возможных, перпендикулярно длине. В таком понимании это полезный параметр, для поймы это ее примерная ширина. В случае особо кривой формы (например, серпа) и это будет лишь грубая аппроксимация, нужно будет брать не длину не по прямой, а строить осевую линию ВНУТРИ полигона.
Словом, я бы не торопился ппрограммировать, по-русски бы разобраться не мешало.
-
- Активный участник
- Сообщения: 184
- Зарегистрирован: 15 сен 2006, 16:15
- Репутация: 10
- Откуда: Москва
Коллеги!
Готов поделиться полезными функциями по заполнению комбобокса полигональными, линейными темами, выборка вертексов в массив, создание полигонов и т.д.
Но вот вопрос. Все с азартом кинулись обсуждать математику. А объясните, пожалуйста, какое практическое применение вы видите для данной программы. Где вы собираетесь использовать данную морфометрию? Просто интересно для общего развития. Тогда будет понятно что программировать и как.
Готов поделиться полезными функциями по заполнению комбобокса полигональными, линейными темами, выборка вертексов в массив, создание полигонов и т.д.
Но вот вопрос. Все с азартом кинулись обсуждать математику. А объясните, пожалуйста, какое практическое применение вы видите для данной программы. Где вы собираетесь использовать данную морфометрию? Просто интересно для общего развития. Тогда будет понятно что программировать и как.
-
- Завсегдатай
- Сообщения: 483
- Зарегистрирован: 17 авг 2006, 14:04
- Репутация: 0
- Откуда: Новосибирск
Не хиленькие, однако, люди подгреблись к теме. На правах младшего – я предлагал самый простой вариант – вписать полигон в прямоугольник. Действительно, для меандров такой подход смысла не имеет- таки уже давайте разовьем тему, предлагайте канву решения.
Для Максима (координаты задаются через 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
Для Максима (координаты задаются через 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
-
- Гуру
- Сообщения: 852
- Зарегистрирован: 15 сен 2005, 13:19
- Репутация: 6
- Откуда: москва
- Контактная информация:
Канва к сожалению, очевидна - иначе чем перебором сечений, ширину не отыщешь, а без ширины пользы будет маловато. Думаю, в данном конкретном случае Борис должен зотя бы высказаться, насколько это ему подходит - хоть какой-то жизненный критерий.
"Ширина" через описанный прямоугольник хоть и кажется полезной, в природе не работает. Судите сами - она годится для круга, овала, сектора, сегмента, но никак не годится для серпа и более сложных форм, которые на природных картах преобладают.
Поиск ширины можно упростить, если брать ширину по среднему перпендикуляру к осевой, это будет полезнее, но увы, тоже весьма приблизительно. Для серпа сойдет, для червяка уже нет.
Еще мысль - обойтись без ширины вообще. Нам известна площадь прямоугольника, и его длина, так давайте посчитаем некий условный второй размер, исходя из этого. Почему нет?
"Ширина" через описанный прямоугольник хоть и кажется полезной, в природе не работает. Судите сами - она годится для круга, овала, сектора, сегмента, но никак не годится для серпа и более сложных форм, которые на природных картах преобладают.
Поиск ширины можно упростить, если брать ширину по среднему перпендикуляру к осевой, это будет полезнее, но увы, тоже весьма приблизительно. Для серпа сойдет, для червяка уже нет.
Еще мысль - обойтись без ширины вообще. Нам известна площадь прямоугольника, и его длина, так давайте посчитаем некий условный второй размер, исходя из этого. Почему нет?
-
- Завсегдатай
- Сообщения: 483
- Зарегистрирован: 17 авг 2006, 14:04
- Репутация: 0
- Откуда: Новосибирск
Не соглашусь со столь категоричным заявлением - я, к примеру, геолог, точнее петролог, и все мои плутоны обычно вписываются в овалы, вытянутые в разной степени. Для серпов и червяков действительно получается, что нужна осевая линия, причем желательно ее найти программно, она же не прямая. Возможен, например, такой вариант - сканирование вдоль длины скользящим окном. Но это все, пока, общий треп - нужно брать реальные данные, а оболочку я сам не напишу.geologic писал(а):"Ширина" через описанный прямоугольник хоть и кажется полезной, в природе не работает. Судите сами - она годится для круга, овала, сектора, сегмента, но никак не годится для серпа и более сложных форм, которые на природных картах преобладают.
-
- Интересующийся
- Сообщения: 36
- Зарегистрирован: 22 ноя 2005, 12:32
- Репутация: 0
"Еще мысль - обойтись без ширины вообще. Нам известна площадь прямоугольника, и его длина, так давайте посчитаем некий условный второй размер, исходя из этого. Почему нет?"
- нет, это не пойдет. В этом случае у "змейки" (синусоиды) в случае одинаковой амплитуды, но разной частоты, этот условный критерий может отличаться в разы, хотя вписываться они будут в равные прямоугольники.
все-таки, думаю, лучший способ определение ширины - это проекция всех точек фигуры на ось, проведенную перпенидкулярно длине (то есть расстояние между крайними точками). Перемножение двух этих величин - длины и ширины - и дают площадь.
Соответственно, размеры прямоугольника, который имеет минимальную площадь - это и есть ширина и длина фигуры.
При этом возникают вопросы - может ли быть несколько прямоугольников с равной минимальной площадью? или будет только один такой прямоугольник? Впрочем, думаю, что это уже не столь принципальный вопрос, тем более что при подсчете даже в случае наличия нескольких прямоугольников будут получаться разные цифры. (так что это скорее теоретический вопрос, нежели практический)
- нет, это не пойдет. В этом случае у "змейки" (синусоиды) в случае одинаковой амплитуды, но разной частоты, этот условный критерий может отличаться в разы, хотя вписываться они будут в равные прямоугольники.
все-таки, думаю, лучший способ определение ширины - это проекция всех точек фигуры на ось, проведенную перпенидкулярно длине (то есть расстояние между крайними точками). Перемножение двух этих величин - длины и ширины - и дают площадь.
Соответственно, размеры прямоугольника, который имеет минимальную площадь - это и есть ширина и длина фигуры.
При этом возникают вопросы - может ли быть несколько прямоугольников с равной минимальной площадью? или будет только один такой прямоугольник? Впрочем, думаю, что это уже не столь принципальный вопрос, тем более что при подсчете даже в случае наличия нескольких прямоугольников будут получаться разные цифры. (так что это скорее теоретический вопрос, нежели практический)
-
- Завсегдатай
- Сообщения: 483
- Зарегистрирован: 17 авг 2006, 14:04
- Репутация: 0
- Откуда: Новосибирск
Может. Берем в качестве фигуры равносторонний треугольник – три прямоугольника с минимальной площадью (причем одинаковой)Борис писал(а):может ли быть несколько прямоугольников с равной минимальной площадью? или будет только один такой прямоугольник? Впрочем, думаю, что это уже не столь принципальный вопрос, тем более что при подсчете даже в случае наличия нескольких прямоугольников будут получаться разные цифры. (так что это скорее теоретический вопрос, нежели практический)
-
- Интересующийся
- Сообщения: 36
- Зарегистрирован: 22 ноя 2005, 12:32
- Репутация: 0
-
- Завсегдатай
- Сообщения: 483
- Зарегистрирован: 17 авг 2006, 14:04
- Репутация: 0
- Откуда: Новосибирск
Рассмотрим прямоугольный треугольник. Если в качестве длины прямоугольника взять больший катет, то площадь этого прямоугольника равна удвоенной площади треугольника, причем она и есть минимальная. Если в качестве длины взять гипотенузу, то площадь прямоугольника опять равна удвоенной площади треугольника (нарисуйте, станет понятно), но длина больше, чем в первом случае (и ширина меньше). На промежутке 0-180° площадь имеет четыре одинаковых минимума, отвечающих обоим катетам, гипотенузе и перпендикуляру к гипотенузе. Если же оптимизировать длину, то минимум один, отвечающий гипотенузе. Из этого не следует, что самый правильный путь, это оптимизировать длину – задачи разные бывают.
-
- Интересующийся
- Сообщения: 36
- Зарегистрирован: 22 ноя 2005, 12:32
- Репутация: 0
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя