Name

ST_Distance — Gibt die größte 3-dimensionale Distanz zwischen zwei geometrischen Objekten als Linie zurück

Synopsis

float ST_Distance(geometry g1, geometry g2);

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

Beschreibung

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

Erweitert: 2.1.0 verbesserte die Geschwindigkeit für Geographie. Weitere Details finden Sie unter Making Geography faster.

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.

Beispiele mit dem geometrischen Datentyp

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

Beispiele für den geographischen Datentyp 

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