Beispiel #1
0
class ClastersSearcher(object):
    def __init__(self, aerospike_connector):
        self._search_index = SearchIndex(aerospike_connector)

    def search(self, params):
        # Prepare params
        lat1 = params.center_latitude - params.span_latitude
        lon1 = params.center_longitude - params.span_longitude
        lat2 = params.center_latitude + params.span_latitude
        lon2 = params.center_longitude + params.span_longitude

        gridsize_lat = params.span_latitude * 2 / params.screen_height * params.grid_size
        gridsize_lon = params.span_longitude * 2 / params.screen_width * params.grid_size

        n_signs = params.signs_sample_size
        if n_signs == None:
            n_signs = 100

        # Builder to accumulate and group signs
        builder = ClustersBuilder(gridsize_lat, gridsize_lon, 100, n_signs)

        # Retrieve and process signs
        self._search_index.search_region(params.user_id, \
                                         lat1, lon1, \
                                         lat2, lon2, \
                                         self._records_processor(params, builder))
        return builder.clusters

    def _records_processor(self, params, builder):
        def _impl(record):
            sign_id = int(record['sign_id'])
            location = record['location'].unwrap().get('coordinates')
            builder.put_sign(sign_id, location[1], location[0])

        return _impl