文档章节

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

傲罗
 傲罗
发布于 2013/08/28 13:38
字数 851
阅读 2439
收藏 18

目前基于LBS地理位置的搜索已经应用非常广了,的确是个很方便的东西。

我们做程序的就是要考虑如何通过这些功能,来做出更符合用户的内容来。

1,如何获取位置

例如微信,可以通过发送地理位置来获取到当前用户的经纬度。查看

在网页端,可以使用html5获取地理定位。查看

2,数据表设计

数据库中要预存自己的位置数据,如何获取数据请查看相关地图api。

字段:十进制数的纬度 latitude FLOAT(10,6) 十进制数的经度 longitude FLOAT(10,6)

假设我们数据库中已经存储大量酒店的位置信息

3,根据用户位置查询附近

如上图,假设当前用户所在的位置为坐标O,那么我们要查询附近的酒店,理想的范围应该是以O为原点的圆内,但是我们先不这样做,后面会讲到。

我们先以O为原点,在坐标上以0.3的差值标识了4个位置,其实这样就是一个正方形范围,大致应该符合我们的要求。

那么我们就要从数据库中查询范围在这个正方形之内的所有酒店了。

一,获取到用户的经纬度坐标:

$latitude;$longitude

二,定义一个差值,设置经度和纬度的范围:

$i = 0.3; //差值可自定义,值越大,范围就越大
$min_latitude = $latitude - $i; //纬度最小值
$max_latitude = $latitude + $i; //纬度最大值
$min_longitude = $longitude - $i; //经度最小值
$max_longitude = $longitude + $i; //经度最大值

三,数据库中查询在这个范围之内的酒店:

SELECT * FROM table WHERE (latitude BETWEEN $min_latitude AND $max_latitude) AND (longitude BETWEEN $min_longitude AND $max_longitude);

这样我们的附近搜索基本完成了

四,以地理位置由远及近的排序:

如果我们要筛选出最近的10个的话,用上面的语句来查询,可能会把稍远的先查出来,后面的就没有机会了,那么我们得做个排序了。

如上图,如果我们要获取E位置和F位置分别距离O点的长度,那么我们就需要计算OE和OF的长度分别为多少,这里我们要用到直角三角形的数学公式:C^2 = A^2 + B^2,知道A和B,那么C的值也就得到了。

注意:请首先在表中建立一个字段d,以作后面缓存距离使用,否则会报错

我们可以根据经纬度的差分别来获取到A和B的值,SQL语句是这样的:

SELECT *,SQRT(POWER($latitude - latitude, 2) + POWER($longitude  - longitude, 2)) AS d FROM table WHERE (latitude BETWEEN $min_latitude AND $max_latitude) AND (longitude BETWEEN $min_longitude AND $max_longitude) ORDER BY d ASC LIMIT 10;

SQRT(X):求X的平方根,POWER(X, Y):求X的Y次方

通过这样一步,我们的范围已经锁定在圆形之内了,并且按照由近及远的方式进行排序(在不考虑效率的情况下)。

© 著作权归作者所有

共有 人打赏支持
傲罗

傲罗

粉丝 14
博文 2
码字总数 1033
作品 0
深圳
高级程序员
私信 提问
加载中

评论(13)

Skqing
Skqing

引用来自“傲罗”的评论

引用来自“3kqing”的评论

引用来自“傲罗”的评论

引用来自“3kqing”的评论

引用来自“傲罗”的评论

引用来自“3kqing”的评论

在mysql中创建d这一列是不行的,因为默认为Null,所以导致查不出任何数据
查不出数据的话,可以把 d < 0.3 这个条件去掉试试,这个是取范围内的

回复@傲罗 : 为什么会要两个限制条件呢,只要一个d不行吗?d是距离,其他两个条件是边界
有没有应该都无所谓,范围已经限定好了,条件确实多余了,已经删除了

回复@傲罗 : 我计算出来的感觉差异很大,你那边精确度多高
远近排序方面应该是准确的,算法没错。精度方面主要是距离与$i之间的设定

回复@傲罗 : 这个比较难控制
傲罗
傲罗

引用来自“3kqing”的评论

引用来自“傲罗”的评论

引用来自“3kqing”的评论

引用来自“傲罗”的评论

引用来自“3kqing”的评论

在mysql中创建d这一列是不行的,因为默认为Null,所以导致查不出任何数据
查不出数据的话,可以把 d < 0.3 这个条件去掉试试,这个是取范围内的

回复@傲罗 : 为什么会要两个限制条件呢,只要一个d不行吗?d是距离,其他两个条件是边界
有没有应该都无所谓,范围已经限定好了,条件确实多余了,已经删除了

回复@傲罗 : 我计算出来的感觉差异很大,你那边精确度多高
远近排序方面应该是准确的,算法没错。精度方面主要是距离与$i之间的设定
Skqing
Skqing

引用来自“傲罗”的评论

引用来自“3kqing”的评论

引用来自“傲罗”的评论

引用来自“3kqing”的评论

在mysql中创建d这一列是不行的,因为默认为Null,所以导致查不出任何数据
查不出数据的话,可以把 d < 0.3 这个条件去掉试试,这个是取范围内的

回复@傲罗 : 为什么会要两个限制条件呢,只要一个d不行吗?d是距离,其他两个条件是边界
有没有应该都无所谓,范围已经限定好了,条件确实多余了,已经删除了

回复@傲罗 : 我计算出来的感觉差异很大,你那边精确度多高
傲罗
傲罗

引用来自“3kqing”的评论

引用来自“傲罗”的评论

引用来自“3kqing”的评论

在mysql中创建d这一列是不行的,因为默认为Null,所以导致查不出任何数据
查不出数据的话,可以把 d < 0.3 这个条件去掉试试,这个是取范围内的

回复@傲罗 : 为什么会要两个限制条件呢,只要一个d不行吗?d是距离,其他两个条件是边界
有没有应该都无所谓,范围已经限定好了,条件确实多余了,已经删除了
Skqing
Skqing

引用来自“傲罗”的评论

引用来自“3kqing”的评论

在mysql中创建d这一列是不行的,因为默认为Null,所以导致查不出任何数据
查不出数据的话,可以把 d < 0.3 这个条件去掉试试,这个是取范围内的

回复@傲罗 : 为什么会要两个限制条件呢,只要一个d不行吗?d是距离,其他两个条件是边界
傲罗
傲罗

引用来自“3kqing”的评论

在mysql中创建d这一列是不行的,因为默认为Null,所以导致查不出任何数据
查不出数据的话,可以把 d < 0.3 这个条件去掉试试,这个是取范围内的
Skqing
Skqing
在mysql中创建d这一列是不行的,因为默认为Null,所以导致查不出任何数据
Skqing
Skqing
d变量的单位是什么呢?
Skqing
Skqing
$i 和 d两个值没看明白
Skqing
Skqing
数据库脚本能发我一下吗?邮箱:569141948@qq.com 我随机生成广东省的坐标点,查询1000以内的竟然一个都查不出来,啥情况呢?
结合MongoDB开发LBS应用

简介 随着近几年各类移动终端的迅速普及,基于地理位置的服务(LBS)和相关应用也越来越多,而支撑这些应用的最基础技术之一,就是基于地理位置信息的处理。我所在的项目也正从事相关系统的...

凯文加内特
2015/09/09
318
0
几个地理位置信息处理方案的对比和分析

对于任何LBS应用来说,让用户寻找周围的好友可能都是一个必不可少的功能,我们就以这个功能为例,来看看各种处理方案之间的差异和区别。 我们假设有如下功能需求: 显示我附近的人由近到远排...

javaer
05/11
0
0
在 Java 中利用 redis 实现 LBS 服务

前言 LBS(基于位置的服务) 服务是现在移动互联网中比较常用的功能。例如外卖服务中常用的我附近的店铺的功能,通常是以用户当前的位置坐标为基础,查询一定距离范围类的店铺,按照距离远近...

高超杨
2017/12/28
0
0
让云服务器性能提升10倍的方法,再也不用担心周报没有干货了!

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB发表于云+社区专栏 随着国内服务共享化的热潮普及,共享单车,共享雨伞,共享充电宝等各种服务如雨...

腾讯云加社区
10/17
0
0
浅谈移动互联网广告设计

目前移动互联网发展趋势迅猛,随之而来的移动互联网广告也以迅雷不及掩耳之势飞速发展,据市场研究公司Gartner称,2011年全球移动广 告收入预计将达到33亿美元,比2010年的16亿美元增长一倍多...

junwong
2012/03/01
349
0

没有更多内容

加载失败,请刷新页面

加载更多

spring学习笔记(二)spring 事件的使用

spring 中的事件 spring事件通过订阅发布 可以解耦操作 可以同步 可以异步 步骤 编写事件 通过继承org.springframework.context.ApplicationEvent 来编写事件 public ApplicationEvent(Obj...

NotFound403
昨天
13
0
特斯拉车主成功破解了自己Model 3汽车

据汽车博客Electrek消息,一位特斯拉车主成功破解了自己Model 3汽车,还在此基础上运行了Ubuntu。 这位叫trsohmers的网友表示,“功劳大多要归到Ingineerix的头上,他花了数月才找到初始的那...

linuxCool
昨天
4
0
Gitbook : random errors when using gitbook plugin on running "gitbook serve"

在执行gitbook serve时,会有不定的失败错误 参考问题 :#1309 解决方案: 更新gitbook版本,这个问题似乎是3版本的问题 , 官方也不打算在这个版本解决了。 更新 到最新版本后, 不再出现问...

ol_O_O_lo
昨天
2
0
提灯照暗,向内自省——《中国文化的深层结构》读书笔记3800字

提灯照暗,向内自省——《中国文化的深层结构》读书笔记3800字: 作者:王健茜;断断续续一个多月才读完了《中国文化的深层结构》,这并不是一本难懂的书,之所以读得慢,源于对书中观点的思...

原创小博客
昨天
3
0
高德地图-行政区域接口

1、获取全国各省信息 https://restapi.amap.com/v3/config/district?extensions=all&key=应用Key&s=rsv3&output=json 2、获取下级行政区域信息 https://restapi.amap.com/v3/config/distric......

voole
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部