1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > MySql中实现 按经纬度搜索附近的人 并按距离排序的简单实现

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

时间:2023-08-12 22:47:48

相关推荐

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

按经纬度搜索附近的人,并按距离排序的简单实现。
05月31日 23:26:17 阅读数:7235

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

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

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

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

long raidus = 10000; //半径10kmdouble 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 FLOATDETERMINISTICBEGINRETURN 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.

总结

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。