Geohash-Java 搜索附近的经纬度

5
我一直在寻找如何使用ch.hsr.geohash搜索附近位置的明确示例。 我的意思是,我只需要实现以下情况:
1-我有一个Long纬度和Long经度。 2-将此纬度/经度转换为哈希。 (我相信使用“GeoHash.withBitPrecision(latitude,longitude,64)”来完成,但我不确定这里的精度是什么。 我想64位将具有与long相同的精度) 3-检索100公里内的纬度/经度列表(我甚至不知道如何使用geohash开始) 4-使用纬度/经度结果列表查询对象。
但是我找不到关于库的任何文档,也没有清晰的示例。 请问是否有人可以给我建议或给我任何搜索的起点? 是否有人已经使用此库来实现我正在寻找的相同结果? 谢谢!
1个回答

9

我最终采用了以下方法:

Geohash geohash = Geohash.withCharacterPrecision(latitude, longitude,12); String geohashString = geohash.toBase32();

然后根据我想要的距离处理geohashString。我的意思是,根据其精度匹配字符串的前缀。例如,

数据库:

Name | geohash | id

Model 1 | gc7x9813vx2r | 1
Model 2 | gc7x8840suhr | 2
Model 3 | gc30psvp0zgr | 3

然后我想获取距离这个点(53.244664,-6.140530)100公里半径内的所有模型。

Geohash geohash = Geohash. withCharacterPrecision(53.244664, -6.140530, 12);
String geohashString = geohash.toBase32().substring(0, 3); //3 characters for around 100km of precision

ofy().load().type(Model.class).filter("geohash >=", geoHashString).filter("geohash <", geoHashString + "\uFFFD");

接下来,它将仅匹配以“gc7”开头的 Model 1 和 Model 2,因此它们大约在100公里半径范围内。

根据以下表格进行精度匹配:https://en.wikipedia.org/wiki/Geohash

实际上,我可以简化步骤:

String geohashString = Geohash. withCharacterPrecision(53.244664, -6.140530, 3).toBase32();

虽然我还没有进行任何性能测试,但我认为它不会变得更慢。无论如何,如果性能测试“失败”,我将实现相同的操作,但使用binaryString。


1
如果您的位置不在集群中心,而是在西南角等其他位置怎么办?那么您将无法获得所需半径内的所有模型,因为有些模型可能在另一个集群中,对吧? - thomas gotzsche
@thomasgotzsche 你说得对。例如,城市A位于矩形的顶部/北部。采用这种方法,您将无法找到一个距离北部1公里但在矩形外的城市。但是您将找到距离超过50公里的城市... Thomas,您找到更好的解决方案了吗? - basti12354

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接