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

求个二维空间投射到一维空间的算法

  •  
  •   lihongming · 2020-11-15 06:47:59 +08:00 · 2436 次点击
    这是一个创建于 1470 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在有个需求,需要处理一些地理坐标,每个坐标由经度(取值范围-180 至+180 )和纬度(取值范围-90 至+90 )定义。

    但是,我用的数据库只支持单列查询,所以我不能用类似于“经度 BETWEEN 20, 30 AND 纬度 BETWEEN 10, 15”这样的条件来查询,必须把经度和纬度用一种方法算出一个结果,存到另一个列里,然后针对那个列进行查询。

    不知有没有什么好的算法呢?索引列可以不必是数值型的,字符串也可。

    12 条回复    2020-11-17 04:10:17 +08:00
    zhzy
        1
    zhzy  
       2020-11-15 07:40:58 +08:00 via iPhone
    geohash 了解一下
    MinQ
        2
    MinQ  
       2020-11-15 07:47:51 +08:00 via Android
    geohash 或者 google s2
    loliordie
        3
    loliordie  
       2020-11-15 07:47:53 +08:00 via Android
    不支持 and 的话做两次查询不行么?
    beginor
        4
    beginor  
       2020-11-15 07:49:19 +08:00 via Android
    什么数据库,不支持空间类型么?不能用 Geometry 类型么?
    lihongming
        5
    lihongming  
    OP
       2020-11-15 08:32:30 +08:00 via iPhone
    @zhzy @MinQ 谢谢,我去了解一下
    lihongming
        6
    lihongming  
    OP
       2020-11-15 08:35:37 +08:00 via iPhone
    我知道很多人会好奇什么数据库这么奇特,但客观条件就是这样,我只能用单列、基本数据类型(数字、布尔、字符串)来查询。

    但本帖讨论的是算法,不是数据库本身。为避免话题失焦,就不展开讨论,也不回复各位了,谢谢。
    airqj
        7
    airqj  
       2020-11-15 09:03:11 +08:00 via Android
    @lihongming
    用的什么数据库都不能说吗?
    难道是自己写的
    aec4d
        8
    aec4d  
       2020-11-15 09:22:50 +08:00 via iPhone
    Geohash google s2 Uber H3
    shawndev
        9
    shawndev  
       2020-11-15 11:08:08 +08:00
    geohash
    des
        10
    des  
       2020-11-15 11:19:56 +08:00
    geohash,或者自己写也行
    https://www.cnblogs.com/tgzhu/p/8286616.html
    SingeeKing
        11
    SingeeKing  
       2020-11-15 17:36:01 +08:00
    只好奇什么数据库这么…
    lihongming
        12
    lihongming  
    OP
       2020-11-17 04:10:17 +08:00
    试了一下,geohash 还是无法实现范围查找。

    比如下图

    ![geohash]( https://images.ctfassets.net/3prze68gbwl1/assetglossary-17su9wok1ui0z7r/7596e40f5438a7bdb84bf1cd0baa7c7f/geohashing-large-scale-example.jpeg)

    SELECT blocks WHERE geohash BETWEEN 211 AND 302

    我的本意是想要 211, 300, 213, 302 这四块组成的一个矩形区域,但搜索结果却是 211, 212, 213, 220, 221, 222, 223, 230, 231, 232, 233, 300, 301, 302 这十四块区域。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1009 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:03 · PVG 03:03 · LAX 11:03 · JFK 14:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.