Расчет расстояния PostGis

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

Все координаты, которые я использую, взяты из Google Map (это означает, что EPSG - 3857). Теперь мне нужно найти расстояние в метрах, а также использовать D_Within в метрах.

Когда я пытаюсь извлечь расстояние между двумя точками:

SELECT ST_DISTANCE(
ST_GeomFromText('POINT(' || StartLon || ' ' || StartLat || ')',3857),
ST_GeomFromText('POINT(' || EndLon || ' ' || EndLat || ')',3857))
FROM i3_building.floordata;

Для первых 2 строк с:

Start: 103.776047 1.292149; End: 103.77607 1.292212 (3 meters away)
Start: 103.776070 1.292212; End: 103.77554 1.292406 (50 meters away)

Результат дан

2.59422435413724e-005
4.11096095831604e-005

Даже если они находятся в рад, второй результат только в два раза выше, чем первый. Так что это меня смущает. Затем я пытаюсь вывести его в метрах:

SELECT ST_DISTANCE(
    ST_GeographyFromText('POINT(' || StartLon || ' ' || StartLat || ')'),
    ST_GeographyFromText('POINT(' || EndLon || ' ' || EndLat || ')'))
FROM i3_building.floordata;

Результат, приведенный для тех же строк:

2.872546829
4.572207435

Что не так, как я ожидал. Я не очень знаком с PostGis и SRID, поэтому этот вопрос может показаться простым, но, пожалуйста, помогите мне, я не застрял @@

2 ответа

Решение

Ваша система координат координат (CRS) - 4326, широта / долгота. Это общий источник путаницы с Google Maps: 3857 - это CRS, используемый Google Maps для своих плиток, и проецируемые метры основаны на сферическом глобусе. Векторные источники, добавляемые в Карты Google (данные KML, дампы GPS и т. Д.), Как правило, находятся в широте / долготе, 4326, что измеряется в градусах и конвертируется на лету.

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

select st_distance_sphere(st_makepoint(103.776047, 1.292149),st_makepoint(103.77607, 1.292212));

что дает 7,457 метра. Ваш второй набор точек 62,74 метра друг от друга, на основе того же запроса.

Обратите внимание, что есть также ST_Distance_Spheroid, который принимает третий параметр - сфероид измерения, то есть приближение формы Земли. Это может быть более точным, но, вероятно, незначительным на небольших расстояниях.

ST_Distance дает расстояние в проецируемых координатах, поэтому, вероятно, вы получили странные результаты при подключении значений широт / долгот.

Вот псевдокод

      SELECT ST_Distance_Sphere(ST_MakePoint(lng1, lat1),ST_MakePoint(lng2, lat2));

Кроме того, для новой функции "ST_DistanceSphere" для расстояния до сферы используйте следующее:

      SELECT ST_DistanceSphere(ST_MakePoint(lng1,lat1),ST_MakePoint(lng2,lat2)) 
Другие вопросы по тегам