MySQL空間函數(shù)ST_Distance_Sphere()的使用方式
空間函數(shù)ST_Distance_Sphere()的使用
返回球體上兩個點和/或多點之間的最小球面距離(以米為單位)
官網(wǎng)(https://dev.mysql.com/doc/refman/5.7/en/spatial-convenience-functions.html)
測試
表結(jié)構(gòu)如下:
create table t_geo_test ( ID int auto_increment primary key, NAME varchar(64) not null, SHAPE geometry not null ) engine = InnoDB charset = utf8;
測試數(shù)據(jù):(插入坐標時,以下兩種寫法都可以)
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;
查詢到某點的距離小于一個值的所有數(shù)據(jù):
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;
注意:
坐標不能隨意寫測試數(shù)據(jù),注意官網(wǎng)中的說的條件:
- 幾何參數(shù)應由指定(經(jīng)度,緯度)坐標值的點組成:
- 經(jīng)度和緯度分別是該點的第一和第二坐標。
- 兩個坐標均以度為單位。
- 經(jīng)度值必須在(-180,180]范圍內(nèi)。正值位于本初子午線以東。
- 緯度值必須在[-90,90]范圍內(nèi)。正值位于赤道以北。
否則則會報錯:
[HY000][1210] Incorrect arguments to st_distance_sphere
st_distance_sphere計算兩坐標點距離
最近項目中需要計算一個坐標點與多個點的距離,發(fā)現(xiàn)用Python來實現(xiàn)效率很低。經(jīng)同事推薦,將這些坐標點存入了Mysql數(shù)據(jù)庫,然后用數(shù)據(jù)庫自帶的方法st_distance_sphere計算距離。經(jīng)過比較發(fā)現(xiàn)確實效率提高了很多,特此記錄一下。
注意:使用st_distance_sphere需要Mysql數(shù)據(jù)庫版本為5.7及以上。
例子
現(xiàn)數(shù)據(jù)庫表中有如下坐標點數(shù)據(jù):
需要找出與第一個坐標點(113.8064049, 22.7300434)相距小于3500米的坐標點(表中共有3500個點)。
sql實現(xiàn):
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;
查詢結(jié)果:
可以看到,共找出41個滿足條件的坐標點,且耗時僅為0.066秒,效率提升非常多。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL8.0.28數(shù)據(jù)庫安裝和主從配置說明
這篇文章主要介紹了MySQL8.0.28數(shù)據(jù)庫安裝和主從配置說明,具有很好的參考價值,希望杜大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12JDK1.7下測試ConnectorJ連接MySQL8.0的方法
MySQL?Connector/J是一個JDBC?4型驅(qū)動程序。Type?4標志意味著驅(qū)動程序是MySQL協(xié)議的純Java實現(xiàn),不依賴于MySQL客戶端庫,這篇文章主要介紹了JDK1.7下測試ConnectorJ連接MySQL8.0,需要的朋友可以參考下2022-10-10Java的Struts框架中的主題模板和國際化設(shè)置
這篇文章主要介紹了Java的Struts框架中的主題模板和國際化設(shè)置,Struts是Java的SSH三大web開放框架之一,需要的朋友可以參考下2015-12-12