首頁 > 軟體

MySQL空間函數ST_Distance_Sphere()的使用方式

2022-11-21 14:02:46

空間函數ST_Distance_Sphere()的使用

返回球體上兩個點和/或多點之間的最小球面距離(以米為單位)

官網(https://dev.mysql.com/doc/refman/5.7/en/spatial-convenience-functions.html

測試

表結構如下:

create table t_geo_test
(
    ID    int auto_increment
        primary key,
    NAME  varchar(64) not null,
    SHAPE geometry    not null
)
    engine = InnoDB
    charset = utf8;

測試資料:(插入座標時,以下兩種寫法都可以)

INSERT INTO t_geo_test VALUES (1, '測試', POINT(121.590347, 31.388094));
INSERT INTO t_geo_test VALUES (2, 'somewhere', ST_GeomFromText('POINT(121.366961 31.190049)'));

計算距離:

SELECT st_distance_sphere(POINT(121.590347, 31.388094),SHAPE) AS distant FROM t_geo_test;

查詢到某點的距離小於一個值的所有資料:

SELECT *, ST_Distance_Sphere(POINT(121.590347, 31.388094),SHAPE) AS distant FROM t_geo_test WHERE ST_Distance_Sphere(POINT(121.590347, 31.388094),SHAPE) < 1000 ORDER BY distant;

注意:

座標不能隨意寫測試資料,注意官網中的說的條件:

  • 幾何引數應由指定(經度,緯度)座標值的點組成:
  • 經度和緯度分別是該點的第一和第二座標。
  • 兩個座標均以度為單位。
  • 經度值必須在(-180,180]範圍內。正值位於本初子午線以東。
  • 緯度值必須在[-90,90]範圍內。正值位於赤道以北。

否則則會報錯:

[HY000][1210] Incorrect arguments to st_distance_sphere

st_distance_sphere計算兩座標點距離

最近專案中需要計算一個座標點與多個點的距離,發現用Python來實現效率很低。經同事推薦,將這些座標點存入了Mysql資料庫,然後用資料庫自帶的方法st_distance_sphere計算距離。經過比較發現確實效率提高了很多,特此記錄一下。

注意:使用st_distance_sphere需要Mysql資料庫版本為5.7及以上。

例子

現資料庫表中有如下座標點資料:

需要找出與第一個座標點(113.8064049, 22.7300434)相距小於3500米的座標點(表中共有3500個點)。

sql實現:

select t.num,t.city,t.wgs84_lng,t.wgs84_lat,
  TRUNCATE(st_distance_sphere(point (113.8064049, 22.7300434),point(t.wgs84_lng,t.wgs84_lat)),2) as distance
	from moran_point t
	where t.city = '深圳' 
	HAVING distance > 0 and distance < 3500
	ORDER BY distance;

查詢結果:

可以看到,共找出41個滿足條件的座標點,且耗時僅為0.066秒,效率提升非常多。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com