名称

ST_Distance — 返回两个几何或地理值之间的距离。

概要

float ST_Distance(geometry g1, geometry g2);

float ST_Distance(geography geog1, geography geog2, boolean use_spheroid = true);

描述

对于 geometry 类型,返回两个几何图形之间的最小 2D Cartesian(平面)距离,单位为投影单位(空间参考单位)。

对于 geography 类型,默认返回两个地理位置之间以米为单位的最小测地线距离,计算基于 SRID 确定的椭球体。 如果 use_spheroid 为 false,则使用更快的球面计算。

此方法实现了 OGC Simple Features Implementation Specification for SQL 1.1。

此方法实现了 SQL/MM 规范。SQL-MM 3: 5.1.23

此方法支持圆弧字符串和曲线。

可用性:1.5.0 版本引入了地理支持。 平面速度的改进可以更好地处理大型或多顶点几何图形

增强:2.1.0 版本提高了地理速度。有关详细信息,请参阅 使地理更快

增强:2.1.0 - 引入了对弯曲几何图形的支持。

增强:2.2.0 - 在椭球体上使用 GeographicLib 进行测量,以提高精度和鲁棒性。 需要 PROJ >= 4.9.0 才能利用新功能。

更改:3.0.0 - 不再依赖 SFCGAL。

几何示例

几何示例 - 平面度量单位,4326 是 WGS 84 经纬度,单位为度。

SELECT ST_Distance(
    'SRID=4326;POINT(-72.1235 42.3521)'::geometry,
    'SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry );
-----------------
0.00150567726382282

几何示例 - 单位为米(SRID:3857,与热门网络地图上的像素成比例)。 虽然该值不准确,但可以正确比较附近的像素,这使其成为 KNN 或 KMeans 等算法的良好选择。

SELECT ST_Distance(
    ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 3857),
    ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry, 3857) );
-----------------
167.441410065196

几何示例 - 单位为米(SRID:3857,如上所示,但通过 cos(lat) 校正以补偿失真)

SELECT ST_Distance(
    ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 3857),
    ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry, 3857)
		) * cosd(42.3521);
-----------------
123.742351254151

几何示例 - 单位为米(SRID:26986 马萨诸塞州州立平面米)(对于马萨诸塞州最准确)

SELECT ST_Distance(
    ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 26986),
    ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry, 26986) );
-----------------
123.797937878454

几何示例 - 单位为米(SRID:2163 美国国家地图集等面积)(最不准确)

SELECT ST_Distance(
    ST_Transform('SRID=4326;POINT(-72.1235 42.3521)'::geometry, 2163),
    ST_Transform('SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geometry, 2163) );
------------------
126.664256056812

地理示例

与几何示例相同,但请注意单位为米 - 使用球体进行稍微更快且不太准确的计算。

SELECT ST_Distance(gg1, gg2) As spheroid_dist, ST_Distance(gg1, gg2, false) As sphere_dist
FROM (SELECT
    'SRID=4326;POINT(-72.1235 42.3521)'::geography as gg1,
    'SRID=4326;LINESTRING(-72.1260 42.45, -72.123 42.1546)'::geography as gg2
	) As foo  ;

  spheroid_dist   |   sphere_dist
------------------+------------------
 123.802076746848 | 123.475736916397