Geohash i szukanie w pobliżu
Szymon Teżewski
@jasisz1
Przemysław Lewandowski
@haxoza
Jak to wygląda?
Sala 202
współrzędne: 52.219007, 21.012777
geohash: u3qcn4jjc0qn
U3
Nieparzyste geohashe
Parzyste geohashe
Magiczna właściwość
miejsca mają ten sam prefiks
=>
miejsca są w pobliżu
(znajdują się w tym samym prostokącie)
Niestety implikacja nie zachodzi w drugą stronę.
Niby blisko, a jednak...
A to i tak nic przy takich sytuacjach
Są sposoby na sposoby
A w Pythonie
Polecamy bibliotekę python-geohash
python-geohash
>>> geohash.encode(42.6, -5.6)
'ezs42e44yx96'
>>> geohash.decode('ezs42')
(42.60498046875, -5.60302734375
�>>> geohash.expand('ezs42')
['ezefr', 'ezs43', 'ezefx', 'ezs48', 'ezs49', 'ezefp', 'ezs40', 'ezs41', 'ezs42']
Przykład (niby-django)
import geohash
def near(qs, hash, prec=5):� hashes = geohash.expand(hash[:prec])� qfilter = Q()� for h in hashes:� qfilter = qfilter |
Q(geohash__startswith=h)� return qs.filter(qfilter)
Z tego wyjdzie +/- zapytanie:
SELECT "place"."id", "place"."name",
"place"."geohash" WHERE
("place"."geohash" LIKE ezefr% OR
"place"."geohash" LIKE ezs43% OR
"place"."geohash" LIKE ezs40% OR
"place"."geohash" LIKE ezefp% OR
"place"."geohash" LIKE ezs41% OR
"place"."geohash" LIKE ezs48% OR
"place"."geohash" LIKE ezefx% OR
"place"."geohash" LIKE ezs49% OR
"place"."geohash" LIKE ezs42%
)
Inne rozwiązania
SELECT *
FROM Business
WHERE Lat > (position_lat - d) AND
Lat < (position_lat + d) AND
Lon > (position_lon - d) AND
Lon < (position_lon + d);
Nie zadziała na Google App Engine.
Przydatne linki
Dziękujemy!