Hier etwas einfacheres als in meinem letzten Thread: https://github.com/ihucos/geonear
Geohash basierte Geolocation queries auf Redis. Alle operationen auf redis sind entweder ein einzelner befehl oder lua-skript. Das ganze ist auf schnelle nearby-queries optimiert.
Funktioniert glaube ich leider nicht auf Redis-Cluster.
Anwendungsbeispiel:
Code: Alles auswählen
>>> from redis import StrictRedis
>>> from geonear import Globe
>>> globe = Globe(StrictRedis(), geohash_precision=8)
Populate the database
>>> globe.pin('max', location='Sophienstr. 9, 10178 Berlin')
>>> globe.pin('peter', location='Sophienstr. 10, 10178 Berlin', data=['my', 'data'])
>>> globe.pin('anna', location='Sophienstr. 11, 10178 Berlin')
>>> globe.pin('mr bean', location='Sophienstr. 20, 10178 Berlin')
Simple query
>>> area = globe.near(location='Sophienstr. 10, 10178 Berlin')
>>> area
<Area containing 3 pins (e.g. 'peter'), size 9 >
>>> list(area)
['anna', 'max', 'peter']
Delete entry
>>> globe.delete('max')
>>> list(area) # lazy evaluation on area objects without any caching
['anna', 'peter']
>>> not 'max' in globe and not 'max' in area
True
Fetch data
>>> globe.map_with_data(area)
{'peter': [u'my', u'data'], 'anna': None}
List geohashes used internally
>>> area.geohashes
set(['u33dbcze', 'u33dbczm', 'u33dbczj', 'u33dbczk', 'u33dbczh', 'u33dbcz7', 'u33dbczt', 'u33dbcz5', 'u33dbczs'])