一直在创业的最前线,对于一个技术创业者来说,技术、产品、运营都是你应该关注的事情。市面有很多基于LBS的移动App,例如陌陌,美团等知名App都是围绕着LBS展开的业务。
创业公司如何选择LBS方案
答:因为你是创业公司,业务比技术更为重要,你得先活下去,才能考虑求发展。所以,只要能快速实现业务的,怎么简单怎么来。
下面介绍几种LBS方案进行对比
基于MySQL自定义距离计算函数实现的LBS
原理是地球看成一个球形,计算两个经纬度的距离,就是计算球面上两个点的弧面的距离,根据公式能够求导出来,具体的求导可以去google。贴出google的伟大的计算公式:
D(lat1,lng1,lat2,lng2) = 2*asin(sqrt(pow(sin((lat1-lat2)/2),2)+cos(lat1)*cos(lat2)*pow(sin((lng1-lng2)/2),2)))*[radius];
其中lat1,lng1是一个经纬度,lat2,lng2是另外一个经纬度,radius是地球的半径。
** 创建用户数据库脚本 **
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`latitude` double NOT NULL,
`longitude` double NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into user(name, latitude, longitude) values('chs1', 40.074954, 116.36954),('chs2',40.078223, 116.34384);
为了方便调用创建一个Mysql存储函数计算距离
DELIMITER $$
CREATE FUNCTION `distance_exe`(latitude1 DOUBLE, longitude1 DOUBLE, latitude2 DOUBLE, longitude2 DOUBLE) RETURNS double
BEGIN
DECLARE rad DOUBLE;
DECLARE radius DOUBLE DEFAULT 6378137;
DECLARE distance DOUBLE;
SET rad = PI() / 180.0;
SET latitude1 = latitude1 * rad;
SET longitude1 = longitude1 * rad;
SET latitude2 = latitude2 * rad;
SET longitude2 = longitude2 * rad;
SET distance = round(acos(cos(latitude1)*cos(latitude2)*cos(longitude1-longitude2)+sin(latitude1)*sin(latitude2))*radius*pow(10,3)) / pow(10,3);
RETURN distance;
END$$
DELIMITER ;
测试下距离
select distance_exe(latitude, longitude, 36.012, 116.02222)
from user
+------------------------------------------------------+
| distance_exe(latitude, longitude, 36.012, 116.02222) |
+------------------------------------------------------+
| 453308.557 |
| 453526.123 |
+----------------------------------------------------
单位是米
附近的人计算SQL
select id, name,distance_exe(latitude,longitude,39.001,116.01923) AS distance
from user
where 1 HAVING distance<1000000 ORDER BY distance
+----+------+------------+
| id | name | distance |
+----+------+------------+
| 6 | chs2 | 123111.05 |
| 5 | chs1 | 123276.325 |
+----+------+------------+
2 rows in set (0.00 sec)
所以附近多少公里的数据过滤就可以通过sql解决了。
-
优点
简单,能够快速实现基于LBS的业务扩展,门槛比较低,开发成本比较低。 -
缺点
经纬度的更新是比较频繁的,经纬度更新会引起数据库的索引的重建,效率比较低,另外经纬度的计算非常消耗CPU,单表数据如果过多的话,CPU消耗很严重。每个人每个位置计算的排序结果都是不一样的,从缓存的角度来说,也做不到数据局部性的复用,从架构上来说,扩展性和弹性比较差。
基于geohash地址编码的深度解析
待续