[整理] MySQL 使用空間函數 st_distance_sphere ,通過經緯度查詢最近的地點

 

創建數據表

create table data_point
(
    ID    int auto_increment primary key,
    city  varchar(64) not null,
    pt geometry    not null
)

插入數據

INSERT INTO data_point (city, pt) VALUES ('成都',ST_GeomFromText('POINT(104.040 30.400)'));
INSERT INTO data_point (city, pt) VALUES ('巴中',ST_GeomFromText('POINT(106.43 31.51)'));
INSERT INTO data_point (city, pt) VALUES ('崇州',ST_GeomFromText('POINT(103.4 30.39)'));
INSERT INTO data_point (city, pt) VALUES ('達州',ST_GeomFromText('POINT(107.29 31.14)'));
INSERT INTO data_point (city, pt) VALUES ('德陽',ST_GeomFromText('POINT(104.22 31.09)'));
INSERT INTO data_point (city, pt) VALUES ('都江堰',ST_GeomFromText('POINT(103.37 31.01)'));
INSERT INTO data_point (city, pt) VALUES ('峨眉山',ST_GeomFromText('POINT(103.29 29.36)'));
INSERT INTO data_point (city, pt) VALUES ('涪陵',ST_GeomFromText('POINT(107.22 29.42)'));
INSERT INTO data_point (city, pt) VALUES ('廣漢',ST_GeomFromText('POINT(104.15 30.58)'));
INSERT INTO data_point (city, pt) VALUES ('廣元',ST_GeomFromText('POINT(105.51 32.28)'));
INSERT INTO data_point (city, pt) VALUES ('華鎣',ST_GeomFromText('POINT(106.44 30.26)'));
INSERT INTO data_point (city, pt) VALUES ('簡陽',ST_GeomFromText('POINT(104.32 30.24)'));
INSERT INTO data_point (city, pt) VALUES ('江油',ST_GeomFromText('POINT(104.42 31.48)'));
INSERT INTO data_point (city, pt) VALUES ('閬中',ST_GeomFromText('POINT(105.58 31.36)'));
INSERT INTO data_point (city, pt) VALUES ('樂山',ST_GeomFromText('POINT(103.44 29.36)'));
INSERT INTO data_point (city, pt) VALUES ('瀘州',ST_GeomFromText('POINT(105.24 28.54)'));
INSERT INTO data_point (city, pt) VALUES ('綿陽',ST_GeomFromText('POINT(104.42 31.3)'));
INSERT INTO data_point (city, pt) VALUES ('南充',ST_GeomFromText('POINT(106.04 30.49)'));
INSERT INTO data_point (city, pt) VALUES ('內江',ST_GeomFromText('POINT(105.02 29.36'));
INSERT INTO data_point (city, pt) VALUES ('攀枝花',ST_GeomFromText('POINT(101.43 26.34)'));
INSERT INTO data_point (city, pt) VALUES ('彭州',ST_GeomFromText('POINT(103.57 30.59)'));
INSERT INTO data_point (city, pt) VALUES ('邛崍',ST_GeomFromText('POINT(103.28 30.26)'));
INSERT INTO data_point (city, pt) VALUES ('遂寧',ST_GeomFromText('POINT(105.33 30.31)'));
INSERT INTO data_point (city, pt) VALUES ('萬縣',ST_GeomFromText('POINT(108.21 30.5)'));
INSERT INTO data_point (city, pt) VALUES ('萬源',ST_GeomFromText('POINT(108.03 32.03)'));
INSERT INTO data_point (city, pt) VALUES ('西昌',ST_GeomFromText('POINT(102.16 27.54)'));
INSERT INTO data_point (city, pt) VALUES ('雅安',ST_GeomFromText('POINT(102.59 29.59)'));
INSERT INTO data_point (city, pt) VALUES ('宜賓',ST_GeomFromText('POINT(104.34 28.47)'));
INSERT INTO data_point (city, pt) VALUES ('自貢',ST_GeomFromText('POINT(104.46 29.23)'));
INSERT INTO data_point (city, pt) VALUES ('資陽',ST_GeomFromText('POINT(104.38 30.09)'));

函數st_distance_sphere 和 st_distance

SELECT st_distance_sphere(POINT(121.590346, 31.388096),POINT(121.590345, 31.388095)) AS distant

結果(單位:米)
0.14620023407776306

SELECT st_distance(POINT(121.590346, 31.388096),POINT(121.590345, 31.388095))*111195 AS distant

結果:
0.15725347695038774

st_distance 計算的結果單位是度,需要乘111195(地球半徑6371000*PI/180)是將值轉化爲米。

爲什麼不一樣呢?

因爲在不同緯度,每度的長度是不一樣的。所以 st_distance_sphere 的結果是準確的。

查詢距離成都最近的5個地方

SELECT city,distance FROM (SELECT *, ST_DISTANCE_SPHERE(pt, POINT(104.040,30.400)) AS DISTANCE FROM data_point) A
ORDER BY distance ASC LIMIT 5

結果:

"成都"	"0"
"廣漢"	"22620.652448243116"
"簡陽"	"32231.016053941366"
"資陽"	"47485.51587937459"
"彭州"	"49741.88669713098"
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章