根据经纬度实现附近的人

根据经纬度实现附近的人

随笔
注:您如果有好的方式和其他的架构方式的话,希望可以下方留言交流,交流是进步的阶梯!

本文依旧是一篇杂记,如果对你有帮助的话,基本是一些思想类,简单架构类的方式

  • 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名} 尝试一番
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值