Краткий ответ:
Просто конвертируйте значения x, y на лету, используя ST_MakePoint
(учтите накладные расходы!)и вычислите расстояние от заданной точки, SRS по умолчанию будет WGS84
:
SELECT ST_Distance(ST_MakePoint(lon,lat)::GEOGRAPHY,
ST_MakePoint(23.73,37.99)::GEOGRAPHY) FROM places;
Используя GEOGRAPHY
, вы получите результат в метрах, а GEOMETRY
даст это в градусах.Конечно, знание SRS пар координат необходимо для расчета расстояний, но если у вас есть контроль качества данных, а координаты согласованы (в данном случае, исключая SRS), беспокоиться не о чем.Сложно начать, если вы планируете выполнять операции с использованием внешних данных, откуда вы также не знаете о SRS, и это может отличаться от вашего.
Длинный ответ:
Что ж, если вы используете PostGIS, вам не следует использовать x, y в отдельных столбцах в первомместо.Вы можете легко добавить столбец геометрии / географии, выполнив что-то вроде этого.
Это ваша таблица ...
CREATE TABLE places (place TEXT, lon NUMERIC, lat NUMERIC);
, содержащая следующие данные ..
INSERT INTO places VALUES ('Budva',18.84,42.92),
('Ohrid',20.80,41.14);
Вот как вы добавляете столбец с типом географии:
ALTER TABLE places ADD COLUMN geo GEOGRAPHY;
После добавления столбца вы преобразуете свои координаты в географию / геометрию и обновляете свою таблицу:
UPDATE places SET geo = ST_MakePoint(lon,lat);
Для вычисления расстояния вам просто нужно использовать функцию ST_Distance
, как показано ниже (расстояние в метрах):
SELECT ST_Distance(geo,ST_MakePoint(23.73,37.99)) FROM places;
st_distance
-----------------
686560.16822422
430876.07368955
(2 Zeilen)
Если у вас есть параметр местоположения в WKT
, вы также можете использовать:
SELECT ST_Distance(geo,'POINT(23.73 37.99)') FROM places;
st_distance
-----------------
686560.16822422
430876.07368955
(2 Zeilen)