地理坐标定位和计算距离

地理坐标定位和计算距离


场景介绍

在SNS应用中通常会有"附近的人"、或者地图应用中搜寻目的地距离当前路程等场
景。此时我们就需要根据两点地理位置的经度和纬度计算出距离。

备注:通常智能手机只要用户同意软件使用定位功能,就都可以轻松的获取到用户当前所在地理坐标,因此前段可以轻松的将地理坐标传给后端,后端将其存储起来然后计算。可以存在redis缓存也可以存在mysql中。


实现方法

基于java自己实现

java code

public static double getDistance(Location location1, Location location2 ) {
    //Location是一个类,包含经度和纬度两个属性
    //参数location1表示地址1,location2表示地址2.
       double radLat1 = Math.toRadians (location1. getLatitude());
       double radLat2 = Math.toRadians (location1. getLatitude());
       double a = radLat1 - radLat2;
       double b = Math.toRadians (location1. getLongitude()) - Math.toRadians (location2. getLongitude());
       double s = 2 * Math. asin(Math .sqrt(
                Math.pow (Math. sin(a / 2), 2) + Math.cos (radLat1) * Math.cos (radLat2) * Math.pow (Math. sin(b / 2), 2))) ;
       s = s * 6378137.0 ;// 取WGS84标准参考椭球中的地球长半径(单位:m)
       s = Math. round(s * 10000) / 10000 ;
       return s ;
}

//本质上计算两地址的距离就是一道数学几何体,所以高级计算机应用里面还是会涉及到数学知识的。

基于redis GEO实现

redis3.2版本之后,redis支持了对坐标定位的支持。
geoadd locationSet longitude latitude name [longitude latitude name...](增加地址坐标使用经度和纬度和定位)
geopos locationSet name [name] (显示某个地址的坐标)
geodist locationSet location_x location_y [unit] (计算地理位置两点的距离)
georadius locationSet longitude  latitude radius m|km|ft|mi  [WITHCOORD] [WITHDIST] [ASC|DESC] [COUNT count] (范围查找)
georadiusbymemer location-set location radius m|km|ft|mi [WITHCOORD] [WITHDIST] [ASC|DESC] [COUNT count] (范围查找)

//根据这几个简单的命令我们就能够实现我们想要的定位需求了。

参考

1、http://www.infoq.com/cn/articles/depth-study-of-Symfony2
2、http://blog.jobbole.com/89225/
3、http://lbsyun.baidu.com/

你可能感兴趣的:(胡言乱语)