def test_get_cluster_centroids_as_geo_json(self):
        test_layer_1 = DBSession.query(Layer).filter_by(name='TestLayer1').one()
        test_layer_2 = DBSession.query(Layer).filter_by(name='TestLayer2').one()

        q = GriddedAndBoundMappablePoint.get_points_as_geojson(test_layer_1, grid_size=1)
        result = q.all()
        self.assertEqual(result[0].centroid, '{"type":"Point","coordinates":[20,10]}')
        self.assertEqual(result[1].centroid, '{"type":"Point","coordinates":[30,10]}')
        self.assertEqual(result[0].cluster_size, 1)
        self.assertEqual(result[1].cluster_size, 1)

        q2 = GriddedAndBoundMappablePoint.get_points_as_geojson(test_layer_1, grid_size=100)
        result2 = q2.one()
        self.assertEqual(result2.centroid, '{"type":"Point","coordinates":[25,10]}')

        q3 = GriddedAndBoundMappablePoint.get_points_as_geojson(test_layer_2, grid_size=100)
        result3 = q3.one()
        self.assertEqual(result3.centroid, '{"type":"Point","coordinates":[16.6666666666667,15]}')
    def test_get_layer_points_as_geo_json(self):
        test_layer_1 = DBSession.query(Layer).filter_by(name='TestLayer1').one()
        test_layer_2 = DBSession.query(Layer).filter_by(name='TestLayer2').one()

        q = GriddedAndBoundMappablePoint.get_points_as_geojson(test_layer_1, grid_size=1)
        result = q.all()
#        self.assertEqual(result[0].locations, '{"type":"MultiPoint","coordinates":[[20,10]]}')
#        self.assertEqual(result[1].locations, '{"type":"MultiPoint","coordinates":[[30,10]]}')

        q2 = GriddedAndBoundMappablePoint.get_points_as_geojson(test_layer_1, grid_size=100)
        result2 = q2.all()
#        self.assertEqual(result2[0].locations, '{"type":"MultiPoint","coordinates":[[30,10],[20,10]]}')
        self.assertEqual(result2[0].cluster_size, 2)

        q3 = GriddedAndBoundMappablePoint.get_points_as_geojson(test_layer_2, grid_size=1)
        result3 = q3.all()
#        self.assertEqual(result3[0].locations, '{"type":"MultiPoint","coordinates":[[10,15],[10,15]]}')
#        self.assertEqual(result3[1].locations, '{"type":"MultiPoint","coordinates":[[30,15]]}')
        self.assertEqual(result3[0].cluster_size, 2)
        self.assertEqual(result3[1].cluster_size, 1)
    def test_get_cluster_grid_size(self):
        bounds_1 = "-180, -90, 180, 90"
        grid_size_1 = GriddedAndBoundMappablePoint.get_cluster_grid_size(bounds_1)
        self.assertEqual(grid_size_1, (270.0 / GriddedAndBoundMappablePoint.GRID_SIZE_WINDOW_FRACTION))

        bounds_2 = "0, 0, 180, 90"
        grid_size_2 = GriddedAndBoundMappablePoint.get_cluster_grid_size(bounds_2)
        self.assertEqual(grid_size_2, (135.0 / GriddedAndBoundMappablePoint.GRID_SIZE_WINDOW_FRACTION))

        bounds_3 = "0, 0, 10, 10"
        grid_size_3 = GriddedAndBoundMappablePoint.get_cluster_grid_size(bounds_3)
        self.assertEqual(grid_size_3, (10.0 / GriddedAndBoundMappablePoint.GRID_SIZE_WINDOW_FRACTION))

        bounds_4 = "0, 0, 0.0001, 0.0001"
        grid_size_4 = GriddedAndBoundMappablePoint.get_cluster_grid_size(bounds_4)
        self.assertTrue( ( grid_size_4 / GriddedAndBoundMappablePoint.GRID_SIZE_WINDOW_FRACTION ) < GriddedAndBoundMappablePoint.MIN_GRID_SIZE_BEFORE_NO_CLUSTERING)
        self.assertEqual(grid_size_4, 0)

        bounds_5 = "0, b, 0.0001, 0.0001"
        grid_size_5 = GriddedAndBoundMappablePoint.get_cluster_grid_size(bounds_5)
        self.assertEqual(None, grid_size_5)
    def generate_cache_clusters(class_, layer, grid_size):
        log = logging.getLogger(__name__)
        log.debug("Generating cache for grid size: %s", grid_size)

        cache_record = class_.CacheRecord(grid_size)
        layer.cache_records.append(cache_record)
        DBSession.flush()

        clusters = GriddedAndBoundMappablePoint.get_points_as_wkt(layer, grid_size=grid_size)\
                .filter(
                    MappablePoint.layer_id == layer.id
                )

        i = 0
        for cluster in clusters:
            i += 1
            centroid = cluster.centroid
            cluster_size = cluster.cluster_size
#            locations = cluster.locations
            cached_mappable_cluster = class_.CachedMappablePointCluster(cluster_size, centroid) #, locations)
            cache_record.cached_mappable_point_clusters.append(cached_mappable_cluster)
            if (i % 10000 == 0):
                log.debug("Up to cluster: %i", i)
                DBSession.flush()
 def test_get_layer_points_as_wkt(self):
     test_layer_1 = DBSession.query(Layer).filter_by(name='TestLayer1').one()
     q = GriddedAndBoundMappablePoint.get_points_as_wkt(test_layer_1, grid_size=1)
     result = q.all()
 def test_bounds_not_intersecting_points(self):
     test_layer_1 = DBSession.query(Layer).filter_by(name='TestLayer1').one()
     q = GriddedAndBoundMappablePoint.get_points_as_geojson(test_layer_1, grid_size=1, bbox=[-180,-89,-170,-80])
     result = q.all()
     self.assertEqual(len(result),0)