Расчет расстояния 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))