V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chaohuang
V2EX  ›  程序员

一个关于 gps 坐标匹配算法的求助

  •  
  •   chaohuang ·
    huangchaosysu · 2020-07-10 16:16:23 +08:00 · 2361 次点击
    这是一个创建于 1579 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求 我有一堆 gps 坐标, 格式为{"latitude":23.123, "longitude": 113.123}

    接口会传一个 gps 坐标(暂定为 a )进来, 需要从我这对坐标中匹配出里距离在 100 米(大概, 可以浮动)以内离得最近的坐标, 各位大佬有啥好办法么?

    目前我的做法是取小数点 3 为存到 redis, 进来的坐标同样取 3 位, 然后取 redis 里匹配有没有对应的 key

    17 条回复    2020-07-13 10:35:45 +08:00
    BBCCBB
        1
    BBCCBB  
       2020-07-10 16:22:14 +08:00
    redis 里有个 geo 相关的函数貌似用来搞这个?
    amorphobia
        2
    amorphobia  
       2020-07-10 16:27:23 +08:00
    evill
        3
    evill  
       2020-07-10 16:27:48 +08:00
    redis geo
    humpy
        4
    humpy  
       2020-07-10 16:31:05 +08:00
    geohash
    Mooshowl
        5
    Mooshowl  
       2020-07-10 16:32:39 +08:00
    用 redis geo,原理跟附近的人是类似的
    duwan
        6
    duwan  
       2020-07-10 16:36:35 +08:00
    可以存在 mysql 里面,建上空间索引。

    查询的时候根据查询的坐标,外扩 100 米,使用 mysql geo 函数查询出所有 100 米范围的点。

    然后在查询结果中挨个算距离找到最近的?
    wangxiaoaer
        7
    wangxiaoaer  
       2020-07-10 16:42:41 +08:00
    1 遍历:适合数据量不大。

    2 自建索引:按照 10 公里、1 公里、100 米为间距建立索引,搜索的时候从索引逐步缩小范围,当范围足够小,数据量不大就可以遍历了。适合数据量中等,而且变化不频繁的,否则你的索引要经常更新,那还不如下面的办法。

    3 PostgreSQL+PostGIS:创建空间索引就 OK 了,剩下的就是内置函数调用,不需要你设计什么算法去计算,而且即使数据增加,索引也会自动更新的。
    baxtergu
        8
    baxtergu  
       2020-07-10 16:51:42 +08:00
    geohash 可解
    chaohuang
        9
    chaohuang  
    OP
       2020-07-10 17:12:53 +08:00
    @baxtergu
    @wangxiaoaer
    @duwan
    @Mooshowl
    @humpy
    @evill
    @amorphobia
    @BBCCBB
    redis geo 应该是我想要的, 感谢各位大佬。
    liuzhaowei55
        10
    liuzhaowei55  
       2020-07-10 18:05:19 +08:00 via Android
    3 位的精度应该达不到 100 米的精度要求吧
    janwarlen
        11
    janwarlen  
       2020-07-10 18:08:55 +08:00
    看成了 ghs,不好意思......
    Jooooooooo
        12
    Jooooooooo  
       2020-07-10 18:12:58 +08:00
    搜一下 geohash
    xiangyuecn
        13
    xiangyuecn  
       2020-07-10 18:18:06 +08:00
    取小数点 3 位是体育老师教的吗😂

    如果不拆分区间,将所有坐标点遍历一遍就 ok 了,精度不高的情况下以要查询的点画个矩形(上下左右 100 米即可),只要比较坐标值的大小就 ok,不涉及三角函数计算,性能极高。

    拆分成区间来搞可大幅减少需要遍历的坐标数量

    必须准确 100 米内就不知道了
    la9998372
        14
    la9998372  
       2020-07-10 18:29:52 +08:00
    取经纬度小数点三位,恐怕不能定位到误差是 100 米,经纬度差一度,距离相差 111km
    dangyuluo
        15
    dangyuluo  
       2020-07-10 21:39:50 +08:00
    想造轮子的话可以看下 spatial hash
    chaohuang
        16
    chaohuang  
    OP
       2020-07-13 10:34:31 +08:00
    @liuzhaowei55 3 位差不多。
    chaohuang
        17
    chaohuang  
    OP
       2020-07-13 10:35:45 +08:00
    @la9998372 我这里取的是经纬度相差 0.001
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3180 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 12:44 · PVG 20:44 · LAX 04:44 · JFK 07:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.