получить все точки пространственного типа в радиусе в км с помощью mariaDb, mySQL

Вот в чем проблема,

Уже было проведено несколько исследований по этому поводу, но не было найдено четкого и хорошо объясненного решения по этому поводу. Некоторые люди говорят о таких функциях, как st_distance или st_within, которые относятся к версиям mysql / mariadb, но эти функции, похоже, не имеют реальной документации и не подходят для моей проблемы.

Итак, я пытаюсь сделать следующее:

Получите ВСЕ пространственные ТОЧКИ (lat,ln), которые находятся внутри круга с определенным РАДИУСОМ в KILOMETRES.

Пользователь задаст радиус от 1 до 100 км и получит все записи базы данных, которые находятся в пределах этого радиуса.

Таблица "points" выглядит так:

ID -- POINT -- SOMETEXT

Точка - это точка пространственного типа, используемая в mySql(>5.6) / mariaDb(5.5.40) (lat,lng)

Итак, запрос должен выглядеть так:

"SELECT * FROM points WHERE (function... to get distance) <= definedDistance"

Спасибо за помощь


person Julo0sS    schedule 19.01.2015    source источник


Ответы (1)


Я не согласен с тем, что вы здесь написали:

Некоторые люди говорят о таких функциях, как st_distance или st_within, которые относятся к версиям mysql / mariadb, но эти функции, похоже, не имеют реальной документации и не подходят для моей проблемы.

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

См. Мой пример, где я ищу точки внутри круга радиуса 1 и центра в (2, 2):

CREATE TABLE geom (g GEOMETRY);

INSERT INTO geom VALUES (GeomFromText('POINT(1 1)'));
INSERT INTO geom VALUES (GeomFromText('POINT(1 2)'));
INSERT INTO geom VALUES (GeomFromText('POINT(1 3)'));
INSERT INTO geom VALUES (GeomFromText('POINT(1 4)'));
INSERT INTO geom VALUES (GeomFromText('POINT(2 2)'));
INSERT INTO geom VALUES (GeomFromText('POINT(3 3)'));
INSERT INTO geom VALUES (GeomFromText('POINT(4 4)'));

SELECT AsText(g) from geom where ST_Distance(point(2,2), g) <= 1

Вывод:

POINT(1 2)
POINT(2 2)
person Grzegorz Adam Kowalski    schedule 03.10.2015
comment
Я не думаю, что это правильный ответ. Функция MagiaDB ST_Distance выглядит так, как будто она вычисляет расстояние в декартовой плоскости (т.е. простые вычисления X, Y, а не широту и долготу). В этом случае функцию нельзя использовать для расстояний между точками ГИС. См. Следующее; - person Rory Mapstone; 13.07.2018
comment
set @p1 = point (90,0); set @p2 = point (90,50); select ST_Distance(@p1, @p2); Расстояние должно быть 0, так как обе точки находятся на северном полюсе. Функция дает ответ 50. PS извините за многочисленные комментарии, я не мог понять, как добавить блок кода. - person Rory Mapstone; 13.07.2018