ST_Distance — Returnerar avståndet mellan två geometri- eller geografivärden.
float ST_Distance(
geometry g1, geometry g2)
;
float ST_Distance(
geography geog1, geography geog2, boolean use_spheroid = true)
;
För geometry -typer returneras det minsta kartesiska (plana) 2D-avståndet mellan två geometrier, i projicerade enheter (spatiala ref-enheter).
För geography -typer är standardvärdet att returnera det minsta geodetiska avståndet mellan två geografiska platser i meter, beräkna på den sfäroid som bestäms av SRID. Om use_spheroid
är false används en snabbare sfärisk beräkning.
Denna metod implementerar OGC:s implementeringsspecifikation för enkla funktioner för SQL 1.1.
Denna metod implementerar SQL/MM-specifikationen. SQL-MM 3: 5.1.23
Denna metod stöder cirkulära strängar och kurvor.
Tillgänglighet: 1.5.0 Stöd för geografi infördes i 1.5. Hastighetsförbättringar för planar för att bättre hantera stora eller många vertexgeometrier
Förbättrad: 2.1.0 förbättrad hastighet för geografi. Se Göra geografi snabbare för mer information.
Förbättrad: 2.1.0 - stöd för krökta geometrier infördes.
Förbättrad: 2.2.0 - mätning på sfäroid utförd med GeographicLib för förbättrad noggrannhet och robusthet. Kräver PROJ >= 4.9.0 för att dra nytta av den nya funktionen.
Ändrad: 3.0.0 - är inte längre beroende av SFCGAL.
Geometriexempel - enheter i plana grader 4326 är WGS 84 long lat, enheter är grader.
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
Geometriexempel - enheter i meter (SRID: 3857, proportionell mot pixlar på populära webbkartor). Även om värdet är felaktigt kan närliggande värden jämföras korrekt, vilket gör det till ett bra val för algoritmer som KNN eller 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
Geometriexempel - enheter i meter (SRID: 3857 som ovan, men korrigerad med cos(lat) för att ta hänsyn till distorsion)
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
Geometriexempel - enheter i meter (SRID: 26986 Massachusetts state plane meter) (mest exakt för 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) ); ----------------- 123.797937878454
Geometriexempel - enheter i meter (SRID: 2163 US National Atlas Equal area) (minst exakt)
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
Samma som geometriexemplet men notera enheter i meter - använd sfär för något snabbare och mindre exakta beräkningar.
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