基于经纬度的简单附近地理位置搜索
来源:互联网 发布:美女与野兽 知乎 编辑:程序博客网 时间:2024/04/30 09:43
1,获取经纬度
注意有3中经纬度的表示方法
经纬度以度数表示,一般可直接以小数点表示,但亦可把度数的小数点分为角分(1角分等于六十分之一度),和秒(一秒等于六十分之一分)。表示经纬度有多样模式,以下是其中一些例子。
- 度分秒表示(度:分:秒)-49°30'00"-123d30m00s
- 度分表示(度:分)-49°30.0'-123d30.0m
- 度数表示-49.5000°-123.5000d(一般会有四位小数)。
这里的经纬度是用度数表示的,在有些公式的计算中,是需要把角度转换为弧度的,注意他们的转换
经纬度转换的函数:
deg2rad — 将角度转换为弧度
rad2deg() - 将弧度数转换为相应的角度数
2,数据库中存储经纬度
保存类型float(10,6)
创建 MySQL 表时,您应当特别注意 lat 和 lng 属性。鉴于 Google Maps 目前的缩放能力,您只需要精确到小数点后六位数。为了让表占用的存储空间降至最低,您可以将 lat 和 lng 属性指定为大小是 (10,6) 的浮点数。这样,这些字段将会存储小数点后 6 位数以及小数点前最多 4 位数,如 -123.456789 度。
3,实现算法(基于一定范围内)
在庞大的地理数据库中搜索地点,索引是很重要的。但是,我们的需求是搜索附近地点, 例如,坐标(39.91, 116.37)附近500米内有什么地点?搜索条件是地点坐标与当前坐标之间的距离, 显然是无法应用索引的。
那么换个思路:首先算出“给定坐标附近500米”这个范围的坐标范围。 虽然它是个圆,但我们可以先求出该圆的外接正方形,然后拿正方形的经纬度范围去搜索数据库。
先算出该点周围的矩形的四个点,然后使用经纬度去直接匹配数据库中的记录。
参考wiki百科上的一些球面计算公式:
- Great-circle distance
- Haversine formula
假设已知点的经纬度分别为$lng, $lat
先实现经度范围的查询,
在haversin公式中令φ1 = φ2,可得:
用PHP进行计算,就是:
1
2
3
//$lat 已知点的纬度
$dlng
= 2 * asin(sin(
$distance
/ (2 * EARTH_RADIUS)) /
cos
(
deg2rad
(
$lat
)));
$dlng
= rad2deg(
$dlng
);
//转换弧度
然后是纬度范围的查询,
在haversin公式中令 Δλ = 0,可得
在PHP中进行计算,就是:
1
2
$dlat
=
$distance
/EARTH_RADIUS;
//EARTH_RADIUS地球半径
$dlat
= rad2deg(
$dlat
);
//转换弧度
在lat
和lng
列上建立索引,能从一定程度上提高范围查询的效率。
不过,这样查询到的地点是正方形范围内的地点,一些结果与当前点的距离可能会超出给定的距离。 如果要求严格,可以遍历结果并计算与当前点之间的距离,并过滤掉不符合要求的结果。
4,由近到远进行排序显示
基于第3步的范围内进行计算距离
5,详细代码实现过程
根据用户的经纬度获取搜索范围的经纬度:
public function googleTest()
{
$distance = 0.2;//单位是10KM
$radius = 6371.393;//代为是KM
//用户当前的地理位置(经纬度的第三种表示方法)
$lng = '121.606546';
$lat = '29.918017';
//计算偏移的角度并转化为弧度
$dlng = rad2deg(2*asin(sin($distance/(2*$radius))/cos($lat)));
$dlat = rad2deg($distance*10/$radius);
//计算实际搜索的四边形的四个边界范围
$lng_left = round($lng-$dlng,6);
$lng_right = round($lng+$dlng,6);
$lat_top = round($lat+$dlat,6);
$lat_bottom= round($lat - $dlat,6);
}将上述获取的边界范围带入到sql语句中用于查询:
SELECT *
FROM `t_store`
WHERE m_lat > 29.900032
AND m_lat < 29.936002
AND m_lng > 121.581848
AND m_lng < 121.631244
LIMIT 0 , 30
FROM `t_store`
WHERE m_lat > 29.900032
AND m_lat < 29.936002
AND m_lng > 121.581848
AND m_lng < 121.631244
LIMIT 0 , 30
6,参考资料
附近地点搜索初探:http://blog.charlee.li/location-search/
经纬度的表示与转换:http://wenku.baidu.com/link?url=y0gLBwaj3ullJzfI-jERpBkyoBA0vcJIe53SlKElgYeTbPEuxrY4xReMKqZf0_HpcKGElif1jHE3KKAA9cH_WvXVqnjJdbTh-ChYV6JIB7C
GPS经纬度的表示方法与转换:http://blog.sina.com.cn/s/blog_3d955ce60100ymz9.html
PHP,Mysql-根据一个给定的经纬度的店,进行附近地点查询-合理利用算法,效率提高2125倍:http://digdeeply.org/archives/06152067.html
在数据库中根据经纬度查找数据中所有附近的经纬度点:http://blog.csdn.net/ecdyf1989/article/details/8077943
0 0
- 基于经纬度的简单附近地理位置搜索
- 【LBS】基于地理位置的搜索之微信 附近的人 简单实现
- 基于LBS的地理位置附近的搜索以及由近及远的排序
- 基于LBS的地理位置附近的搜索以及由近及远的排序(MYSQL)
- 基于LBS的地理位置附近的搜索以及由近及远的排序(MYSQL)
- 基于LBS的地理位置附近的搜索以及由近及远的排序(MYSQL)
- 按经纬度搜索附近的人,并按距离排序的简单实现。
- ElasticSearch之基于地理位置的搜索
- 跟据经纬度实现附近搜索
- 跟据经纬度实现附近搜索
- 跟据经纬度实现附近搜索
- Android百度地图(地位和POI附近搜索)-仿微信、QQ地理位置的分享
- js获取地理位置的经纬度
- 基于GeoHash搜索附近商家
- LBS:附近搜索(geohash算法:经纬度编码搜索)
- 基于Solr的LBS(地理位置搜索)实现原理
- 基于百度地图的地理位置选择功能 (搜索)
- 根据经纬度查询附近的点
- ATL COM中IDL文件里定义函数有默认值的参数的写法
- JAVA中Array的常用方法
- WebDriver拾级而上·之十六 Table控件的处理
- 东阳用友软件,东阳用友财务软件,东阳用友进销存,东阳0A,东阳HR,东阳ERP,东阳PDM,东阳CRM,东阳PLM,东阳U8,东阳U9,东阳NC,东阳T+,东阳BQ,东阳T3,东阳T6,东阳用友年度结
- Eclipse导入Android项目
- 基于经纬度的简单附近地理位置搜索
- ExecutorService生命周期
- Friday the Thirteenth
- 从C看C++之(五)继承和派生
- bash 快捷键
- Symmetric Tree
- 图表:构建成功率---SCM的考核标准之一
- ubuntu下mysql的ERROR 2002
- Oracle导入单张表