Расчет С PostGIS Расстояние

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

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

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

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, поэтому этот вопрос может показаться простым, но, пожалуйста, помогите мне, я застрял нет @@

1 ответов


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

Если вы хотите расстояние в метрах между двумя точками lat/ lon, используйте 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 дает расстояние в проецируемых координатах, поэтому, вероятно, вы получили странные результаты, подключая значения lat/lon.