def group_ungrouped_rsts(city_id): """ Group all ungrouped restaurants into their nearly regions :param city_id: :return: """ ungrouped_rsts = get_ungrouped_rst(city_id) regions = region_base.get_regions_by_city_id(city_id) region_infos = [[r['id'], region_area_to_polygons(r['area'])] for r in regions] for region_info in region_infos: region_info.append(get_centerpoint_of_region(region_info[1])) if not ungrouped_rsts: return 0 for rst in ungrouped_rsts: point = (float(rst.latitude), float(rst.longitude)) region_id = None for region in regions: if not region['area']: continue polygons = region_area_to_polygons(region['area']) for polygon in polygons: if geo.is_in_region(point, polygon, xy_reverse=True): region_id = region['id'] break if region_id: break if not region_id: region_id = region_infos[0] min_distance = sys.maxint for info in region_infos: center_points = info[2] cur_distance = min([get_dist(p, point) for p in center_points]) if cur_distance < min_distance: min_distance = cur_distance region_id = info[0] log.info('Restaurant {} does not have matched regions. Find closest' ' one with region_id {}, distance {}'.format( rst.id, region_id, min_distance)) log.info('update rst {} with region {}'.format(rst.id, region_id)) inner.update_restaurant_region(rst.id, region_id) return len(ungrouped_rsts)
def main(): rsts = query_all_rsts(city_ids=[1], is_valid=1, is_premium=0) rst_region_map = region.get_region_map_by_rst([rst['id'] for rst in rsts]) region_map = region.mget(list(set(rst_region_map.values())), return_map=True) unregioned_count = 0 unregions = [] for rst_id, region_id in rst_region_map.iteritems(): if not region_map.has_key(region_id): unregioned_count += 1 print('{}, {}'.format(rst_id, region_id)) unregions.append(region_id) update_restaurant_region(rst_id, -10) print('total unregioned: {}'.format(unregioned_count)) print('unregions: {}'.format(list(set(unregions))))