现在有个需求,需要处理一些地理坐标,每个坐标由经度(取值范围-180 至+180 )和纬度(取值范围-90 至+90 )定义。
但是,我用的数据库只支持单列查询,所以我不能用类似于“经度 BETWEEN 20, 30 AND 纬度 BETWEEN 10, 15”这样的条件来查询,必须把经度和纬度用一种方法算出一个结果,存到另一个列里,然后针对那个列进行查询。
不知有没有什么好的算法呢?索引列可以不必是数值型的,字符串也可。
1
zhzy 2020-11-15 07:40:58 +08:00 via iPhone
geohash 了解一下
|
2
MinQ 2020-11-15 07:47:51 +08:00 via Android
geohash 或者 google s2
|
3
loliordie 2020-11-15 07:47:53 +08:00 via Android
不支持 and 的话做两次查询不行么?
|
4
beginor 2020-11-15 07:49:19 +08:00 via Android
什么数据库,不支持空间类型么?不能用 Geometry 类型么?
|
5
lihongming OP |
6
lihongming OP 我知道很多人会好奇什么数据库这么奇特,但客观条件就是这样,我只能用单列、基本数据类型(数字、布尔、字符串)来查询。
但本帖讨论的是算法,不是数据库本身。为避免话题失焦,就不展开讨论,也不回复各位了,谢谢。 |
7
airqj 2020-11-15 09:03:11 +08:00 via Android
|
8
aec4d 2020-11-15 09:22:50 +08:00 via iPhone
Geohash google s2 Uber H3
|
9
shawndev 2020-11-15 11:08:08 +08:00
geohash
|
10
des 2020-11-15 11:19:56 +08:00
geohash,或者自己写也行
https://www.cnblogs.com/tgzhu/p/8286616.html |
11
SingeeKing 2020-11-15 17:36:01 +08:00
只好奇什么数据库这么…
|
12
lihongming OP 试了一下,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 这十四块区域。 |