mysql距离函数st_distance

原创 2016年06月02日 00:41:36

随着近几年各类移动终端的迅速普及,在手机移动定位app中,附近的人,附近的地点功能十分常见,基于地理位置的服务(LBS)和相关应用也越来越多,而支撑这些应用的最基础技术之一,就是基于地理位置信息的处理。

st_distance 函数
st_distance 函数是从mysql5.6.1才加入的。
SET @g1 = POINT(1,1), @g2 = POINT(2,2);
select st_distance (@g1, @g2);
输出结果:1.4142135623730951

SELECT st_distance (point (1, 1),point(2,2) ) * 111195
//输出结果:157253.47706807632 单位:米
st_distance 计算的结果单位是度,需要乘111195(地球半径6371000*PI/180)是将值转化为米。

当然你也可以自定义距离函数:
CREATE FUNCTION slc (
lat1 DOUBLE,
lon1 DOUBLE,
lat2 DOUBLE,
lon2 DOUBLE
) RETURNS DOUBLE RETURN 6371 * acos(
cos(radians(lat1)) * cos(radians(lat2)) * cos(
radians(lon2) - radians(lon1)
) + sin(radians(lat1)) * sin(radians(lat2))
);

SELECT slc(1,1,2,2) from DUAL
//输出结果:157.22543203804852 km

应用场景:
假设我当时的坐标:117.069,35.86 需要查询我附近50KM内服务区,并按照距离由近及远排列
SELECT
s.id,s.name,s.lng,s.lat,
(st_distance (point (lng, lat),point(117.069,35.86) ) *111195) AS distance
FROM
road_servicearea s
HAVING distance<50
ORDER BY distance

知识科普:
地球是在不停地绕地轴旋转,在地球中腰画一个与地轴垂直的大圆圈,使圈上的每一点都和南北两极的距离相等,这个圆圈就叫作“赤道”。在赤道的南北两边,画出许多和赤道平行的圆圈,就是“纬圈”;构成这些圆圈的线段,叫做纬线。我们把赤道定为纬度零度,向南向北各为90度,在赤道以南的叫南纬,在赤道以北的叫北纬。北极就是北纬90度,南极就是南纬90度。纬度的高低也标志着气候的冷热,如赤道和低纬度地地区无冬,两极和高纬度地区无夏,中纬度地区四季分明。

从北极点到南极点,可以画出许多南北方向的与地球赤道垂直的大圆圈,这叫作“经圈”;构成这些圆圈的线段,就叫经线。公元1884平面坐标图年,国际上规定以通过英国伦敦近郊的格林尼治天文台的经线作为计算经度的起点,即经度零度零分零秒,也称“本初子午线”。在它东面的为东经,共180度;
在它西面的为西经,共180度。因为地球是圆的,所以东经180度和西经180度的经线是同一条经线。各国公定180度经线为“国际日期变更线”。为了避免同一地区使用两个不同的日期,国际日期变线在遇陆地时略有偏离。每一经度和纬度还可以再细分为60分,每一分再分为60秒以及秒的小数。利用经纬线,我们就可以确定地球上每一个地方的具体位置,并且把它在地图或地球仪上表示出来。

版权声明:本文为博主原创文章,未经博主允许不得转载。

mysql利用st_distance函数查询附近的点的功能

在手机移动定位app中,附近的人,附近的地点功能十分常见。 随着近几年各类移动终端的迅速普及,基于地理位置的服务(LBS)和相关应用也越来越多,而支撑这些应用的最基础技术之一,就是基于地理位置信息的处...
  • wujiyue
  • wujiyue
  • 2015年06月27日 23:39
  • 5823

利用mysql5.6 的st_distance 实现按照距离远近排序。

一、用户需求          1、显示我附近的小区。          2、由近到远排序。          3、显示距离 二、数据库表结构数据: /* Navicat M...
  • zhouzhiwengang
  • zhouzhiwengang
  • 2016年12月13日 19:19
  • 2019

postgresql 计算距离(单位直接生成米)

之前用的是ST_Distance 函数,但是貌似需要进行一次单位的转换,而且网上有说那种转换不是特别准确,现在暂时将该算法记录在此: select st_distance(ST_GeomFromTex...
  • duanmuxiao
  • duanmuxiao
  • 2015年05月12日 11:27
  • 2733

基于MySQL实现按距离排序、范围查找

简介 现在几乎所有的O2O应用中都会存在“按范围搜素、离我最近、显示距离”等等类似的功能,那这样的功能是怎么实现的呢?本文提供了基于MySQL的实现方式,同样适用于其它数据库。本文不分析,只讲怎么实...
  • linlzk
  • linlzk
  • 2016年05月13日 20:44
  • 3580

[Mysql] 如何实现按距离排序、范围查找

总结: 1.适合场景: 查询范围为某个具体距离范围内,如1公里范围内 2.缺点:查找的是距离范围内的,如果要按距离排序,sql语句在下文所属中加上下面语句 order by abs(htl.lng -...
  • xiaohaoyao
  • xiaohaoyao
  • 2017年02月09日 15:59
  • 2281

根据两点经纬度计算距离-mysql方式和java方式

一、mysql 下 计算 两点 经纬度 之间的距离 公式如下,单位米: 第一点经纬度:lng1 lat1 第二点经纬度:lng2 lat2 round(6378.138*2*asin(sq...
  • u011159417
  • u011159417
  • 2017年01月03日 12:56
  • 1302

mysql 下 计算 两点 经纬度 之间的距离

公式如下,单位米: 第一点经纬度:lng1 lat1 第二点经纬度:lng2 lat2 round(6378.138*2*asin(sqrt(pow(sin( (lat1*pi()/...
  • sh5188588
  • sh5188588
  • 2015年04月17日 13:55
  • 5163

mysql 下 计算 两点 经纬度 之间的距离

公式如下,单位米: 第一点经纬度:lng1 lat1 第二点经纬度:lng2 lat2 round(6378.138*2*asin(sqrt(pow(sin( (lat1*pi()/...
  • u013614451
  • u013614451
  • 2014年09月20日 23:49
  • 1286

基于LBS的地理位置附近的搜索以及由近及远的排序(MYSQL)

目前基于LBS地理位置的搜索已经应用非常广了,的确是个很方便的东西。 我们做程序的就是要考虑如何通过这些功能,来做出更符合用户的内容来。 1,如何获取位置 例如微信,可以通过发送地理...
  • z69183787
  • z69183787
  • 2016年10月19日 10:42
  • 3292

Mysql or Mongodb LBS快速实现方案

Mysql or Mongodb LBS快速实现方案 2013年5月28日simple发表评论阅读评论 前两篇文章: 查找附近的xxx 球面距离以及Geohash方案探讨...
  • pi9nc
  • pi9nc
  • 2013年12月28日 14:57
  • 12476
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql距离函数st_distance
举报原因:
原因补充:

(最多只允许输入30个字)