Name

ST_Distance — Renvoie la distance entre deux valeurs de geometry ou geography.

Synopsis

float ST_Distance(geometry g1, geometry g2);

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

Description

Pour les types geometry, renvoie la distance cartésienne (planaire) minimale en 2D entre deux géométries, en unités projetées (unités de référence spatiales).

Pour les types geography, la valeur par défaut est la distance géodésique minimale entre deux géographies en mètres, calculée sur le sphéroïde déterminé par le SRID. Si use_spheroid est faux, un calcul sphérique plus rapide est utilisé.

Cette méthode implémente la spécification OGC Simple Features Implementation Specification for SQL 1.1.

Cette méthode implémente la spécification SQL/MM. SQL-MM 3: 5.1.23

Cette méthode prend en charge les types Circular String et Curve.

Disponibilité : 1.5.0 La prise en charge du type geography a été introduite dans la version 1.5. Amélioration de la vitesse pour les géométries planaires afin de mieux gérer les géométries de grande taille ou à nombreux sommets

Amélioration : la version 2.1.0 a amélioré la vitesse pour le type geography. Voir Making Geography faster pour plus de détails.

Amélioration : 2.1.0 - la prise en charge des géométries courbes a été introduite.

Amélioration : 2.2.0 - mesure sur sphéroïde effectuée avec GeographicLib pour une meilleure précision et robustesse. Nécessite PROJ >= 4.9.0 pour profiter de la nouvelle fonctionnalité.

Modifié : 3.0.0 - ne dépend plus de SFCGAL.

Exemples de géométrie

Exemple de géométrie - unités en degrés planaires 4326 est le long lat WGS 84, les unités sont des degrés.

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

Exemple de géométrie - unités en mètres (SRID : 3857, proportionnel aux pixels sur les cartes web populaires). Bien que la valeur soit erronée, les valeurs proches peuvent être comparées correctement, ce qui en fait un bon choix pour des algorithmes tels que KNN ou 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

Exemple de géométrie - unités en mètres (SRID : 3857 comme ci-dessus, mais corrigé par cos(lat) pour tenir compte de la 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

Exemple de géométrie - unités en mètres (SRID : 26986 Massachusetts state plane meters) (plus précis pour le 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

Exemple de géométrie - unités en mètres (SRID : 2163 US National Atlas Equal area) (moins précis)

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

Exemples géographiques

Identique à l'exemple du type geometry, mais avec des unités en mètres - utiliser la sphère pour un calcul légèrement plus rapide et moins précis.

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