ST_Distance_Sphere() în MySQL

Returnează distanța pe o sferă (în metri) dintre două puncte; un calcul rapid, aproximativ, pentru coordonate GPS.

Sintaxă
ST_Distance_Sphere(g1, g2 [, raza])

Ce face ST_Distance_Sphere()

ST_Distance_Sphere() consideră Pământul o sferă perfectă și calculează distanța cea mai scurtă pe suprafața ei, în metri. Funcționează doar cu POINT și MULTIPOINT. Rezultatul diferă puțin (de obicei sub 0,5%) față de ST_Distance(), care folosește elipsoidul.

Pentru SRID 4326 raza implicită este raza medie a elipsoidului. Pentru SRID 0, X este longitudinea și Y latitudinea, în grade, iar raza implicită este 6.370.986 m. Al treilea argument permite altă rază, în metri.

Parametri

Parametru Descriere
g1, g2 Puncte (sau MULTIPOINT).
raza Opțional: raza sferei, în metri.

Ce returnează

Distanța în metri.

Exemple

Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.

CREATE TABLE orase (
  id INT PRIMARY KEY,
  nume VARCHAR(20),
  loc POINT NOT NULL SRID 4326,
  SPATIAL INDEX (loc)
);

INSERT INTO orase VALUES
  (1, 'Iași',        ST_GeomFromText('POINT(47.1585 27.6014)', 4326)),
  (2, 'Cluj-Napoca', ST_GeomFromText('POINT(46.7712 23.6236)', 4326)),
  (3, 'București',   ST_GeomFromText('POINT(44.4268 26.1025)', 4326)),
  (4, 'Timișoara',   ST_GeomFromText('POINT(45.7489 21.2087)', 4326)),
  (5, 'Constanța',   ST_GeomFromText('POINT(44.1598 28.6348)', 4326));

Exemplul 1: Distanțe de la Iași: sferă comparată cu elipsoid

SELECT b.nume,
       ROUND(ST_Distance_Sphere(a.loc, b.loc) / 1000, 1) AS km_sfera,
       ROUND(ST_Distance(a.loc, b.loc) / 1000, 1) AS km_elipsoid
FROM orase a JOIN orase b ON a.nume = 'Iași' AND b.id <> a.id
ORDER BY km_sfera;

Rezultat

+-------------+----------+-------------+
| nume        | km_sfera | km_elipsoid |
+-------------+----------+-------------+
| Cluj-Napoca |    304.9 |       305.7 |
| București   |    325.2 |       325.2 |
| Constanța   |      343 |       342.9 |
| Timișoara   |      514 |       515.3 |
+-------------+----------+-------------+

Exemplul 2: Orașe la mai puțin de 400 km de București

SELECT b.nume, ROUND(ST_Distance_Sphere(a.loc, b.loc) / 1000) AS km
FROM orase a JOIN orase b ON a.nume = 'București' AND b.id <> a.id
WHERE ST_Distance_Sphere(a.loc, b.loc) < 400000
ORDER BY km;

Rezultat

+-------------+------+
| nume        | km   |
+-------------+------+
| Constanța   |  204 |
| Cluj-Napoca |  324 |
| Iași        |  325 |
+-------------+------+

Exemplul 3: Puncte cu SRID 0: Point(longitudine, latitudine)

SELECT ROUND(ST_Distance_Sphere(Point(27.6014, 47.1585), Point(23.6236, 46.7712)) / 1000, 1) AS km_iasi_cluj,
       ROUND(ST_Distance_Sphere(Point(27.6014, 47.1585), Point(23.6236, 46.7712), 6378137) / 1000, 1) AS km_raza_ecuator;

Rezultat

+--------------+-----------------+
| km_iasi_cluj | km_raza_ecuator |
+--------------+-----------------+
|        304.9 |           305.2 |
+--------------+-----------------+

Greșeli frecvente

  • Treci linii sau poligoane. Funcția acceptă doar puncte; pentru alte geometrii folosește ST_Distance().

Comenzi înrudite

  • ST_Distance(): Returnează distanța minimă dintre două geometrii; pentru SRID 4326, în metri, calculată pe elipsoidul Pământului.
  • ST_GeoHash(): Codifică o poziție (longitudine, latitudine) într-un geohash: un text scurt, ca u87sk0fw pentru Iași.
  • ST_Latitude() și ST_Longitude(): Returnează latitudinea sau longitudinea unui punct geografic (de exemplu SRID 4326) ori îl modifică.