Recently I was looking for a solution how to tell if couple of Longitudes, Latitudes actually in the same Radius. So in the beginning I was thinking using Elasticsearch to store all my geo-locations and use their mechanism in order to search whether a point is within the requested Radius of other points.
Elastic-search is great product but I wasn’t sure if I wanted to maintain it only for our geolocation service. Our project already using Redis. I found our that on the new Redis version I actually could use all geo-location features.
Redis like in Redis -> Everything goes fast!!
Redis is an amazing key,value data source. Incredibility fast and efficient.
On their new upcoming version (not stable yet) Redis 3.2. a we have new GEO API features.
Redis is orginized with Geo-Sets (backed by sorted sets).
Let’s assume we have one set that is identified by a
key, and that holds some members that are associated with geo locations:
GEOADD geoset 8.663877549.5282537 "location1" 8.379628148.9978127 "location2 "8.665351,49.553302 "location3"
Now let’s suppose that I want to check which of my entries is close to a specific geo-point
Let’s assume my input geo-point is:
And I want to have all my stored locations with-in 10 km Radius. We do it this way:
GEORADIUS key 8.6582361, 49.5285495 10 km
The result will return the key-names(Location1, Location2,..) which actually close by 10 km Radius. Cool eh? how does it work? Redis encode the longtitude, latitude to a digit using technique called geo-hash. They forming a unique 52 bit integer.
So for example to determine if two lat,lon points are close we can geo-hash them first:
- Tel Aviv (32.0663, 34.7664) -> 1432645594530418
- Netanya (32.334, 34.8578) -> 1432650217449870
Pay attention to the prefixes. By that we can tell how close the points. The bigger the prefix the closer they are.