Mitrich! Вас, похоже, тема перестала интересовать. А жалко! Именно этих функций крайне не хватает.Mitrich писал(а):Готов поделиться полезными функциями по заполнению комбобокса полигональными, линейными темами, выборка вертексов в массив, создание полигонов и т.д.
Определение линейных размеров полигонов в ArcGis
-
- Завсегдатай
- Сообщения: 483
- Зарегистрирован: 17 авг 2006, 14:04
- Репутация: 0
- Откуда: Новосибирск
Тут действительно есть сложность поиска нескольких одинаковых минимумов – алгоритм то численный. Посему на правильных геометрических фигурах возможны несколько решений одинаковых с точки зрения одной целевой функции, но разных для другой. Выход вижу в том, чтобы реализовать несколько правил для поиска. Так для Вашего случая минимизация площади может дать худший результат, чем максимизация длины, но использование длины даст требуемый результат.
-
- Активный участник
- Сообщения: 184
- Зарегистрирован: 15 сен 2006, 16:15
- Репутация: 10
- Откуда: Москва
выложил проект тут
это чуть переделанный старый проект, но все основные функции есть.
поищу еще создание нового класса - я так понимаю выбрасывать рассчеты будут в новый featuerClass? Это надежнее, чем добавлять поля в уже существующий.
тема интересна, но пока не ясно ее практическое применение. Пока интерес кооперативно-онлайновой организации.
это чуть переделанный старый проект, но все основные функции есть.
поищу еще создание нового класса - я так понимаю выбрасывать рассчеты будут в новый featuerClass? Это надежнее, чем добавлять поля в уже существующий.
тема интересна, но пока не ясно ее практическое применение. Пока интерес кооперативно-онлайновой организации.
-
- Гуру
- Сообщения: 852
- Зарегистрирован: 15 сен 2005, 13:19
- Репутация: 6
- Откуда: москва
- Контактная информация:
Да, чем более извилистая фигура, тем сильнее будет отличаться от иделала эрзац-ширина, полученная "через площадь". Однако тут вся соль в длине - если научиться брать длину, как центральную линию змейки или серпа - centerline - то аппроксимация ширины через площадь становится более привлекательной.Борис писал(а): нет, это не пойдет. В этом случае у "змейки" (синусоиды) в случае одинаковой амплитуды, но разной частоты, этот условный критерий может отличаться в разы, хотя вписываться они будут в равные прямоугольники.
Не понял насчет "вписанных в равные многоугольники", этот процесс тут ни при чем. Длина и эрзац-ширина НЕ ДАЮТ описанных прямоугольников, это способ Андрея, который я как раз критикую
.Борис писал(а): все-таки, думаю, лучший способ определение ширины - это проекция всех точек фигуры на ось, проведенную перпенидкулярно длине (то есть расстояние между крайними точками). Перемножение двух этих величин - длины и ширины - и дают площадь.
Проекция всех точек (точнее, крайних точек) как раз дает максимально возможную "ширину", которая "врёт" сильнее всех остальных "ширин". Или вы что-то другое имели в виду?
Моя идея была использовать ПЛОЩАДЬ как исходный параметр, а не получать площадь помножением ширины на длину. Площадь в ГИС ИЗВЕСТНА, зачем ее перевычислять? Наоборот, можно через нее узнать ширину! Если поставить вопрос таким образом, то все упирается в правильную аппроксимацию длины, а она, как вы отметили, возможна только через CENTERLINE. Мне кажется, вы уперлись в эти описанные фигуры, вообще в геометрическое воплощение ширины, а это не обязательно для морфометрии, достаточно, например, знать "среднюю ширину".
-
- Интересующийся
- Сообщения: 36
- Зарегистрирован: 22 ноя 2005, 12:32
- Репутация: 0
"Однако тут вся соль в длине - если научиться брать длину, как центральную линию змейки или серпа - centerline - то аппроксимация ширины через площадь становится более привлекательной."
- в этом случае могут быть не реализованы некоторые задачи. Например, при разных картографических задачах возникают случаи, что мелкие полигоны надо оставить на карте только в том случае, если они вытянуты по какому-то направлению, а если они изометричные в плане - то они не нужны. Другими словами "спираль" нужно выкидывать, а прямую полоску (с равной средней линией) - оставить.
- в этом случае могут быть не реализованы некоторые задачи. Например, при разных картографических задачах возникают случаи, что мелкие полигоны надо оставить на карте только в том случае, если они вытянуты по какому-то направлению, а если они изометричные в плане - то они не нужны. Другими словами "спираль" нужно выкидывать, а прямую полоску (с равной средней линией) - оставить.
-
- Гуру
- Сообщения: 852
- Зарегистрирован: 15 сен 2005, 13:19
- Репутация: 6
- Откуда: москва
- Контактная информация:
Ну так оно же и получится! Полигон, где отношение ширины к длине небольшое, вы выкинете, большое - оставите. Другими словами, в модели описанных фигур эта задача решается, в модели ширины через площадь - решается и эта и намного больше. Не решаются, правда, вопросы с ориентацией длинной оси.
Словом, к задумке по описанному прямоугольнику легко добавить вычисление средней ширины через площадь, если надо. А вот находить длину как Centerline стоило бы продумать алгоритм. Тогда задачу оперативной морфометрии можно было бы считать решенной. Пока - только для частных случаев и задач.
Словом, к задумке по описанному прямоугольнику легко добавить вычисление средней ширины через площадь, если надо. А вот находить длину как Centerline стоило бы продумать алгоритм. Тогда задачу оперативной морфометрии можно было бы считать решенной. Пока - только для частных случаев и задач.
-
- Новоприбывший
- Сообщения: 2
- Зарегистрирован: 23 окт 2018, 15:21
- Репутация: 0
- Откуда: Belarus
Re: Определение линейных размеров полигонов в ArcGis
Может кому понадобится решение)))
не знаю на сколько оно верно но это единственный оптимальный способ, что я придумала)
мне необходимо было найти ширину полигона
для этого я использовала в Polygon.centroid - это точно расположенная внутри полигона где якобы его центр. Естественно, где более менее правильная фигура то все хорошо, просто находишь минимальное расстояние между полилинией и центром и умножаешь на 2 и все. Но т.к. центр бывает смещен, то я нашла другое способ.
В общем я получаю точки полигона и для каждой пары точек строю линии полигона. потом от каждой построенной линии ищу расстояние до своего центроида методом distanceTo и среди всех расстояний получаю минимальное (запоминаю, что за линия была с минимальным расстоянием назовем line1).
Второй шаг опять методом перебора моих прямых отбросить те которые пересекаются с моей прямой line1 методом touches и при этом чтобы она не была равна line1. когда все условия выполнены из оставшихся прямых опять ищу минимальное расстояние от линии до центроида.
потом два расстояния просто суммирую и получаю ширину полигона относительно его центра.
для вычисления длины думаю подойдет такой же алгоритм только нужно искать максимальное расстояние между прямой и центроидом.
не знаю на сколько оно верно но это единственный оптимальный способ, что я придумала)
мне необходимо было найти ширину полигона
для этого я использовала в Polygon.centroid - это точно расположенная внутри полигона где якобы его центр. Естественно, где более менее правильная фигура то все хорошо, просто находишь минимальное расстояние между полилинией и центром и умножаешь на 2 и все. Но т.к. центр бывает смещен, то я нашла другое способ.
В общем я получаю точки полигона и для каждой пары точек строю линии полигона. потом от каждой построенной линии ищу расстояние до своего центроида методом distanceTo и среди всех расстояний получаю минимальное (запоминаю, что за линия была с минимальным расстоянием назовем line1).
Второй шаг опять методом перебора моих прямых отбросить те которые пересекаются с моей прямой line1 методом touches и при этом чтобы она не была равна line1. когда все условия выполнены из оставшихся прямых опять ищу минимальное расстояние от линии до центроида.
потом два расстояния просто суммирую и получаю ширину полигона относительно его центра.
для вычисления длины думаю подойдет такой же алгоритм только нужно искать максимальное расстояние между прямой и центроидом.
-
- Новоприбывший
- Сообщения: 2
- Зарегистрирован: 23 окт 2018, 15:21
- Репутация: 0
- Откуда: Belarus
Re: Определение линейных размеров полигонов в ArcGis
Может кому понадобится решение)))
не знаю на сколько оно верно но это единственный оптимальный способ, что я придумала)
мне необходимо было найти ширину полигона
для этого я использовала в Polygon.centroid - это точно расположенная внутри полигона где якобы его центр. Естественно, где более менее правильная фигура то все хорошо, просто находишь минимальное расстояние между полилинией и центром и умножаешь на 2 и все. Но т.к. центр бывает смещен, то я нашла другое способ.
В общем я получаю точки полигона и для каждой пары точек строю линии полигона. потом от каждой построенной линии ищу расстояние до своего центроида методом distanceTo и среди всех расстояний получаю минимальное (запоминаю, что за линия была с минимальным расстоянием назовем line1).
Второй шаг опять методом перебора моих прямых отбросить те которые пересекаются с моей прямой line1 методом touches и при этом чтобы она не была равна line1. когда все условия выполнены из оставшихся прямых опять ищу минимальное расстояние от линии до центроида.
потом два расстояния просто суммирую и получаю ширину полигона относительно его центра.
для вычисления длины думаю подойдет такой же алгоритм только нужно искать максимальное расстояние между прямой и центроидом.
не знаю на сколько оно верно но это единственный оптимальный способ, что я придумала)
мне необходимо было найти ширину полигона
для этого я использовала в Polygon.centroid - это точно расположенная внутри полигона где якобы его центр. Естественно, где более менее правильная фигура то все хорошо, просто находишь минимальное расстояние между полилинией и центром и умножаешь на 2 и все. Но т.к. центр бывает смещен, то я нашла другое способ.
В общем я получаю точки полигона и для каждой пары точек строю линии полигона. потом от каждой построенной линии ищу расстояние до своего центроида методом distanceTo и среди всех расстояний получаю минимальное (запоминаю, что за линия была с минимальным расстоянием назовем line1).
Второй шаг опять методом перебора моих прямых отбросить те которые пересекаются с моей прямой line1 методом touches и при этом чтобы она не была равна line1. когда все условия выполнены из оставшихся прямых опять ищу минимальное расстояние от линии до центроида.
потом два расстояния просто суммирую и получаю ширину полигона относительно его центра.
для вычисления длины думаю подойдет такой же алгоритм только нужно искать максимальное расстояние между прямой и центроидом.
- Вложения
-
- Load_Sloi.py
- (2.4 КБ) 654 скачивания
-
- Завсегдатай
- Сообщения: 297
- Зарегистрирован: 03 июн 2015, 10:19
- Репутация: 72
Re: Определение линейных размеров полигонов в ArcGis
Эту задачу можно решить и с помощью команды geom.polygonfetch из набора Geospatial Modeling Environment
geom.polygonfetch(in, uidfield, out, [where]);
Determines the longest line that can be position within the bounds of a polygon, crossing no edges
Link to full online help:
http://www.spatialecology.com/gme/geompolygonfetch.htm
in
the input polygon data source
uidfield
the unique ID field of the input feature data source
out
the output line data source
[where]
the selection statement that will be applied to the line feature data source to identify a subset of lines to process (see full Help documentation for further details)
geom.polygonfetch(in, uidfield, out, [where]);
Determines the longest line that can be position within the bounds of a polygon, crossing no edges
Link to full online help:
http://www.spatialecology.com/gme/geompolygonfetch.htm
in
the input polygon data source
uidfield
the unique ID field of the input feature data source
out
the output line data source
[where]
the selection statement that will be applied to the line feature data source to identify a subset of lines to process (see full Help documentation for further details)
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 29 гостей