@DDwrt100

Работа с геоданными?

Добрый день. Ответьте пожалуйста на вопрос по работе геолокацией. Я никогда не сталкивался с подобными задачами, и некоторые вещи вызывают затруднение.
Ситуация:
У меня есть сырые данные в базе данных, в этой базе есть два столбца(которые называются широта и долгота).
В виде запроса приходит маршрут в виде массива (широта долгота). Мне надо отобрать записи , которые относятся к этому маршруту.
Как мне правильно построить запрос ?
Так же у меня вызывает вопросы техника расчета принадлежности одной точки к другой. У кого есть ссылки на какие нибудь толковые статьи где разбирается с нуля все эта тематика ?

UPD: ok. у меня сейчас там clickhouse от яндекса, но и postgress тоже есть.
Собственно до чего я сейчас додумался:
Я вижу в документации базы данных, создание гео индекса
SELECT geoToH3(37.79506683, 55.71290588, 15) as h3Index
в текущих координатах это должно получиться :
644325524701193974 что то подобное.
далее я беру координаты из запроса и тоже конвертируя их в индекс могу сравнить принадлежность к чему ? Как сравнить единичный индекс с маршрутом ?
Как это делается в реальных проектах? Кто может рассказать?
  • Вопрос задан
  • 593 просмотра
Решения вопроса 2
NeiroNx
@NeiroNx
Программист
Лучше всего когда точка сохранена как объект геометрии - в postgresql есть возможность определения пересечения объектов геометрии.

А если два отдельных поля - то надо выполнять расчет расстояния и если оно меньше N метров то точка нужная.
для коротких дистанций подходит расчет прямоугольного треугольника, для больших - формула Хаверсина https://habr.com/ru/post/179157/

Понятно что расстояние небольшое и можно считать по простому - через r^2 = (x0-x)^2+(y0-y)^2

если есть геометрические функции - то точка - это окружность с радиусом в N метров которая пересекается с ломанной линией пути.

Если их нет, то придется весь расчет включить в запрос и он получится неприлично длинный. Приблизительно - можно найти сравнив все точки пути с точками записей найдя минимальное расстояние.
Ответ написан
Комментировать
freeExec
@freeExec
Участник OpenStreetMap
Избавиться от колонок широта и долгота и воспользоваться пространственным расширением для вашей БД. А дальше строите буферы вокруг маршрута и получаете те точки которые в него попали.
На Гислабе полно статей по PostGIS, тема не простая, с наскока можно не осилить
gis-lab.info/docs/postgis/manual/ch06.html

Индекс строят не H3 - это больше для точечных объектов, а GIST
А запросы получаются примерно таких планов, достать дома вдоль дороги не далее 50 "псевдометров":
SELECT hw.highway, hw.name, bld."addr:housenumber", bld.building, hw.way, bld.way FROM planet_osm_line AS hw 
INNER JOIN planet_osm_polygon AS bld ON ST_Intersects(ST_Buffer(hw.way, 50), bld.way)
WHERE hw.highway IS NOT NULL AND bld."addr:housenumber" IS NOT NULL

LIMIT 30;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы