Единица возвращаемого значения 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 и другие функции для использования линейных единиц метров.