Расчет Радиуса наибольшей вписанной в полигон окружности.

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
Аватара пользователя
Natalia Novoselova
Гуру
Сообщения: 3020
Зарегистрирован: 15 янв 2013, 20:14
Репутация: 69
Ваше звание: Лиса
Откуда: **
Контактная информация:

Расчет Радиуса наибольшей вписанной в полигон окружности.

Сообщение Natalia Novoselova » 11 окт 2022, 22:20

Вопрос о расчете радиуса наибольшей вписанной в полигон окружности в среде ArcGIS Pro или QGIS, другого открытого софта или скрипта.


Как рассчитать для произвольного полигона радиус наибольшей вписанной в этот фрагмент окружности? Построить саму окружность и ее центр. (Операцию нужно сделать для слоя со множеством полигонов).

Такой радиус будет являться максимальным расстоянием удаления точки, находящейся внутри полигона, от всех границ полигона. Центр окружности будет являться точкой наибольшего удаления от всех границ полигона.

Ivor
Завсегдатай
Сообщения: 345
Зарегистрирован: 11 дек 2006, 09:46
Репутация: 102
Откуда: Иркутск

Re: Расчет Радиуса наибольшей вписанной в полигон окружности.

Сообщение Ivor » 12 окт 2022, 04:49

Natalia Novoselova писал(а):
11 окт 2022, 22:20
Такой радиус будет являться максимальным расстоянием удаления точки, находящейся внутри полигона, от всех границ полигона. Центр окружности будет являться точкой наибольшего удаления от всех границ полигона.
не будет. попробуйте построить вписанную окружность в сильно вытянутый (для наглядности) прямоугольник и однозначно разместить оную в нём.

Аватара пользователя
Natalia Novoselova
Гуру
Сообщения: 3020
Зарегистрирован: 15 янв 2013, 20:14
Репутация: 69
Ваше звание: Лиса
Откуда: **
Контактная информация:

Re: Расчет Радиуса наибольшей вписанной в полигон окружности.

Сообщение Natalia Novoselova » 12 окт 2022, 05:44

Ivor писал(а):
12 окт 2022, 04:49
попробуйте построить вписанную окружность в сильно вытянутый (для наглядности) прямоугольник и однозначно разместить оную в нём.
Так. И что?
Изображение

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

Ivor
Завсегдатай
Сообщения: 345
Зарегистрирован: 11 дек 2006, 09:46
Репутация: 102
Откуда: Иркутск

Re: Расчет Радиуса наибольшей вписанной в полигон окружности.

Сообщение Ivor » 12 окт 2022, 06:19

Natalia Novoselova писал(а):
12 окт 2022, 05:44
Так. И что?
Неоднозначность получается. Я же недаром написал - прямоугольник. Вы же хотите
Natalia Novoselova писал(а):
11 окт 2022, 22:20
Центр окружности будет являться точкой наибольшего удаления от всех границ полигона.
но в прямоугольнику возможно множество вписанных окружностей, и их центры будут лежать на осевой линии. Если же вы размещаете окружность по центру прямоугольника - значит используете дополнительные условия.

И да, прямоугольник - это ещё простой случай. Попробуйте однозначно разместить вписанную окружность в кольце

AlexRomantsov
Завсегдатай
Сообщения: 290
Зарегистрирован: 24 мар 2022, 05:54
Репутация: 134
Откуда: Томск

Re: Расчет Радиуса наибольшей вписанной в полигон окружности.

Сообщение AlexRomantsov » 12 окт 2022, 06:21

В QGIS, Слой полигонов - Свойства - Стиль - кнопка Добавить стиль.
Тип слоя - Генератор геометрии, Тип геометрии - Полигон.
Вписанный круг 1.JPG
Вписанный круг 1.JPG (62.42 КБ) 2518 просмотров
Выражение:
make_circle(pole_of_inaccessibility( $geometry,10),distance( pole_of_inaccessibility( $geometry,10), segments_to_lines( $geometry)),36)
в котором make_circle - создать окружность, 36 точек, с параметрами ниже:
pole_of_inaccessibility( $geometry,10) - центр круга, в качестве него полюс недоступности для полигона, 10 - точность;
distance() - радиус круга, в качестве него минимальная дистанция от полюса недоступности
до segments_to_lines( $geometry) - ближайшей точке на границах (сегментах) полигона. (Здесь пришлось преобразовать полигон в linestring сегменты, так как иначе расстояние из точки внутри полигона до этого полигона всегда равно нулю...)
Результат на карте, без создания новых слоев, как стиль:
Вписанный круг 2.JPG
Вписанный круг 2.JPG (15.36 КБ) 2518 просмотров
Внимание! Проверял только метрических СК, в географических не пробовал.
Последний раз редактировалось AlexRomantsov 12 окт 2022, 07:12, всего редактировалось 2 раза.

AlexRomantsov
Завсегдатай
Сообщения: 290
Зарегистрирован: 24 мар 2022, 05:54
Репутация: 134
Откуда: Томск

Re: Расчет Радиуса наибольшей вписанной в полигон окружности.

Сообщение AlexRomantsov » 12 окт 2022, 06:39

Если Вам все таки нужны отдельные слои, тогда QGIS - Анализ данных - Вектор-геометрия - Геометрия из выражения, и туда, в Выражение для целевой геометрии, подставляете
make_circle(pole_of_inaccessibility( $geometry,10),distance( pole_of_inaccessibility( $geometry,10), segments_to_lines( $geometry)),36) - для создания кругов (полигонов),
и вторым расчетом
pole_of_inaccessibility( $geometry,10) - для создания центров этих кругов (точками)

И подправьте для себя цифирки: 36 - количество точек в круге, и 10 - точность расчета центра круга, 10м взял для абстрактного примера, если вам для стран - увеличьте, если для земельных участков - уменьшите.

Аватара пользователя
Natalia Novoselova
Гуру
Сообщения: 3020
Зарегистрирован: 15 янв 2013, 20:14
Репутация: 69
Ваше звание: Лиса
Откуда: **
Контактная информация:

Re: Расчет Радиуса наибольшей вписанной в полигон окружности.

Сообщение Natalia Novoselova » 12 окт 2022, 07:11

Ivor писал(а):
12 окт 2022, 06:19
но в прямоугольнику возможно множество вписанных окружностей, и их центры будут лежать на осевой линии. Если же вы размещаете окружность по центру прямоугольника - значит используете дополнительные условия.

И да, прямоугольник - это ещё простой случай. Попробуйте однозначно разместить вписанную окружность в кольце

Я не размещаю окружность по центру прямоугольника. Мы просто строим НАИБОЛЬШУЮ возможную вписанною в произвольный полигон (включая прямоугольник, кольцо и пр) окружность. Радиус наибольшей вписанной окружности в полигон - будет являться "наибольшим расстоянием, на которое объект, находящийся внутри полигона, может быть удаленным от любой границы этого полигона."
Главная задача - не построить саму окружность, а найти то самое расстояние, которым является ее радиус (в случае прямоугольника - таких окружностей может быть много - и они располагаются на осевой т.е. центральной линии, но все эти окружности имеют одинаковый радиус, который мы ищем )

Вы, наверное, не то понимаете, что я обозначаю в этом термине.

Представьте себе медведя. Он находится внутри лесного фрагмента. Везде на границе этого фрагмента ему угрожает антропогенная опасность. Он стремиться так устроить свою берлогу, чтобы точка расположения берлоги была максимально возможно удалена от какой-либо (то есть от всех) границ этого фрагмента. Если искомая точка одна (общий случай для реальных лесных фрагментов), то это и будет центр НАИБОЛЬШЕЙ вписанный в этот фрагмент окружности. В случае с прямоугольником - он может расположить свою берлогу на осевой его линии, но все с тем же расстоянием.

AlexRomantsov
Завсегдатай
Сообщения: 290
Зарегистрирован: 24 мар 2022, 05:54
Репутация: 134
Откуда: Томск

Re: Расчет Радиуса наибольшей вписанной в полигон окружности.

Сообщение AlexRomantsov » 12 окт 2022, 07:15

Natalia Novoselova писал(а):
12 окт 2022, 07:11
Главная задача - не построить саму окружность, а найти то самое расстояние, которым является ее радиус
Ну тогда используйте часть выражения:
distance( pole_of_inaccessibility( $geometry,10), segments_to_lines( $geometry))

Это можно сохранить в атрибуты, Калькулятором полей

Аватара пользователя
Natalia Novoselova
Гуру
Сообщения: 3020
Зарегистрирован: 15 янв 2013, 20:14
Репутация: 69
Ваше звание: Лиса
Откуда: **
Контактная информация:

Re: Расчет Радиуса наибольшей вписанной в полигон окружности.

Сообщение Natalia Novoselova » 12 окт 2022, 07:20

AlexRomantsov писал(а):
12 окт 2022, 06:39
Если Вам все таки нужны отдельные слои, тогда QGIS - Анализ данных - Вектор-геометрия - Геометрия из выражения, и туда, в Выражение для целевой геометрии, подставляете
make_circle(pole_of_inaccessibility( $geometry,10),distance( pole_of_inaccessibility( $geometry,10), segments_to_lines( $geometry)),36) - для создания кругов (полигонов),
и вторым расчетом
pole_of_inaccessibility( $geometry,10) - для создания центров этих кругов (точками)

И подправьте для себя цифирки: 36 - количество точек в круге, и 10 - точность расчета центра круга, 10м взял для абстрактного примера, если вам для стран - увеличьте, если для земельных участков - уменьшите.
Спасибо!
Попробую через выражение.

Я нашла аналог этого выражения в плагине QGIS. Хотите посмотреть мое описание ниже, это то именно, что в выражении, или методика отлична?


Решение№1

В QGIS 3x загрузить Select Within Plugin (он загружается из софта или можно скачать и загрузить через zip folder).


Возможно, этот плагин вообще не нужен и опция “Pole of inaccessibility" встроена в QGIS. Поскольку использование плагина ничего не дало (при его использовании ничего не происходит). После его установки нужно сделать Processing toolbox - справа появится окно, ввести в поиск “Pole of inaccessibility”, после чего он появляется в Vector Geometry - Pole of inaccessibility (полюс недоступности).

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

Кликаем на "Pole of inaccessibility" в рабочем окне загружаем полигональный шейп, пересохраненный в метрической проекции, указываем файл для сохранения новой точечной шейп темы. И на выходе получаем новый точечный шейп, в котором точки – центры искомых окружностей, а в поле dist_pole – искомый радиус в метрах.

Затем, в Processing toolbox выбрать Buffer. В окне выбрать построенную точечную тему и указать, что буфер надо строить по ее полю dist_pole (через кнопку справа от слова Distance). Указать разрешение окружности Segments - 36 (почему это число - не знаю, но строится корректно).Указать имя и локацию нового шейп файла, который будет построенными искомыми окружностями, вписанными в шейп фрагментов.

Построенные инструментом “Pole of inaccessibility" шейп темы из центров и самих окружностей имеют не только поле dist_pole (искомый радиус в метрах), но и все атрибуты исходного шейпа с полигонами- лесными фрагментами. Поэтому копировать атрибутивную таблицйу можно у этих двух файлов.

* * *


Решение№2 – ET GeWizards https://www.ian-ko.com/
Когда-то давно во время ArcGIS10 я на нем точно делала эту задачу .. Сейчас посмотрела, вроде он платным стал.
Вложения
pole-ofinaccessibilit-.jpg
pole-ofinaccessibilit-.jpg (52.83 КБ) 2496 просмотров
Последний раз редактировалось Natalia Novoselova 13 окт 2022, 00:53, всего редактировалось 2 раза.

Аватара пользователя
Natalia Novoselova
Гуру
Сообщения: 3020
Зарегистрирован: 15 янв 2013, 20:14
Репутация: 69
Ваше звание: Лиса
Откуда: **
Контактная информация:

Re: Расчет Радиуса наибольшей вписанной в полигон окружности.

Сообщение Natalia Novoselova » 12 окт 2022, 07:25

AlexRomantsov писал(а):
12 окт 2022, 07:15
Ну тогда используйте часть выражения:
distance( pole_of_inaccessibility( $geometry,10), segments_to_lines( $geometry))
Здорово, большое спасибо!
Калькулятор полей лучше и для описания методики в статье.

AlexRomantsov
Завсегдатай
Сообщения: 290
Зарегистрирован: 24 мар 2022, 05:54
Репутация: 134
Откуда: Томск

Re: Расчет Радиуса наибольшей вписанной в полигон окружности.

Сообщение AlexRomantsov » 12 окт 2022, 07:52

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

gamm
Гуру
Сообщения: 4044
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1049
Ваше звание: программист
Откуда: Казань

Re: Расчет Радиуса наибольшей вписанной в полигон окружности.

Сообщение gamm » 12 окт 2022, 08:35

AlexRomantsov писал(а):
12 окт 2022, 06:21
pole_of_inaccessibility( $geometry,10) - центр круга, в качестве него полюс недоступности для полигона, 10 - точность;
а как это реализовано, Вы не в курсе? Сами qgis-совцы что-то наваяли, или в GEOS такое есть? Поскольку первое, что приходит в голову, это построить растр вокруг полигона, на нем сделать дистанционное преобразование, и найти максимум, это есть, например, в Fragstats (насколько я понял, только это ТС и нужно). Да и точность среди аргументов навевает мысль о растре.

AlexRomantsov
Завсегдатай
Сообщения: 290
Зарегистрирован: 24 мар 2022, 05:54
Репутация: 134
Откуда: Томск

Re: Расчет Радиуса наибольшей вписанной в полигон окружности.

Сообщение AlexRomantsov » 12 окт 2022, 08:44

В описании функции: Функция использует итеративный алгоритм 'polylabel' (Владимир Агафонкин, 2016), гарантирующий нахождение полюса недоступности в пределах заданного допуска. Для более точных допусков требуется больше итераций и больше времени. Как реализовано - не в курсе, первый раз попробовал :)

Гугл: https://observablehq.com/@mourner/label ... -polylabel

gamm
Гуру
Сообщения: 4044
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1049
Ваше звание: программист
Откуда: Казань

Re: Расчет Радиуса наибольшей вписанной в полигон окружности.

Сообщение gamm » 12 окт 2022, 12:15

ясно, этот хлопец Leaflet разработал. Так что скорее всего вектор.

Аватара пользователя
Natalia Novoselova
Гуру
Сообщения: 3020
Зарегистрирован: 15 янв 2013, 20:14
Репутация: 69
Ваше звание: Лиса
Откуда: **
Контактная информация:

Re: Расчет Радиуса наибольшей вписанной в полигон окружности.

Сообщение Natalia Novoselova » 13 окт 2022, 00:34

gamm писал(а):
12 окт 2022, 08:35
а как это реализовано, Вы не в курсе? Сами qgis-совцы что-то наваяли, или в GEOS такое есть? Поскольку первое, что приходит в голову, это построить растр вокруг полигона, на нем сделать дистанционное преобразование, и найти максимум, это есть, например, в Fragstats (насколько я понял, только это ТС и нужно). Да и точность среди аргументов навевает мысль о растре.

Как строится плагином или, скорее всего, уже встроенной в QGIS опцией “Pole of inaccessibility" в Решении №1 сверху (подправила описание).

Функция работает отлично. Визуальный анализ показывает большую точность построения, т.е. и определения искомых радиусов и построение самих полюсов недоступности.

Решения с растрами тут вряд ли бы подошли в моем случае - около 270 000 фрагментов лесного биома надо провести через эту операцию. При таком объеме - время, которое надо машине на обработку операции, уже надо учитывать.
Вообще, это будет один из параметров оценки фрагментации этого биома.
Вложения
pole-inaccessibility-ex.jpg
pole-inaccessibility-ex.jpg (570.11 КБ) 2286 просмотров

Ответить

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

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

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