私はw i次のアプローチ:
Geohash geohash = Geohash。 withCharacterPrecision(緯度、経度、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");
は、次にそれが一致するだけで、彼らは約100キロの半径内にあるように、「GC7」で始まるモデル1とモデル2。
精度については、この表の後に:私はまだパフォーマンステストをしませんでしたが、私はそれはないと思う
String geohashString = Geohash. withCharacterPrecision(53.244664, -6.140530, 3).toBase32();
: https://en.wikipedia.org/wiki/Geohash
私は実際に手順を簡素化することができはるかに遅くなる。とにかく、パフォーマンステストが "失敗"した場合、私は同じことを実装しますが、代わりにbinaryStringを使用します。