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

 更新时间:2022年11月17日 15:37:24   作者:站在墙头上  
这篇文章主要介绍了MySQL空间函数ST_Distance_Sphere()的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

空间函数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秒,效率提升非常多。

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

相关文章

  • 完美转换MySQL的字符集 解决查看utf8源文件中的乱码问题

    完美转换MySQL的字符集 解决查看utf8源文件中的乱码问题

    本人转换过好多数据了,也用过了好多的办法,个人感觉最好用的就是使用MySQL命令导出导入中将字符集转换过去
    2011-11-11
  • Mysql数据库增量备份的思路和方法

    Mysql数据库增量备份的思路和方法

    MySQL数据库增量备份,在这之前修改我们的数据库配置文件/etc/my.cnf开启bin-log日志功能即可,下面小编给大家分享Mysql数据库增量备份的思路详解,一起看看吧
    2017-09-09
  • 浅析mysql union和union all

    浅析mysql union和union all

    union 是对数据进行并集操作,不包括重复行,同时进行默认排序而Union all 是对数据进行并集操作,包括重复行,不进行排序,下面给大家详细介绍mysql union和union all,感兴趣的朋友一起看看吧
    2017-10-10
  • mysql表添加索引的几种实现方法

    mysql表添加索引的几种实现方法

    本文介绍了在MySQL中使用ALTER TABLE语句为表添加索引的几种常见方式,包括普通索引、唯一索引、主键索引和全文索引,感兴趣的可以了解一下
    2024-11-11
  • MySQL提示表不存在的解决error:1146:Table doesn‘t exist的原因和解决方法

    MySQL提示表不存在的解决error:1146:Table doesn‘t exist的原因和解决

    在使用MySQL的过程中,有时会遇到“Table doesn't exist”(表不存在)的错误,错误代码通常为1146,这个问题可能由多种原因引起,本文将帮助你诊断和解决这个问题,如果遇到同样问题的小伙伴跟着小编一起来看看吧
    2024-12-12
  • SQL执行步骤的具体分析

    SQL执行步骤的具体分析

    这篇文章主要介绍了SQL执行步骤的具体分析的相关资料,希望通过本文能帮助到大家,让大家理解掌握SQL是如何执行的,需要的朋友可以参考下
    2017-10-10
  • MySQL笔记 —SQL运算符

    MySQL笔记 —SQL运算符

    这篇文章主要介绍了SQL运算符,在sql语言中常用的运算符有这几种:算术运算符、赋值运算符、比较运算符、逻辑运算符,下面面基于记住运算符资料展开文章内容,需要的小伙伴可以参考一下
    2022-01-01
  • innodb如何巧妙的实现事务隔离级别详解

    innodb如何巧妙的实现事务隔离级别详解

    隔离是ACID(Atomicity,Consistency,Isolation,Durability)的重要部分,下面这篇文章主要给大家介绍了关于innodb如何巧妙的实现事务隔离级别的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-11-11
  • MySQL 使用SQL语句修改表名的实现

    MySQL 使用SQL语句修改表名的实现

    这篇文章主要介绍了MySQL 使用SQL语句修改表名的实现操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • MySQL 优化设置步骤

    MySQL 优化设置步骤

    mysql的一些运行效率等优化设置,建议拥有服务器的朋友,可以测试。
    2009-03-03

最新评论