Единица возвращаемого значения расстояния ST
мне нужно рассчитать расстояние между
- все здания и
- все больницы
на карте, импортированной из 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: образец результат:
обновление 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 также будет иметь lenth единиц градусов, которые на самом деле не полезны.
есть несколько вещей, которые вы можете сделать:
- использовать ST_Distance_Sphere для быстрые / приблизительные расстояния в метрах
- использовать ST_Distance_Spheroid для accurace расстояния в метрах
- преобразовать LAT/длинные
geometry
типы данныхgeography
, что автоматически делает ST_Distance и другие функции для использования линейных единиц метров