def getIds(self, redisConn, lat, lon, radius, store = False ): res = None for r in self.resolutions: if r >= radius: res = r break if not res: logging.warn("Radius too big for available resolutions") return [] closest = set() if radius > 0 and radius <= self.RES_128KM: bitres = self.BIT_RESOLUTIONS[res] cell = self.getGeocell(lat, lon, bitres) closest.add(self.getKey(res, cell)) p = Point(lat, lon) with TimeSampler(None, 'collecting cells'): for bearing in (0, 45, 90, 135, 180, 225, 270, 315): dest = p.destination(bearing, math.sqrt(2 * (radius**2)) if bearing % 90 else radius) cell = self.getGeocell(dest.latitude, dest.longitude, self.BIT_RESOLUTIONS[res]) closest.add(self.getKey(res, cell)) tmpKey = 'box:%s:%s,%s' % (self.className, lat,lon) if not store: redisConn.zunionstore(tmpKey, list(closest)) return redisConn.zrevrange(tmpKey, 0, -1, withscores=True) else: return list(closest) return [] if not store else None