ST_Distance — 返回两个几何或地理值之间的距离。
float ST_Distance(geometry g1, geometry g2);
float ST_Distance(geography geog1, geography geog2, boolean use_spheroid = true);
对于geometry,返回两个几何之间的最小 2D 笛卡尔(平面)距离,以投影单位(空间参考单位)表示。
对于geography,默认返回两个地理位置之间的最小测地距离(以米为单位),在由 SRID 确定的椭球体上进行计算。 如果 use_spheroid 为 false,则使用更快的球面计算。
此方法实现了 SQL 1.1 的 OGC 简单功能规范。
该方法实现了SQL/MM规范。 SQL-MM 3: 5.1.23
此方法支持圆形字符串和曲线。
可用性:1.5.0 地理支持在 1.5 中引入。 提高了平面的速度,以更好地处理大型或多个顶点几何图形
增强功能:2.1.0版本提升了地理(Geography)类型的速度。有关详细信息,请参阅Making Geography faster。
增强: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