Единица возвращаемого значения ST_Distance
Мне нужно рассчитать расстояние между
- все здания и
- все больницы
на карте, импортированной из OSM.
Я использую следующий запрос:
SELECT building_id, hospital_id, ST_Distance(building_centroid, hospital_location)
FROM
(
select planet_osm_polygon.osm_id building_id, ST_Centroid(planet_osm_polygon.way) building_centroid
from planet_osm_polygon
where building = 'yes'
) buildings,
(
select planet_osm_point.osm_id hospital_id, planet_osm_point.way hospital_location
from planet_osm_point
where amenity = 'hospital') hospitals
Я получаю странные результаты - расстояние всегда меньше 1.
Как я могу узнать об устройстве, в котором сообщаются эти значения?
Обновление 1: Пример результата:
![Sample result of the query above]()
Обновление 2: Этот запрос работает
SELECT building_id, hospital_id, ST_Distance_sphere(building_centroid, hospital_location) distance
FROM
(
select planet_osm_polygon.osm_id building_id, ST_Centroid(planet_osm_polygon.way) building_centroid
from planet_osm_polygon
where building = 'yes'
) buildings,
(
select planet_osm_point.osm_id hospital_id, planet_osm_point.way hospital_location
from planet_osm_point
where amenity = 'hospital') hospitals
ORDER BY distance
Ответы
Ответ 1
Общее правило для единиц состоит в том, что единицы длины вывода такие же, как единицы длины ввода.
Геометрические данные OSM way
имеют единицы длины градусов и долготы (SRID=4326
). Следовательно, выходные единицы из ST_Distance также будут иметь единицы единиц градусов, что не очень полезно.
Есть несколько вещей, которые вы можете сделать:
- Используйте ST_Distance_Sphere для быстрого/приблизительного расстояния в метрах
- Используйте ST_Distance_Spheroid для точных расстояний в метрах
- Преобразуйте типы данных lat/long
geometry
в geography
, что автоматически делает ST_Distance и другие функции для использования линейных единиц метров.