sql语句查询经纬度范围
指定一个经纬度,给定一个范围值(单位:千米),查出在经纬度周围这个范围内的数据。
经度:113.914619
纬度:22.50128
范围:2km
longitude为数据表经度字段
latitude为数据表纬度字段
SQL在mysql下测试通过,其他数据库可能需要修改
SQL语句如下:
select * from location where sqrt( ( ((113.914619-longitude)*PI()*6328*cos(((22.50128+latitude)/2)*PI()/180)/180) * ((113.914619-longitude)*PI()*6328*cos (((22.50128+latitude)/2)*PI()/180)/180) ) + ( ((22.50128-latitude)*PI()*6328/180) * ((22.50128-latitude)*PI()*6328/180) ) )<2
MySQL性能调优 – 使用更为快速的算法进行距离
最近遇到了一个问题,通过不断的尝试最终将某句原本占据近1秒的查询优化到了0.01秒,效率提高了100倍.
问题是这样的,有一张存放用户居住地点经纬度信息的MySQL数据表,表结构可以简化 为:id(int),longitude(long),latitude()long. 而业务系统中有一个功能是查找离某个用户最近的其余数个用户,通过代码分析,可以确定原先的做法基本是这样的:
//需要查询的用户的坐标
$lat=20;
$lon=20;//执行查询,算出该用户与所有其他用户的距离,取出最近的10个
$sql='select * from users_location order by ACOS(SIN(('.$lat.' * 3.1415) / 180 ) *SIN((latitude * 3.1415) / 180 ) +COS(('.$lat.' * 3.1415) / 180 ) * COS((latitude * 3.1415) / 180 ) *COS(('.$lon.' * 3.1415) / 180 - (longitude * 3.1415) / 180 ) ) * 6380 asc limit 10';
而这条sql执行的速度却非常缓慢,用了近1秒的时间才返回结果,应该是因为order里的子语句用了太多的数学计算公式,导致整体的运算速度下降.
而在实际的使用中,不太可能会发生需要计算该用户与所有其他用户的距离,然后再排序的情况,当用户数量达到一个级别时,就可以在一个较小的范围里进行搜索,而非在所有用户中进行搜索.
所以对于这个例子,我增加了4个where条件,只对于经度和纬度大于或小于该用户1度(111公里)范围内的用户进行距离计算,同时对数据表中的经度和纬度两个列增加了索引来优化where语句执行时的速度.
最终的sql语句如下
$sql='select * from users_location where
latitude > '.$lat.'-1 and
latitude < '.$lat.'+1 and
longitude > '.$lon.'-1 and
longitude < '.$lon.'+1
order by ACOS(SIN(('.$lat.' * 3.1415) / 180 ) *SIN((latitude * 3.1415) / 180 ) +COS(('.$lat.' * 3.1415) / 180 ) * COS((latitude * 3.1415) / 180 ) *COS(('.$lon.'* 3.1415) / 180 - (longitude * 3.1415) / 180 ) ) * 6380 asc limit 10';
经过优化的sql大大提高了运行速度,在某些情况下甚至有100倍的提升.这种从业务角度出发,缩小sql查询范围的方法也可以适用在其他地方.
http://my.oschina.net/laserdance/blog/40854
分享到:
相关推荐
百度地图Api开发源码,包括地图初始化,百度地图和GPS坐标之间的转换,以及通过GET请求获取云端的详细数据,添加自定义图层并自定义点击标签事件
LBS ,定位方式,通过经纬度来确定省市区,此文档提供了全国给个省份区的经纬度。
中国省市县三级政府驻地详细数据(含经纬度),省市县行政区由高德开发者中心获取,通过兴趣点查询接口,爬取经纬度等详细信息,整理成excel表,供行政区驻地配图等场景使用。 2、字段信息: typecode 省市县类型 ...
从给定的文件信息来看,我们正在处理的是中国各城市的经纬度数据,这是一份非常重要的地理信息资源,对于地图绘制、地理位置定位、导航系统、地理信息系统(GIS)开发以及各种基于位置的服务(LBS)都有着不可替代的...
1.包括省、市、区、镇/街道四级 2.包括经纬度信息 3.拉取数据截至2023年7月 4.数据来源:高德API=>https://lbs.amap.com/api/webservice/guide/api/district
本例是用来获取用户地理位置信息中的经纬度,不过要完全正常运行本实例需要以下条件: 1. 一部 iphone (iOS3.0 ) 或 android (2.0 ) 的手机 2. 浏览器 Chrome 5 , Firefox 3.6 , Opera 10.6, Safari 5, IE 9
本文将介绍一个在实际应用中已被验证的资源——一份全面的中国省市边界经纬度地图,以json格式呈现,为中国地图数据的处理和分析提供了便利。 该数据集以JSON格式存储,JSON作为一种通用的数据格式,具有良好的跨...
全国基站lbs定位库包含全国移动联通电信全网lbs位置数据,94万条
在实际应用中,如果需要找出距离某中心点N范围内的所有经纬度点,可以遍历所有点,对每个点调用这个函数,判断结果是否小于给定的半径N,如果是,则将该点添加到结果列表中。 例如,假设我们有一个包含多个经纬度点...
全国基站LBS定位库是一个重要的数据资源,它包含了中国移动、中国联通和中国电信全网的基站位置信息,总计84万条数据。LBS,即Location Based Services,基于位置的服务,是利用移动通信网络和卫星定位系统(如GPS)...
LBS数据隐藏**:LBS数据通常包括经纬度坐标、时间戳等,用于定位服务。在隐私保护和安全通信中,隐藏这些敏感数据可以防止未经授权的访问。通过LSB隐藏,这些数据可以被巧妙地嵌入到图像中,只有知道特定方法的接收...
- 整个代码在用户输入地址并点击查询按钮后执行,完成从地址到经纬度的查询,并在地图上以标记的方式展示位置,同时在用户界面上显示经纬度信息。 通过以上知识点,开发者可以了解如何使用JavaScript和百度地图API...
### 谷歌接口通过经纬度查询地区信息 在当今高度信息化的社会中,地理信息系统(GIS)技术在各个领域发挥着越来越重要的作用。其中,基于地理位置的服务(LBS)是GIS技术的重要应用之一,它可以帮助用户获取特定...
这个DEMO涵盖了从数据上传到数据查询的完整流程,对于初学者来说,是一份非常有价值的参考材料。通过这个DEMO,开发者可以了解如何接入百度的SDK,实现自己的LBS应用。 在集成百度LBS云存储SDK时,首先需要在百度...
在iOS开发中,LBS(Location-Based Services,基于位置的服务)是移动应用中不可或缺的一部分,它利用设备的GPS(全球定位系统)、Wi-Fi、蜂窝数据等技术来获取用户的位置信息,进而提供各种与地理位置相关的服务,...
2. **显示在地图上**:获取到经纬度后,我们可以创建地图并设置中心点,将经纬度显示在地图上。高德地图API提供了创建地图、添加标注等功能。 ```javascript // 创建地图,设置中心点为之前获取的经纬度 var map...
在IT行业中,获取地理位置经纬度是一项常见的任务,尤其在移动应用和Web开发中。本教程将详细介绍如何使用高德地图API来实现不显示地图界面,直接获取经纬度值的功能。 首先,我们需要理解“经纬度”这个概念。...
本实例将教你如何在Android Studio中实现这一功能,利用GPS(全球定位系统)和LBS(Location-Based Services,基于位置的服务)获取精确的位置信息。下面我们将详细讲解这个过程。 首先,确保你的AndroidManifest....
在Android开发中,LBS(Location-Based Services,基于位置的服务)是常见的功能,它涉及到对地理位置数据的存储和检索。本资源"百du云 lbs 存储检索 Android.rar"提供了一个具体的实现方案,帮助开发者理解如何在...