关闭

按经纬度搜索附近的人,并按距离排序的简单实现。

5647人阅读 评论(3) 收藏 举报
分类:

按经纬度搜索附近的人,并按距离排序的简单实现

这是一种简单的实现,数据量不大的情况下还是能满足需求的,写在这里做一份记录。当然也希望有其他更好的方案。

主要思路就是:先以自己的经纬度为中心,计算一定半径内的方形经纬度边界,然后用此方形经纬度边界过滤用户,并使用一个计算两点经纬度之间距离的自定义数据库函数计算距离,然后按计算得到的距离倒序

计算一定半径内的方形经纬度

long raidus = 10000; //半径10km
double lat = 23.155778; //当前纬度
double lon = 113.262744; //当前经度

Map<String, Object> param = new HashMap<>();
param.put("lat", lat);
param.put("lon", lon);

private void loadGeoSquare(Map<String, Object> parm, double lat, double lon, long raidus){
    Double latitude = lat;    
    Double longitude = lon;    

    // 赤道周长24901英里 1609是转换成米的系数
    Double degree = (24901 * 1609) / 360.0;    
    double raidusMile = raidus;    

    Double dpmLat = 1 / degree;    
    Double radiusLat = dpmLat * raidusMile;    
    Double minLat = latitude - radiusLat;    
    Double maxLat = latitude + radiusLat;    

    Double mpdLng = degree * Math.cos(latitude * (Math.PI / 180));    
    Double dpmLng = 1 / mpdLng;                 
    Double radiusLng = dpmLng * raidusMile;     
    Double minLng = longitude - radiusLng;      
    Double maxLng = longitude + radiusLng;      
    //return new double[] { minLat, minLng, maxLat, maxLng };
    parm.put("minLat", minLat);
    parm.put("minLng", minLng);
    parm.put("maxLat", maxLat);
    parm.put("maxLng", maxLng);
}

SQL计算

我用的Mybatis,当然SQL大家应该都能看懂

<select id="queryNearbyPage" resultType="AppUserNearby">
    SELECT id, avatar, nickname, sex, birthday, lovecode,
    ROUND(lat_lng_distance(#{lat}, #{lon}, lat, lon), 2) AS distance 
    FROM zan_user zuser 
    WHERE 
    <![CDATA[ AND lat > #{minLat} AND lat < #{maxLat} AND lon > #{minLng} AND lon < #{maxLng} ]]>
    ORDER BY distance ASC 
    LIMIT #{rowStart},#{rowEnd}
</select>

其中的 计算两个经纬度之间距离的 数据库函数,这里也贴出来:

CREATE FUNCTION `lat_lng_distance` (lat1 FLOAT, lng1 FLOAT, lat2 FLOAT, lng2 FLOAT)
RETURNS FLOAT
DETERMINISTIC
BEGIN
    RETURN 6371 * 2 * ASIN(SQRT(
        POWER(SIN((lat1 - abs(lat2)) * pi()/180 / 2),
        2) + COS(lat1 * pi()/180 ) * COS(abs(lat2) *
        pi()/180) * POWER(SIN((lng1 - lng2) *
        pi()/180 / 2), 2) ));
END

--Returns the distance in kilometers, assuming a earth radius of 6,371 km.

总结

以上计算上的数学理论,我没有深究,也是参看相关资料的。总感觉这种实现方式好搓。

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

java根据经纬度坐标计算两点的距离算法

根据经纬度计算距离,这个方法很精确,与百度地图的测距相差不到1米。 我是利用百度地图拾取坐标系统(http://api.map.baidu.com/lbsapi/getpoint/index.html)和百度地图测距的工具测试的。 /** * Created by yulia...
  • sanyuesan0000
  • sanyuesan0000
  • 2016-06-15 16:45
  • 15144

如何实现按距离排序、范围查找

简介现在几乎所有的O2O应用中都会存在“按范围搜素、离我最近、显示距离”等等基于位置的交互,那这样的功能是怎么实现的呢?本文提供的实现方式,适用于所有数据库。实现为了方便下面说明,先给出一个初始表结构,我使用的是MySQL:CREATE TABLE `customer` ( `id` INT...
  • ghsau
  • ghsau
  • 2016-01-30 11:58
  • 20904

根据经纬度显示的距离排序

利用mysql5.6 版本自带的st_distance这个功能就可以 SELECT  c.shop_name, c.shop_place_name, c.longitude_shop, c.latitude_shop, (st_distance (point (c.longit...
  • gaike810
  • gaike810
  • 2017-07-02 16:07
  • 169

JAVA计算两个经纬度之间的距离

1、只不过是封装好的一个计算方法,计算的方式也就是上学时就学过的定理,老规矩直接贴代码,主要是方便实用,计算结果单位:米 public class MapUtils { //private static double EARTH_RADIUS = 6378.137; private stat...
  • vison155142
  • vison155142
  • 2016-09-08 10:03
  • 7333

Java实现距离排序【Collections.sort】

一个简单的按距离排序的例子,算法是 计算两点之间的距离,并将这个距离按照从小到大(即从近到远)排序。运用Collections的sort方法实现按距离排序。 创建一个简单的实体类: /** * 主键Id */ private String id; /** * 专题编号 */ ...
  • Abubu123
  • Abubu123
  • 2017-04-18 15:45
  • 1133

怎么快速找到:附近的人

最快的找到附近的人的技术算法
  • zgwangbo
  • zgwangbo
  • 2016-07-24 16:13
  • 4839

java计算两个经纬度之间的距离

  • 2017-12-11 17:02
  • 17.07MB
  • 下载

JAVA 计算地球上任意两点(经纬度)距离

/** * 计算地球上任意两点(经纬度)距离 * * @param long1 * 第一点经度 * @param lat1 * 第一点纬度 * @param long2 * 第二点
  • caixiexin
  • caixiexin
  • 2011-09-22 11:15
  • 31049

redis 使用定位算法

实现原理先算出该点周围的矩形的四个点,然后使用经纬度去直接匹配数据库中的记录。 //获取周围坐标 public function returnSquarePoint($lng, $lat,$distance = 0.5){ $earthRadius = 6378138...
  • qq_36373262
  • qq_36373262
  • 2017-03-06 11:34
  • 381

redis3.2新功能--GEO地理位置命令介绍

redis3.2发布rc版本已经有一段时间了,估计RedisConf 2016左右,3.2版本就能release了。3.2版本中增加的最大功能就是对GEO(地理位置)的支持。说起redis的GEO特性,最大的贡献还是咱们中国人。redis作者在对3.2引进新特性的博客中介绍了为什么支持GEO。GEO...
  • opensure
  • opensure
  • 2016-05-11 16:45
  • 12939
    个人资料
    • 访问:223605次
    • 积分:2504
    • 等级:
    • 排名:第17040名
    • 原创:58篇
    • 转载:12篇
    • 译文:0篇
    • 评论:41条
    最新评论