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ă.