根据经纬度实现附近的人
随笔
注:您如果有好的方式和其他的架构方式的话,希望可以下方留言交流,交流是进步的阶梯!
本文依旧是一篇杂记,如果对你有帮助的话,基本是一些思想类,简单架构类的方式
- 1.使用一些经纬度的计算方式
- 2.使用goeHash达到我们的mysql、oracle、plsql之类树状的数据库无法完成的部分
- 3.使用一些特殊类型的类库进行计算,比如一些MongoDB,timptip之类三维立体数据库
- 4.结合redis缓存开启附近人模式的人的地理位置,然后将这人的key设置为地理位置id结合的key,方便后续其他人搜索时候直接进行根据地区id进行索引后续即可
- 5.使用特殊算法:改圆的一半方程为:(x-a)²+(y-b)²=r²。只要其他用户的坐标代入圆的一般方程满足 (x-a)²+(y-b)² <=r² 即为“附近”的用户
以上介绍几种设计模式,任何程序是一种有思想的东西,如果是只是实现可能你了解了技术都能实现,但是你知不知道有其他的技术和方式可以来实这个功能就未可知了!!!
今早上得空,更新此博客:
拓展一下上文中的1.使用一些经纬度计算方式:
此实现方式有两种:
1.在自己的项目中使用util进行计算
2.在我们的数据库中进行,此条可能会问是不是上面的第三条使用数据库呢,回答:并不是
学好数理化走遍天下都不怕是有道理的,这里是需要我们的一些弧长计算公式原理
不做具体说明了可以参考这里:
https://baike.baidu.com/item/%E5%BC%A7%E9%95%BF%E8%AE%A1%E7%AE%97%E5%85%AC%E5%BC%8F/4370799
其中会涉及到我们的三角函数的使用,我们可以在同样的方式在这里进行了解
https://baike.baidu.com/item/%E4%B8%89%E8%A7%92%E5%87%BD%E6%95%B0%E5%85%AC%E5%BC%8F/4374733
ok这里开始上我们的代码进行了解:
/**
* 如果是你使用这个程序内的工具进行处理的话可以使用这里
*/
public static double Distance(double long1, double lat1, double long2,
double lat2) {
double a, b, R;
R = 6378137; // 地球半径
lat1 = lat1 * Math.PI / 180.0;
lat2 = lat2 * Math.PI / 180.0;
a = lat1 - lat2;
b = (long1 - long2) * Math.PI / 180.0;
double d;
double sa2, sb2;
sa2 = Math.sin(a / 2.0);
sb2 = Math.sin(b / 2.0);
d = 2
* R
* Math.asin(Math.sqrt(sa2 * sa2 + Math.cos(lat1)
* Math.cos(lat2) * sb2 * sb2));
return d;
}
本使用直接放入之后
-- 如果你想要使用你的一些数据库方式实现的话需要使用这里(mysql是测试没有问题的)
ROUND(
6378.138 * 2 * asin(
sqrt(
pow(
sin( ( 我的latitude1 * pi() / 180 - 传入latitude * pi() / 180 ) / 2
),
2
) + cos(
我的latitude1 * pi() / 180
) * cos(
传入latitude * pi() / 180) * pow(
sin(
(
我的longitude1 * pi() / 180 - 传入longitude2 * pi() / 180
) / 2
),
2
)
)
),
2
) AS 一个自己的业务名
-- 在你使用的时候可以:select 上方的一段,字段a,字段b··· from {table名} 尝试一番