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

2020-11-15 06:47:59 +08:00
 lihongming

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

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

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

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

但本帖讨论的是算法,不是数据库本身。为避免话题失焦,就不展开讨论,也不回复各位了,谢谢。
airqj
2020-11-15 09:03:11 +08:00
@lihongming
用的什么数据库都不能说吗?
难道是自己写的
aec4d
2020-11-15 09:22:50 +08:00
Geohash google s2 Uber H3
shawndev
2020-11-15 11:08:08 +08:00
geohash
des
2020-11-15 11:19:56 +08:00
geohash,或者自己写也行
https://www.cnblogs.com/tgzhu/p/8286616.html
SingeeKing
2020-11-15 17:36:01 +08:00
只好奇什么数据库这么…
lihongming
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 这十四块区域。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/725347

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX