开发者

MySQL空间函数ST_Distance_Sphere()的使用方式

开发者 https://www.devze.com 2022-12-12 12:08 出处:网络 作者: 站在墙头上
目录空间函数ST_Distance_Sphere()的使用测试st_distance_sphere计算两坐标点距离例子空间函数ST_Distance_Sphere()的使用
目录
  • 空间函数ST_Distance_Sphere()的使用
    • 测试
  • st_distance_sphere计算两坐标点距离
    • 例子

空间函数ST_Distance_Sphere()的使用

返回球体上两个点和/或多点之间的最小球面距离(以米为单位)

官网(https://dev.mysql.com/doc/refman/5.7/en/spatwww.devze.comial-conve编程客栈nience-functions.html)

MySQL空间函数ST_Distance_Sphere()的使用方式

测试

表结构如下:

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 OjsRDER BY distant;

注意:

坐标不能随意写测试数据,注意官网中的说的条件:

  • 几何参数应由指定(经度,纬度)坐标值的点组成:
  • 经度和纬度分别是该点的第一和第二坐标。
  • 两个坐标均以度为单位。
  • 经度值必须在(-180,180]范围内。正值位于本初子午线以东。
  • 纬度值必须在[-90,90]范围内。正值位于赤道以北。

否则则会报错:

[HY000][1210] Incorrect arguments to st_distance_sphere

st_distance_sphere计算两坐标点距离

最近项目中需要计算一个坐标点与多个点的距离,发现用python来实现效率很低。经同事推荐,将这些坐标点存入了Mysql数据库,然后用数据库自带的方法st_distance_sphere计算距离。经过比较发现确实效率提高了很多,特此记录一下。

注意:使用st_distance_sphphpere需要Mysql数据库版本为5.7及以上。

例子

现数据库表中有如下坐标点数据:

MySQL空间函数ST_Distance_Sphere()的使用方式

需要找出与第一个坐标点(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开发者_Spark),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;

查询结果:

MySQL空间函数ST_Distance_Sphere()的使用方式

可以看到,共找出41个满足条件的坐标点,且耗时仅为0.066秒,效率提升非常多。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号