Name

ST_Distance — For geometry type returns the 2D Cartesian distance between two geometries in projected units (based on spatial reference system). For geography type defaults to return minimum geodesic distance between two geographies in meters.

Synopsis

float ST_Distance(geometry g1, geometry g2);

float ST_Distance(geography gg1, geography gg2);

float ST_Distance(geography gg1, geography gg2, boolean use_spheroid);

Description

For geometry type returns the minimum 2D Cartesian distance between two geometries in projected units (spatial ref units). For geography type defaults to return the minimum geodesic distance between two geographies in meters. If use_spheroid is false, a faster sphere calculation is used instead of a spheroid.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

This method implements the SQL/MM specification. SQL-MM 3: 5.1.23

This method supports Circular Strings and Curves

Availability: 1.5.0 geography support was introduced in 1.5. Speed improvements for planar to better handle large or many vertex geometries

Enhanced: 2.1.0 improved speed for geography. See Making Geography faster for details.

Enhanced: 2.1.0 - support for curved geometries was introduced.

Enhanced: 2.2.0 - measurement on spheroid performed with GeographicLib for improved accuracy and robustness. Requires Proj >= 4.9.0 to take advantage of the new feature.

Changed: 3.0.0 - does not depend on SFCGAL anymore.

Basic Geometry Examples

Geometry example - units in planar degrees 4326 is WGS 84 long lat, units are degrees.

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

Geometry example - units in meters (SRID: 3857, proportional to pixels on popular web maps). Although the value is off, nearby ones can be compared correctly, which makes it a good choice for algorithms like KNN or 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)
		);
st_distance
-----------------
167.441410065196

Geometry example - units in meters (SRID: 3857 as above, but corrected by cos(lat) to account for distortion)

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);
st_distance
-----------------
123.742351254151

Geometry example - units in meters (SRID: 26986 Massachusetts state plane meters) (most accurate for Massachusetts)

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)
		);
st_distance
-----------------
123.797937878454

Geometry example - units in meters (SRID: 2163 US National Atlas Equal area) (least accurate)

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)
		);

st_distance
------------------
126.664256056812

Geography Examples

Same as geometry example but note units in meters - use sphere for slightly faster and less accurate computation.

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

See Also

ST_3DDistance, ST_DWithin, ST_DistanceSphere, ST_DistanceSpheroid, ST_MaxDistance, ST_HausdorffDistance, ST_FrechetDistance, ST_Transform