ST_Distance — Gibt die größte 3-dimensionale Distanz zwischen zwei geometrischen Objekten als Linie zurück
float ST_Distance(
geometry g1, geometry g2)
;
float ST_Distance(
geography geog1, geography geog2, boolean use_spheroid = true)
;
Für den geometrischen Datentyp. Es wird der geringste 3-dimensionale kartesische Abstand zwischen zwei geometrischen Objekten in projizierten Einheiten (Einheiten des Koordinatenreferenzsystem) zurückgegeben.
Beim geometrischen Datentyp geometry wird die geringste kartesische Distanz in 2D zwischen zwei geometrischen Objekten - in projizierten Einheiten (Einheiten des Koordinatenreferenzsystem) - zurückgegeben. Beim geographischen Datentyp geography wird standardmäßig die geringste geodätische Distanz zwischen zwei geographischen Objekten in Meter zurückgegeben. Wenn use_speroid FALSE ist, erfolgt eine schnellere Berechnung auf einer Kugel anstatt auf dem Referenzellipsoid.
Diese Methode implementiert die OGC Simple Features Implementation Specification for SQL 1.1.
Diese Methode setzt die SQL/MM-Spezifikation um. SQL-MM 3: 5.1.23
Diese Methode unterstützt kreisförmige Strings und Kurven.
Verfügbarkeit: 1.5.0 die Unterstützung des geograpischen Datentyps wurde eingeführt. Geschwindigkeitsverbesserungen bei einer umfangreichen Geometrie und bei einer Geometrie mit vielen Knoten
Enhanced: 2.1.0 Geschwindigkeitsverbesserung beim geographischen Datentyp. Siehe Making Geography faster für Details.
Erweiterung: 2.1.0 - Unterstützung für Kurven beim geometrischen Datentyp eingeführt.
Erweiterung: 2.2.0 - die Messung auf dem Referenzellipsoid wird mit der Bibliothek "GeographicLib" durchgeführt. Dadurch wurde die Genauigkeit und die Robustheit erhöht. Um die Vorteile dieser neuen Funktionalität zu nutzen, benötigen Sie Proj >= 4.9.0.
Geändert: 3.0.0 - hängt nicht mehr von SFCGAL ab.
Geometriebeispiel - Einheiten in Grad 4326 ist WGS 84 long lat, Einheiten sind Grad.
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
Geometriebeispiel - Einheiten in Metern (SRID: 3857, proportional zu Pixeln auf gängigen Webkarten). Obwohl der Wert nicht stimmt, können nahe gelegene Werte korrekt verglichen werden, was ihn zu einer guten Wahl für Algorithmen wie KNN oder KMeans macht.
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
Geometriebeispiel - Einheiten in Metern (SRID: 3857 wie oben, aber korrigiert um cos(lat), um die Verzerrung zu berücksichtigen)
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
Geometriebeispiel - Einheiten in Metern (SRID: 26986 Massachusetts state plane meters) (am genauesten 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
Geometriebeispiel - Einheiten in Metern (SRID: 2163 US National Atlas Equal area) (am wenigsten genau)
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
Wie im Geometrie-Beispiel, aber beachten Sie die Einheiten in Metern - verwenden Sie die Kugel für eine etwas schnellere und weniger genaue Berechnung.
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