2014-09-16 9 views
0

У меня вопрос об использовании postgreSQL/postGIS.Получите метрическое расстояние между двумя точками через запрос PostgreSQL/PostGIS

Я хотел бы отображать маркеры на карте (хранящейся в базе данных), которые находятся на некотором расстоянии от пользователя (координаты, заданные для запроса).

Тип поля маркеров - POINT (я храню lat/long). Позиция пользователя определяется программой API Карт Google.

Вот фактический запрос:

SELECT * FROM geo_points WHERE ST_distance(ST_SetSRID(geo_points.coords::geometry,4326),ST_GeomFromEWKT('SRID=4326;POINT(45.0653944 4.859764599999996)')) > 65 

Я знаю (после некоторых исследований в Интернете), что функция ST_distance дает мне расстояние в градусах между маркерами и местоположения пользователя, и что я проверить расстояние в км ,

Я думаю, что мне нужно использовать функцию ST_tranform для преобразования точек в метрических координатах.

Так что мои вопросы: - что такое SRID для Франции? - как я могу сделать это динамически для всего мира в соответствии с положением пользователя?

Я также знаю, что существует функция ST_within, и это может сделать это. Но я ожидаю, что позже мне понадобится дистанция.

Любая помощь будет высоко оценена

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

+0

на основе [это] (http://postgis.refractions.net/docs/ST_Distance.html), ST_Distance - для типа геометрии Возвращает двумерное декартовое минимальное расстояние (на основе пространственного реф) между двумя геометриями в проецируемых единицах –

+0

попробуйте [ST_Distance_Sphere] (http://postgis.refractions.net/docs/ST_Distance_Sphere.html) –

ответ

1

Во-первых, обратите внимание на порядок координат координат, используемый PostGIS, он должен быть длинным/лат. В настоящее время you are searching in Somalia. Переключение на координаты, you would be searching in France.

Вы можете использовать геодезические расчеты с помощью geography type или использовать геодезические функции, такие как ST_Distance_Spheroid. С типом географии вы можете использовать ST_DWithin для повышения производительности.

Вот geo_points 65 метров или меньше с точки интереса во Франции (не Сомали):

SELECT * FROM geo_points 
WHERE ST_Distance_Spheroid(
    ST_Transform(geo_points.coords::geometry, 4326), 
    ST_SetSRID(ST_MakePoint(4.859764599999996, 45.0653944), 4326), 
    'SPHEROID["WGS 84",6378137,298.257223563]') < 65.0; 

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

Если изменить и преобразовать geo_points.coords хранить долгота/широта (WGS84) как тип geography:

SELECT * FROM geo_points 
WHERE ST_DWithin(
    geo_points::geography, 
    ST_SetSRID(ST_MakePoint(4.859764599999996, 45.0653944), 4326)::geography, 
    65.0); 
Смежные вопросы