Нахождение полюса недоступности относительно нескольких точек без использования растров

9

Я хочу найти «точку недоступности» из ряда точек, представляющих города и деревни в Шотландии. Использование инструментов FOSS GIS (QGIS, SAGA, GRASS, Postgres / PostGIS ...).

Это точка, наиболее удаленная от любого населенного пункта. Это будет центр самого большого круга, в котором нет города, но на его краю будет город.

Есть растровый подход, который работает - фильтр GDAL Proximity .

Есть ли VECTOR способ сделать это? Тот, который не требует растеризации?

Вот моя попытка с растрами ...

  • Начните с точечного слоя в подходящей проекции в метрах (я использую OSGB, 27700)
  • Добавьте поле с именем «one» и установите в целое число с постоянным значением 1.
  • Вектор в растр, команда редактирования для использования -a один и использование GEO, а не пикселей. Убедитесь, что пиксели квадратные!
  • Создание контуров на бесконтактном растре (в данном случае шириной 1 км)

Вот как это выглядит. Я набрал несколько кандидатских баллов от руки ;-)

введите описание изображения здесь

Я думал, что растворение повторяющихся буферов (с помощью плагина Multi ring buffer ) может работать, но я подозреваю, что у меня недостаточно памяти для этого.

Стивен Кей
источник

Ответы:

7

Я предполагаю, что это центр окружности треугольника с наибольшим радиусом, который касается не более 3 точек. На рисунке ниже показаны первые 11 таких центров. Они помечены их номером рейтинга.

введите описание изображения здесь

Достаточно отсеять те, которые находятся за пределами треугольников и определить чемпиона, то есть № 3 на картинке.

ОБНОВЛЕНИЕ, ВДОХНОВЛЕННОЕ СТИВЕНОМ:

введите описание изображения здесь

Приведенный выше результат отличается от первого решения, полученного в ArcGIS без сценариев (но с расширенной лицензией), и оно работает! Однако он может давать сомнительные результаты на краях исследуемой области, например, точка № 1, то есть вторая самая удаленная найденная точка ...

FelixIP
источник
1
Вау, спасибо, что поделился этим! Я попытался проследить ваш рабочий процесс в QGIS с помощью (1) Точек на Делоне ( Vector | Delaunay Triangulation), (2) Выберите треугольник чемпионов (рассчитывается $areaпо таблице атрибутов полигонов Делоне) и сохранил самый большой в качестве нового слоя (3) Найти центр окружения ( Processing | GRASS | Vector | v.voronoi.skeletonна чемпионский треугольник). Считаете ли вы этот метод правильным?
Казухито
Первый шаг правильный. Я вычислил центры exradius для ВСЕХ треугольников. Чтобы найти центр, я построил внутренний перпендикуляр для средних точек всех трех сторон и нашел пересечение (комбинация 3,2).
FelixIP
Описанный круг треугольника, а не окружности.
FelixIP
Спасибо! (. и спасибо за красивую картину, слишком Чем больше я склоняюсь фон об этом, тем больше она становится увлекательной.)
Казухита
1
Хорошее наблюдение! Я проверю это и обновлю ответ. В отличие от первого решения, оно не требует сценариев, по крайней мере, в Arcgis.
FelixIP
5

Вот продолжение. Спасибо @FelixIP за указание в правильном направлении!

Используя данные OSM из Австралии, я смог найти «точку недоступности» на австралийском материке - я сделал это примерно в 260 км на равном расстоянии от Акарненехе, Бедури и Маунт-Дейра, в POINT (137.234888 -24.966466)

введите описание изображения здесь

Я нашел довольно простой рабочий процесс в QGIS, который использует комбинацию растрового и векторного подходов. Я уверен, что подобный подход будет работать в других ГИС.

Момент «а-ха» наступил, заметив это

Все максимумы попадают в три точки на вороной сетке - точки, где встречаются соседние триплеты вороных многоугольников.

Подход был следующим:

  • работать в проекции на основе метра. Я использовал 3857, не идеально, но мои данные OSM были в этом формате :)
  • получить слой, представляющий интересующие места ("город", "деревня", "город", "деревня")
  • создать сетку вороной из этого слоя
  • использовать узлы извлечения для получения точек
  • создать растр близости (как показано в вопросе)
  • закрепите растр на контуре ландшафта, чтобы морские пиксели были установлены на 0.
  • использовать инструмент Point Sampling для извлеченных узлов относительно растра

Затем используйте Db Manager и Virtual Layers, чтобы найти узел с наибольшим значением расстояния в растре.

select 
    rowid,
    name,
    proximity2,
    st_astext(st_transform(geometry,4326)) as pt, 
    st_buffer(geometry, proximity2) as geometry
from 
    "samples" 
order by 
    proximity2 desc 
limit 1;
Стивен Кей
источник