예제 #1
0
 def test_auto_resolution(self):
     grid = TileGrid(is_geodetic=True,
                     bbox=(-10, 30, 10, 40),
                     tile_size=(20, 20))
     tile_bbox = grid.tile_bbox((0, 0, 0))
     assert tile_bbox == (-10, 30, 10, 50)
     assert grid.resolution(0) == 1.0
예제 #2
0
class TestWGS84TileGrid(object):
    def setup(self):
        self.grid = TileGrid(is_geodetic=True)

    def test_resolution(self):
        assert_almost_equal(self.grid.resolution(0), 1.40625)
        assert_almost_equal(self.grid.resolution(1), 1.40625/2)

    def test_bbox(self):
        eq_(self.grid.bbox, (-180.0, -90.0, 180.0, 90.0))

    def test_grid_size(self):
        eq_(self.grid.grid_sizes[0], (1, 1))
        eq_(self.grid.grid_sizes[1], (2, 1))
        eq_(self.grid.grid_sizes[2], (4, 2))

    def test_affected_tiles(self):
        bbox, grid, tiles = self.grid.get_affected_tiles((-180,-90,180,90), (512,256))
        eq_(bbox, (-180.0, -90.0, 180.0, 90.0))
        eq_(grid, (2, 1))
        eq_(list(tiles), [(0, 0, 1), (1, 0, 1)])

    def test_affected_level_tiles(self):
        bbox, grid, tiles = self.grid.get_affected_level_tiles((-180,-90,180,90), 1)
        eq_(grid, (2, 1))
        eq_(bbox, (-180.0, -90.0, 180.0, 90.0))
        eq_(list(tiles), [(0, 0, 1), (1, 0, 1)])
        bbox, grid, tiles = self.grid.get_affected_level_tiles((0,0,180,90), 2)
        eq_(grid, (2, 1))
        eq_(bbox, (0.0, 0.0, 180.0, 90.0))
        eq_(list(tiles), [(2, 1, 2), (3, 1, 2)])
예제 #3
0
    def test_explicit_grid(self):
        grid = TileGrid(res=[0.1, 0.05, 0.01])
        eq_(grid.resolution(0), 0.1)
        eq_(grid.resolution(1), 0.05)
        eq_(grid.resolution(2), 0.01)

        eq_(grid.closest_level(0.00001), 2)
예제 #4
0
    def test_explicit_grid(self):
        grid = TileGrid(res=[0.1, 0.05, 0.01])
        eq_(grid.resolution(0), 0.1)
        eq_(grid.resolution(1), 0.05)
        eq_(grid.resolution(2), 0.01)

        eq_(grid.closest_level(0.00001), 2)
예제 #5
0
class TestWGS84TileGrid(object):
    def setup(self):
        self.grid = TileGrid(is_geodetic=True)

    def test_resolution(self):
        assert_almost_equal(self.grid.resolution(0), 1.40625)
        assert_almost_equal(self.grid.resolution(1), 1.40625 / 2)

    def test_bbox(self):
        eq_(self.grid.bbox, (-180.0, -90.0, 180.0, 90.0))

    def test_grid_size(self):
        eq_(self.grid.grid_sizes[0], (1, 1))
        eq_(self.grid.grid_sizes[1], (2, 1))
        eq_(self.grid.grid_sizes[2], (4, 2))

    def test_affected_tiles(self):
        bbox, grid, tiles = self.grid.get_affected_tiles((-180, -90, 180, 90),
                                                         (512, 256))
        eq_(bbox, (-180.0, -90.0, 180.0, 90.0))
        eq_(grid, (2, 1))
        eq_(list(tiles), [(0, 0, 1), (1, 0, 1)])

    def test_affected_level_tiles(self):
        bbox, grid, tiles = self.grid.get_affected_level_tiles(
            (-180, -90, 180, 90), 1)
        eq_(grid, (2, 1))
        eq_(bbox, (-180.0, -90.0, 180.0, 90.0))
        eq_(list(tiles), [(0, 0, 1), (1, 0, 1)])
        bbox, grid, tiles = self.grid.get_affected_level_tiles((0, 0, 180, 90),
                                                               2)
        eq_(grid, (2, 1))
        eq_(bbox, (0.0, 0.0, 180.0, 90.0))
        eq_(list(tiles), [(2, 1, 2), (3, 1, 2)])
예제 #6
0
 def __init__(self, srs, target_dir):
     self.service_srs = srs
     self.sources = {}
     self.caches = {}
     self.layers = []
     self.yaml_file = os.path.join(target_dir, 'mapproxy.yaml')
     self.grid = TileGrid(SRS(3857))
예제 #7
0
 def tile_mgr(self, mock_file_cache, mock_tile_client, tile_locker):
     grid = TileGrid(SRS(4326), bbox=[-180, -90, 180, 90])
     source_grid = TileGrid(SRS(4326), bbox=[0, -90, 180, 90])
     source = TiledSource(source_grid, mock_tile_client)
     image_opts = ImageOptions(format='image/png')
     return TileManager(grid, mock_file_cache, [source], 'png',
         image_opts=image_opts,
         locker=tile_locker,
     )
예제 #8
0
 def setup(self):
     self.file_cache = MockFileCache('/dev/null', 'png', lock_dir=tmp_lock_dir)
     self.grid = TileGrid(SRS(4326), bbox=[-180, -90, 180, 90])
     self.source_grid = TileGrid(SRS(4326), bbox=[0, -90, 180, 90])
     self.client = MockTileClient()
     self.source = TiledSource(self.source_grid, self.client)
     self.image_opts = ImageOptions(format='image/png')
     self.tile_mgr = TileManager(self.grid, self.file_cache, [self.source], 'png',
         image_opts=self.image_opts)
예제 #9
0
 def test_broken_bbox(self):
     grid = TileGrid()
     # broken request from "ArcGIS Client Using WinInet"
     req_bbox = (-10000855.0573254,2847125.18913603,-9329367.42767611,4239924.78564583)
     try:
         grid.get_affected_tiles(req_bbox, (256, 256), req_srs=SRS(31467))
     except TransformationError:
         pass
     else:
         assert False, 'Expected TransformationError'
예제 #10
0
 def test_affected_tiles_out_of_grid_bounds(self):
     grid = TileGrid()
     #bbox from open layers
     req_bbox = (-30056262.509599999, -10018754.170400001, -20037508.339999996, -0.00080000050365924835)
     bbox, grid_size, tiles = \
         grid.get_affected_tiles(req_bbox, (256, 256))
     assert_almost_equal_bbox(bbox, req_bbox)
     eq_(grid_size, (1, 1))
     tiles = list(tiles)
     eq_(tiles, [None])
예제 #11
0
 def test_broken_bbox(self):
     grid = TileGrid()
     # broken request from "ArcGIS Client Using WinInet"
     req_bbox = (-10000855.0573254,2847125.18913603,-9329367.42767611,4239924.78564583)
     try:
         grid.get_affected_tiles(req_bbox, (256, 256), req_srs=SRS(31467))
     except TransformationError:
         pass
     else:
         assert False, 'Expected TransformationError'
예제 #12
0
 def test_affected_tiles_out_of_grid_bounds(self):
     grid = TileGrid()
     #bbox from open layers
     req_bbox = (-30056262.509599999, -10018754.170400001, -20037508.339999996, -0.00080000050365924835)
     bbox, grid_size, tiles = \
         grid.get_affected_tiles(req_bbox, (256, 256))
     assert_almost_equal_bbox(bbox, req_bbox)
     eq_(grid_size, (1, 1))
     tiles = list(tiles)
     eq_(tiles, [None])
예제 #13
0
 def __init__(self, db_session, srs, target_dir, couch_url, couch_port):
     self.db_session = db_session
     self.couch_url = couch_url
     self.couch_port = couch_port
     self.service_srs = srs
     self.sources = {}
     self.caches = {}
     self.layers = []
     self.yaml_file = os.path.join(target_dir, 'mapproxy.yaml')
     self.grid = TileGrid(SRS(3857))
예제 #14
0
class TestGeodeticTileGrid(TileGridTest):
    def setup(self):
        self.grid = TileGrid(is_geodetic=True, )

    def test_auto_resolution(self):
        grid = TileGrid(is_geodetic=True,
                        bbox=(-10, 30, 10, 40),
                        tile_size=(20, 20))
        tile_bbox = grid.tile_bbox((0, 0, 0))
        assert tile_bbox == (-10, 30, 10, 50)
        assert grid.resolution(0) == 1.0

    def test_grid(self):
        for level, grid_size in [(0, (1, 1)), (1, (2, 1)), (2, (4, 2))]:
            yield self.check_grid, level, grid_size

    def test_adjacent_tile_bbox(self):
        grid = TileGrid(is_geodetic=True,
                        bbox=(-10, 30, 10, 40),
                        tile_size=(20, 20))
        t1 = grid.tile_bbox((0, 0, 2))
        t2 = grid.tile_bbox((1, 0, 2))
        t3 = grid.tile_bbox((0, 1, 2))
        assert t1[1] == t2[1]
        assert t1[3] == t2[3]
        assert t1[2] == t2[0]
        assert t1[0] == t3[0]
        assert t1[2] == t3[2]
        assert t1[3] == t3[1]

    def test_w_resolution(self):
        res = [1, 0.5, 0.2]
        grid = TileGrid(is_geodetic=True,
                        bbox=(-10, 30, 10, 40),
                        tile_size=(20, 20),
                        res=res)
        assert grid.grid_sizes[0] == (1, 1)
        assert grid.grid_sizes[1] == (2, 1)
        assert grid.grid_sizes[2] == (5, 3)

    def test_tile(self):
        assert self.grid.tile(-180, -90, 0) == (0, 0, 0)
        assert self.grid.tile(-180, -90, 1) == (0, 0, 1)
        assert self.grid.tile(-180, -90, 2) == (0, 0, 2)
        assert self.grid.tile(180 - 0.001, 90 - 0.001, 0) == (0, 0, 0)
        assert self.grid.tile(10, 50, 1) == (1, 0, 1)

    def test_affected_tiles(self):
        bbox, grid_size, tiles = \
            self.grid.get_affected_tiles((-45,-45,45,45), (512,512))
        assert self.grid.grid_sizes[3] == (8, 4)
        assert bbox == (-45.0, -45.0, 45.0, 45.0)
        assert grid_size == (2, 2)
        tiles = list(tiles)
        assert tiles == [(3, 2, 3), (4, 2, 3), (3, 1, 3), (4, 1, 3)]
예제 #15
0
 def setup(self):
     self.grid = TileGrid(
         SRS(31467),
         bbox=[420000, 30000, 900000, 350000],
         origin='ul',
         res=[
             4000, 3750, 3500, 3250, 3000, 2750, 2500, 2250, 2000, 1750,
             1500, 1250, 1000, 750, 650, 500, 250, 100, 50, 20, 10, 5, 2.5,
             2, 1.5, 1, 0.5
         ],
     )
예제 #16
0
 def test_adjacent_tile_bbox(self):
     grid = TileGrid(is_geodetic=True, bbox=(-10, 30, 10, 40), tile_size=(20, 20))
     t1 = grid.tile_bbox((0, 0, 2))
     t2 = grid.tile_bbox((1, 0, 2))
     t3 = grid.tile_bbox((0, 1, 2))
     assert t1[1] == t2[1]
     assert t1[3] == t2[3]
     assert t1[2] == t2[0]
     assert t1[0] == t3[0]
     assert t1[2] == t3[2]
     assert t1[3] == t3[1]
예제 #17
0
 def test_adjacent_tile_bbox(self):
     grid = TileGrid(is_geodetic=True, bbox=(-10, 30, 10, 40), tile_size=(20, 20))
     t1 = grid.tile_bbox((0, 0, 2))
     t2 = grid.tile_bbox((1, 0, 2))
     t3 = grid.tile_bbox((0, 1, 2))
     assert t1[1] == t2[1]
     assert t1[3] == t2[3]
     assert t1[2] == t2[0]
     assert t1[0] == t3[0]
     assert t1[2] == t3[2]
     assert t1[3] == t3[1]
예제 #18
0
class TestClosestLevelTinyResFactor(object):
    def setup(self):
        self.grid = TileGrid(SRS(31467),
            bbox=[420000,30000,900000,350000], origin='ul',
            res=[4000,3750,3500,3250,3000,2750,2500,2250,2000,1750,1500,1250,1000,750,650,500,250,100,50,20,10,5,2.5,2,1.5,1,0.5],
        )

    def test_closest_level(self):
        eq_(self.grid.closest_level(5000), 0)
        eq_(self.grid.closest_level(4000), 0)
        eq_(self.grid.closest_level(3750), 1)
        eq_(self.grid.closest_level(3500), 2)
        eq_(self.grid.closest_level(3250), 3)
        eq_(self.grid.closest_level(3000), 4)
예제 #19
0
    def test_seed_with_res_list(self):
        # box from 10 10 to 80 80 with small spike/corner to -10 60 (upper left)
        geom = load_wkt(
            "POLYGON((10 10, 10 50, -10 60, 10 80, 80 80, 80 10, 10 10))")

        self.grid = TileGrid(
            SRS(4326),
            bbox=[-180, -90, 180, 90],
            res=[360 / 256, 360 / 720, 360 / 2000, 360 / 5000, 360 / 8000],
        )
        self.tile_mgr = TileManager(self.grid,
                                    MockCache(), [self.source],
                                    "png",
                                    locker=DummyLocker())
        task = self.make_geom_task(geom, SRS(4326), [0, 1, 2, 3, 4])
        seeder = TileWalker(task, self.seed_pool, handle_uncached=True)
        seeder.walk()

        assert len(self.seed_pool.seeded_tiles) == 5
        assert self.seed_pool.seeded_tiles[0] == set([(0, 0)])
        assert self.grid.grid_sizes[1] == (3, 2)
        assert self.seed_pool.seeded_tiles[1] == set([(1, 0), (1, 1), (2, 0),
                                                      (2, 1)])
        assert self.grid.grid_sizes[2] == (8, 4)
        assert self.seed_pool.seeded_tiles[2] == set([(4, 2), (5, 2), (4, 3),
                                                      (5, 3), (3, 3)])
        assert self.grid.grid_sizes[3] == (20, 10)
        assert len(self.seed_pool.seeded_tiles[3]) == 5 * 5 + 2
예제 #20
0
    def test_seed_with_res_list(self):
        if not load_wkt: raise SkipTest('no shapely installed')
        # box from 10 10 to 80 80 with small spike/corner to -10 60 (upper left)
        geom = load_wkt(
            "POLYGON((10 10, 10 50, -10 60, 10 80, 80 80, 80 10, 10 10))")

        self.grid = TileGrid(
            SRS(4326),
            bbox=[-180, -90, 180, 90],
            res=[360 / 256, 360 / 720, 360 / 2000, 360 / 5000, 360 / 8000])
        self.tile_mgr = TileManager(self.grid,
                                    MockCache(), [self.source],
                                    'png',
                                    locker=DummyLocker())
        task = self.make_geom_task(geom, SRS(4326), [0, 1, 2, 3, 4])
        seeder = TileWalker(task, self.seed_pool, handle_uncached=True)
        seeder.walk()

        eq_(len(self.seed_pool.seeded_tiles), 5)
        eq_(self.seed_pool.seeded_tiles[0], set([(0, 0)]))
        eq_(self.grid.grid_sizes[1], (3, 2))
        eq_(self.seed_pool.seeded_tiles[1],
            set([(1, 0), (1, 1), (2, 0), (2, 1)]))
        eq_(self.grid.grid_sizes[2], (8, 4))
        eq_(self.seed_pool.seeded_tiles[2],
            set([(4, 2), (5, 2), (4, 3), (5, 3), (3, 3)]))
        eq_(self.grid.grid_sizes[3], (20, 10))
        eq_(len(self.seed_pool.seeded_tiles[3]), 5 * 5 + 2)
예제 #21
0
 def test_metatile_non_default_meta_size(self):
     mgrid = MetaGrid(grid=TileGrid(), meta_size=(4, 2))
     meta_tile = mgrid.meta_tile((4, 5, 3))
     assert_almost_equal_bbox(
         meta_tile.bbox, (0.0, 0.0, 20037508.342789244, 10018754.171394622))
     eq_(meta_tile.size, (1024, 512))
     eq_(meta_tile.grid_size, (4, 2))
예제 #22
0
def test_metagrid_tiles_w_meta_size():
    mgrid = MetaGrid(grid=TileGrid(), meta_size=(4, 2))
    assert list(mgrid.meta_tile((1, 2, 2)).tile_patterns) == \
        [((0, 3, 2), (0, 0)), ((1, 3, 2), (256, 0)),
         ((2, 3, 2), (512, 0)), ((3, 3, 2), (768, 0)),
         ((0, 2, 2), (0, 256)), ((1, 2, 2), (256, 256)),
         ((2, 2, 2), (512, 256)), ((3, 2, 2), (768, 256))]
예제 #23
0
 def __init__(self, srs, target_dir):
     self.service_srs = srs
     self.sources = {}
     self.caches = {}
     self.layers = []
     self.yaml_file = os.path.join(target_dir, 'mapproxy.yaml')
     self.grid = TileGrid(SRS(3857))
예제 #24
0
 def setup(self):
     self.file_cache = MockFileCache('/dev/null', 'png', lock_dir=tmp_lock_dir)
     self.grid = TileGrid(SRS(4326), bbox=[-180, -90, 180, 90])
     self.client = MockWMSClient()
     self.source = WMSSource(self.client)
     self.tile_mgr = TileManager(self.grid, self.file_cache, [self.source], 'png',
         meta_size=[2, 2], meta_buffer=10, minimize_meta_requests=True)
예제 #25
0
    def test_get_map_with_res_range(self, mock_file_cache, mock_wms_client,
                                    tile_locker):
        grid = TileGrid(SRS(4326), bbox=[-180, -90, 180, 90])
        res_range = resolution_range(1000, 10)
        source = WMSSource(mock_wms_client, res_range=res_range)
        image_opts = ImageOptions(resampling='nearest')
        tile_mgr = TileManager(grid,
                               mock_file_cache, [source],
                               'png',
                               meta_size=[2, 2],
                               meta_buffer=0,
                               image_opts=image_opts,
                               locker=tile_locker)
        layer = CacheMapLayer(tile_mgr, image_opts=default_image_opts)

        with pytest.raises(BlankImage):
            result = layer.get_map(
                MapQuery(
                    (-20037508.34, -20037508.34, 20037508.34, 20037508.34),
                    (500, 500), SRS(900913), 'png'))
        assert mock_file_cache.stored_tiles == set()

        result = layer.get_map(
            MapQuery((0, 0, 10000, 10000), (50, 50), SRS(900913), 'png'))
        assert mock_file_cache.stored_tiles == \
            set([(512, 257, 10), (513, 256, 10), (512, 256, 10), (513, 257, 10)])
        assert result.size == (50, 50)
예제 #26
0
    def test_bad_config_geopackage_no_gpkg_contents(self, app, base_dir):
        gpkg_file = base_dir.join("cache.gpkg").strpath
        table_name = "no_gpkg_contents"

        with sqlite3.connect(gpkg_file) as db:
            cur = db.execute(
                """SELECT name FROM sqlite_master WHERE type='table' AND name=?""",
                (table_name, ),
            )
            content = cur.fetchone()
            assert content[0] == table_name

        with sqlite3.connect(gpkg_file) as db:
            cur = db.execute(
                """SELECT table_name FROM gpkg_contents WHERE table_name=?""",
                (table_name, ),
            )
            content = cur.fetchone()
            assert not content

        GeopackageCache(gpkg_file, TileGrid(srs=4326), table_name=table_name)

        with sqlite3.connect(gpkg_file) as db:
            cur = db.execute(
                """SELECT table_name FROM gpkg_contents WHERE table_name=?""",
                (table_name, ),
            )
            content = cur.fetchone()
            assert content[0] == table_name
예제 #27
0
 def tile_mgr(self, mock_file_cache, mock_wms_client, tile_locker):
     grid = TileGrid(SRS(4326), bbox=[-180, -90, 180, 90])
     source = WMSSource(mock_wms_client)
     return TileManager(grid, mock_file_cache, [source], 'png',
         meta_size=[2, 2], meta_buffer=10, minimize_meta_requests=True,
         locker=tile_locker,
     )
예제 #28
0
 def setup(self):
     self.cache_dir = tempfile.mkdtemp()
     self.file_cache = FileCache(cache_dir=self.cache_dir, file_ext='png')
     self.grid = TileGrid(SRS(4326), bbox=[-180, -90, 180, 90])
     self.client = MockTileClient()
     self.source = TiledSource(self.grid, self.client)
     self.tile_mgr = TileManager(self.grid, self.file_cache, [self.source], 'png')
예제 #29
0
 def tile_mgr(self, file_cache, slow_source, tile_locker):
     grid = TileGrid(SRS(4326), bbox=[-180, -90, 180, 90])
     image_opts = ImageOptions(format='image/png')
     return TileManager(grid, file_cache, [slow_source], 'png',
         meta_size=[2, 2], meta_buffer=0, image_opts=image_opts,
         locker=tile_locker,
     )
예제 #30
0
class TestGeodeticTileGrid(TileGridTest):
    def setup(self):
        self.grid = TileGrid(is_geodetic=True, )
    def test_auto_resolution(self):
        grid = TileGrid(is_geodetic=True, bbox=(-10, 30, 10, 40), tile_size=(20, 20))
        tile_bbox = grid.tile_bbox((0, 0, 0))
        assert tile_bbox == (-10, 30, 10, 50)
        assert grid.resolution(0) == 1.0

    def test_grid(self):
        for level, grid_size in [(0, (1, 1)), (1, (2, 1)), (2, (4, 2))]:
            yield self.check_grid, level, grid_size

    def test_adjacent_tile_bbox(self):
        grid = TileGrid(is_geodetic=True, bbox=(-10, 30, 10, 40), tile_size=(20, 20))
        t1 = grid.tile_bbox((0, 0, 2))
        t2 = grid.tile_bbox((1, 0, 2))
        t3 = grid.tile_bbox((0, 1, 2))
        assert t1[1] == t2[1]
        assert t1[3] == t2[3]
        assert t1[2] == t2[0]
        assert t1[0] == t3[0]
        assert t1[2] == t3[2]
        assert t1[3] == t3[1]

    def test_w_resolution(self):
        res = [1, 0.5, 0.2]
        grid = TileGrid(is_geodetic=True, bbox=(-10, 30, 10, 40), tile_size=(20, 20), res=res)
        assert grid.grid_sizes[0] == (1, 1)
        assert grid.grid_sizes[1] == (2, 1)
        assert grid.grid_sizes[2] == (5, 3)

    def test_tile(self):
        assert self.grid.tile(-180, -90, 0) == (0, 0, 0)
        assert self.grid.tile(-180, -90, 1) == (0, 0, 1)
        assert self.grid.tile(-180, -90, 2) == (0, 0, 2)
        assert self.grid.tile(180-0.001, 90-0.001, 0) == (0, 0, 0)
        assert self.grid.tile(10, 50, 1) == (1, 0, 1)

    def test_affected_tiles(self):
        bbox, grid_size, tiles = \
            self.grid.get_affected_tiles((-45,-45,45,45), (512,512))
        assert self.grid.grid_sizes[3] == (8, 4)
        assert bbox == (-45.0, -45.0, 45.0, 45.0)
        assert grid_size == (2, 2)
        tiles = list(tiles)
        assert tiles == [(3, 2, 3), (4, 2, 3), (3, 1, 3), (4, 1, 3)]
예제 #31
0
 def setup(self):
     self.grid = TileGrid(SRS(4326), bbox=[-180, -90, 180, 90])
     self.source = TiledSource(self.grid, None)
     self.tile_mgr = TileManager(self.grid,
                                 MockCache(), [self.source],
                                 "png",
                                 locker=DummyLocker())
     self.seed_pool = MockSeedPool()
예제 #32
0
 def layer(self, mock_file_cache, mock_wms_client, tile_locker):
     grid = TileGrid(SRS(4326), bbox=[-180, -90, 180, 90])
     source = WMSSource(mock_wms_client)
     image_opts = ImageOptions(resampling='nearest')
     tile_mgr = TileManager(grid, mock_file_cache, [source], 'png',
         meta_size=[2, 2], meta_buffer=0, image_opts=image_opts,
         locker=tile_locker)
     return CacheMapLayer(tile_mgr, image_opts=default_image_opts)
예제 #33
0
 def test_metatile_bbox(self):
     mgrid = MetaGrid(grid=TileGrid(), meta_size=(2, 2))
     meta_tile = mgrid.meta_tile((0, 0, 2))
     assert meta_tile.bbox == (-20037508.342789244, -20037508.342789244, 0.0, 0.0)
     meta_tile = mgrid.meta_tile((1, 1, 2))
     assert meta_tile.bbox == (-20037508.342789244, -20037508.342789244, 0.0, 0.0)
     meta_tile = mgrid.meta_tile((4, 5, 3))
     assert_almost_equal_bbox(meta_tile.bbox, (0.0, 0.0, 10018754.171394622, 10018754.171394622))
예제 #34
0
 def tile_mgr(self, file_cache, tile_locker):
     grid = TileGrid(SRS(4326), bbox=[-180, -90, 180, 90])
     client = MockTileClient()
     source = TiledSource(grid, client)
     image_opts = ImageOptions(format='image/png')
     return TileManager(grid, file_cache, [source], 'png',
         image_opts=image_opts,
         locker=tile_locker)
예제 #35
0
 def tile_mgr(self, mock_file_cache, tile_locker, source_base, source_overlay):
     grid = TileGrid(SRS(4326), bbox=[-180, -90, 180, 90])
     image_opts = ImageOptions(format='image/png')
     return TileManager(grid, mock_file_cache,
         [source_base, source_overlay], 'png',
         image_opts=image_opts,
         locker=tile_locker,
     )
예제 #36
0
 def tile_mgr(self, mock_file_cache, tile_locker, mock_wms_client):
     grid = TileGrid(SRS(4326), bbox=[-180, -90, 180, 90])
     source = WMSSource(mock_wms_client)
     image_opts = ImageOptions(format='image/png')
     return TileManager(grid, mock_file_cache, [source], 'png',
         meta_size=[2, 2], meta_buffer=0, image_opts=image_opts,
         locker=tile_locker,
     )
예제 #37
0
 def test_sources_with_mixed_support_for_meta_tiles(self, mock_file_cache, source_base, source_overlay, tile_locker):
     source_base.supports_meta_tiles = False
     grid = TileGrid(SRS(4326), bbox=[-180, -90, 180, 90])
     with pytest.raises(ValueError):
         TileManager(grid, file_cache,
             [source_base, source_overlay], 'png',
             meta_size=[2, 2], meta_buffer=0,
             locker=tile_locker)
예제 #38
0
 def tile_mgr(self, mock_file_cache, source_base, source_overlay, tile_locker):
     grid = TileGrid(SRS(4326), bbox=[-180, -90, 180, 90], origin='ul')
     return TileManager(grid, mock_file_cache,
         [source_base, source_overlay], 'png',
         meta_size=[2, 2], meta_buffer=0,
         locker=tile_locker,
         bulk_meta_tiles=True,
     )
예제 #39
0
파일: mapproxy.py 프로젝트: gr2m/gbi-client
 def __init__(self, db_session, srs, target_dir, couchdb_url, template_dir):
     self.db_session = db_session
     self.couchdb_url = couchdb_url
     self.service_srs = srs
     self.template_dir = template_dir
     self.sources = {}
     self.caches = {}
     self.layers = []
     self.yaml_file = os.path.join(target_dir, 'mapproxy.yaml')
     self.grid = TileGrid(SRS(3857))
예제 #40
0
class TestFixedResolutionsTileGrid(TileGridTest):
    def setup(self):
        self.res = [1000.0, 500.0, 200.0, 100.0, 50.0, 20.0, 5.0]
        bbox = (3250000, 5230000, 3930000, 6110000)
        self.grid = TileGrid(SRS(31467), bbox=bbox, res=self.res)

    def test_resolution(self):
        for level, res in enumerate(self.res):
            assert res == self.grid.resolution(level)

    def test_closest_level(self):
        assert self.grid.closest_level(2000) == 0
        assert self.grid.closest_level(1000) == 0
        assert self.grid.closest_level(950) == 0
        assert self.grid.closest_level(210) == 2

    def test_affected_tiles(self):
        req_bbox = (3250000, 5230000, 3930000, 6110000)
        self.grid.max_shrink_factor = 10
        bbox, grid_size, tiles = \
            self.grid.get_affected_tiles(req_bbox, (256, 256))
        assert bbox == (req_bbox[0], req_bbox[1],
                        req_bbox[0]+1000*256*3, req_bbox[1]+1000*256*4)
        assert grid_size == (3, 4)
        tiles = list(tiles)
        assert tiles == [(0, 3, 0), (1, 3, 0), (2, 3, 0),
                         (0, 2, 0), (1, 2, 0), (2, 2, 0),
                         (0, 1, 0), (1, 1, 0), (2, 1, 0),
                         (0, 0, 0), (1, 0, 0), (2, 0, 0),
                         ]

    def test_affected_tiles_2(self):
        req_bbox = (3250000, 5230000, 3930000, 6110000)
        self.grid.max_shrink_factor = 2.0
        try:
            bbox, grid_size, tiles = \
                self.grid.get_affected_tiles(req_bbox, (256, 256))
        except NoTiles:
            pass
        else:
            assert False, 'got no exception'
    def test_grid(self):
        for level, grid_size in [(0, (3, 4)), (1, (6, 7)), (2, (14, 18))]:
            yield self.check_grid, level, grid_size

    def test_tile_bbox(self):
        tile_bbox = self.grid.tile_bbox((0, 0, 0)) # w: 1000x256
        assert tile_bbox == (3250000.0, 5230000.0, 3506000.0, 5486000.0)
        tile_bbox = self.grid.tile_bbox((0, 0, 1)) # w: 500x256
        assert tile_bbox == (3250000.0, 5230000.0, 3378000.0, 5358000.0)
        tile_bbox = self.grid.tile_bbox((0, 0, 2)) # w: 200x256
        assert tile_bbox == (3250000.0, 5230000.0, 3301200.0, 5281200.0)
예제 #41
0
 def test_above_first_res(self):
     grid = TileGrid(res=[1000, 500, 250, 100, 50], threshold_res=[1100, 750])
     grid.stretch_factor = 1.1
     eq_(grid.closest_level(1200), 0)
     eq_(grid.closest_level(1100), 0)
     eq_(grid.closest_level(1000), 0)
     eq_(grid.closest_level(800), 0)
     eq_(grid.closest_level(750.1), 0)
     eq_(grid.closest_level(750), 1)
예제 #42
0
 def test_lower_bound(self):
     # thresholds near the next lower res value
     grid = TileGrid(res=[1000, 500, 250, 100, 50], threshold_res=[300, 110])
     grid.stretch_factor = 1.1
     eq_(grid.closest_level(1100), 0)
     # regular transition (w/stretchfactor)
     eq_(grid.closest_level(950), 0)
     eq_(grid.closest_level(800), 1)
     eq_(grid.closest_level(500), 1)
     # transition at threshold
     eq_(grid.closest_level(301), 1)
     eq_(grid.closest_level(300), 2)
     eq_(grid.closest_level(250), 2)
     # transition at threshold
     eq_(grid.closest_level(111), 2)
     eq_(grid.closest_level(110), 3)
     eq_(grid.closest_level(100), 3)
     # regular transition (w/stretchfactor)
     eq_(grid.closest_level(92), 3)
     eq_(grid.closest_level(90), 4)
예제 #43
0
 def test_upper_bound(self):
     # thresholds near the next upper res value (within threshold)
     grid = TileGrid(res=[1000, 500, 250, 100, 50], threshold_res=[495, 240])
     grid.stretch_factor = 1.1
     eq_(grid.closest_level(1100), 0)
     # regular transition (w/stretchfactor)
     eq_(grid.closest_level(950), 0)
     eq_(grid.closest_level(800), 1)
     eq_(grid.closest_level(500), 1)
     # transition at threshold
     eq_(grid.closest_level(496), 1)
     eq_(grid.closest_level(495), 2)
     eq_(grid.closest_level(250), 2)
     # transition at threshold (within strechfactor)
     eq_(grid.closest_level(241), 2)
     eq_(grid.closest_level(240), 3)
     eq_(grid.closest_level(100), 3)
     # regular transition (w/stretchfactor)
     eq_(grid.closest_level(92), 3)
     eq_(grid.closest_level(90), 4)
예제 #44
0
class TestGKTileGrid(TileGridTest):
    def setup(self):
        self.grid = TileGrid(SRS(31467), bbox=(3250000, 5230000, 3930000, 6110000))

    def test_bbox(self):
        assert self.grid.bbox == (3250000, 5230000, 3930000, 6110000)

    def test_resolution(self):
        res = self.grid.resolution(0)
        width = self.grid.bbox[2] - self.grid.bbox[0]
        height = self.grid.bbox[3] - self.grid.bbox[1]
        assert height == 880000.0 and width == 680000.0
        assert res == 880000.0/256

    def test_tile_bbox(self):
        tile_bbox = self.grid.tile_bbox((0, 0, 0))
        assert tile_bbox == (3250000.0, 5230000.0, 4130000.0, 6110000.0)

    def test_tile(self):
        x, y = 3450000, 5890000
        assert [self.grid.tile(x, y, level) for level in range(5)] == \
            [(0, 0, 0), (0, 1, 1), (0, 3, 2), (1, 6, 3), (3, 12, 4)]

    def test_grids(self):
        for level, grid_size in [(0, (1, 1)), (1, (2, 2)), (2, (4, 4)), (3, (7, 8))]:
            yield self.check_grid, level, grid_size

    def test_closest_level(self):
        assert self.grid.closest_level(880000.0/256) == 0
        assert self.grid.closest_level(600000.0/256) == 1
        assert self.grid.closest_level(440000.0/256) == 1
        assert self.grid.closest_level(420000.0/256) == 1

    def test_adjacent_tile_bbox(self):
        t1 = self.grid.tile_bbox((0, 0, 1))
        t2 = self.grid.tile_bbox((1, 0, 1))
        t3 = self.grid.tile_bbox((0, 1, 1))
        assert t1[1] == t2[1]
        assert t1[3] == t2[3]
        assert t1[2] == t2[0]
        assert t1[0] == t3[0]
        assert t1[3] == t3[1]
예제 #45
0
 def setup(self):
     self.grid = TileGrid(SRS(31467),
         bbox=[420000,30000,900000,350000], origin='ul',
         res=[4000,3750,3500,3250,3000,2750,2500,2250,2000,1750,1500,1250,1000,750,650,500,250,100,50,20,10,5,2.5,2,1.5,1,0.5],
     )
예제 #46
0
 def setup(self):
     self.grid = TileGrid(SRS(31467),
         bbox=(3300000, 5300000, 3900000, 6000000), origin='ul',
         res=[1500, 1000, 500, 300, 150, 100])
예제 #47
0
class TestGKTileGridUL(TileGridTest):
    """
    Custom grid with ul origin.
    """
    def setup(self):
        self.grid = TileGrid(SRS(31467),
            bbox=(3300000, 5300000, 3900000, 6000000), origin='ul',
            res=[1500, 1000, 500, 300, 150, 100])

    def test_bbox(self):
        assert self.grid.bbox == (3300000, 5300000, 3900000, 6000000)

    def test_tile_bbox(self):
        eq_(self.grid.tile_bbox((0, 0, 0)),
            (3300000.0, 5616000.0, 3684000.0, 6000000.0))
        eq_(self.grid.tile_bbox((1, 0, 0)),
            (3684000.0, 5616000.0, 4068000.0, 6000000.0))
        eq_(self.grid.tile_bbox((1, 1, 0)),
            (3684000.0, 5232000.0, 4068000.0, 5616000.0))

    def test_tile(self):
        x, y = 3310000, 5990000
        eq_(self.grid.tile(x, y, 0), (0, 0, 0))
        eq_(self.grid.tile(x, y, 1), (0, 0, 1))
        eq_(self.grid.tile(x, y, 2), (0, 0, 2))

        x, y = 3890000, 5310000
        eq_(self.grid.tile(x, y, 0), (1, 1, 0))
        eq_(self.grid.tile(x, y, 1), (2, 2, 1))
        eq_(self.grid.tile(x, y, 2), (4, 5, 2))

    def test_grids(self):
        assert_grid_size(self.grid, 0, (2, 2))
        assert_grid_size(self.grid, 1, (3, 3))
        assert_grid_size(self.grid, 2, (5, 6))

    def test_closest_level(self):
        assert self.grid.closest_level(1500) == 0
        assert self.grid.closest_level(1000) == 1
        assert self.grid.closest_level(900) == 1
        assert self.grid.closest_level(600) == 2

    def test_adjacent_tile_bbox(self):
        t1 = self.grid.tile_bbox((0, 0, 1))
        t2 = self.grid.tile_bbox((1, 0, 1))
        t3 = self.grid.tile_bbox((0, 1, 1))
        assert t1[1] == t2[1]
        assert t1[3] == t2[3]
        assert t1[2] == t2[0]
        assert t1[0] == t3[0]
        assert t1[1] == t3[3]
예제 #48
0
 def test_sqrt_grid(self):
     grid = TileGrid(is_geodetic=True, res='sqrt2', tile_size=(360, 180))
     eq_(grid.resolution(0), 1.0)
     assert_almost_equal(grid.resolution(2), 0.5)
     assert_almost_equal(grid.resolution(4), 0.25)
예제 #49
0
 def setup(self):
     self.res = [1000.0, 500.0, 200.0, 100.0, 50.0, 20.0, 5.0]
     bbox = (3250000, 5230000, 3930000, 6110000)
     self.grid = TileGrid(SRS(31467), bbox=bbox, res=self.res)
예제 #50
0
 def setup(self):
     self.grid = TileGrid(4326, bbox=(-180, -90, 180, 90), origin='ul')
예제 #51
0
class TestWGS83TileGridUL(object):
    def setup(self):
        self.grid = TileGrid(4326, bbox=(-180, -90, 180, 90), origin='ul')

    def test_resolution(self):
        assert_almost_equal(self.grid.resolution(0), 1.40625)
        assert_almost_equal(self.grid.resolution(1), 1.40625/2)

    def test_bbox(self):
        eq_(self.grid.bbox, (-180.0, -90.0, 180.0, 90.0))

    def test_tile_bbox(self):
        eq_(self.grid.tile_bbox((0, 0, 0)), (-180.0, -270.0, 180.0, 90.0))
        eq_(self.grid.tile_bbox((0, 0, 0), limit=True), (-180.0, -90.0, 180.0, 90.0))
        eq_(self.grid.tile_bbox((0, 0, 1)), (-180.0, -90.0, 0.0, 90.0))

    def test_tile(self):
        eq_(self.grid.tile(-170, -80, 0), (0, 0, 0))
        eq_(self.grid.tile(-170, -80, 1), (0, 0, 1))
        eq_(self.grid.tile(-170, -80, 2), (0, 1, 2))

    def test_grid_size(self):
        eq_(self.grid.grid_sizes[0], (1, 1))
        eq_(self.grid.grid_sizes[1], (2, 1))
        eq_(self.grid.grid_sizes[2], (4, 2))

    def test_affected_tiles(self):
        bbox, grid, tiles = self.grid.get_affected_tiles((-180,-90,180,90), (512,256))
        eq_(bbox, (-180.0, -90.0, 180.0, 90.0))
        eq_(grid, (2, 1))
        eq_(list(tiles), [(0, 0, 1), (1, 0, 1)])

        bbox, grid, tiles = self.grid.get_affected_tiles((-180,-90,0,90), (512, 512))
        eq_(bbox, (-180.0, -90.0, 0.0, 90.0))
        eq_(grid, (2, 2))
        eq_(list(tiles), [(0, 0, 2), (1, 0, 2), (0, 1, 2), (1, 1, 2)])

    def test_affected_level_tiles(self):
        bbox, grid, tiles = self.grid.get_affected_level_tiles((-180,-90,180,90), 1)
        eq_(grid, (2, 1))
        eq_(bbox, (-180.0, -90.0, 180.0, 90.0))
        eq_(list(tiles), [(0, 0, 1), (1, 0, 1)])
        bbox, grid, tiles = self.grid.get_affected_level_tiles((0,0,180,90), 2)
        eq_(grid, (2, 1))
        eq_(list(tiles), [(2, 0, 2), (3, 0, 2)])
        eq_(bbox, (0.0, 0.0, 180.0, 90.0))
        bbox, grid, tiles = self.grid.get_affected_level_tiles((0,-90,180,90), 2)
        eq_(grid, (2, 2))
        eq_(list(tiles), [(2, 0, 2), (3, 0, 2), (2, 1, 2), (3, 1, 2)])
        eq_(bbox, (0.0, -90.0, 180.0, 90.0))
예제 #52
0
 def setup(self):
     self.grid = TileGrid(is_geodetic=True, )
예제 #53
0
 def test_auto_resolution(self):
     grid = TileGrid(is_geodetic=True, bbox=(-10, 30, 10, 40), tile_size=(20, 20))
     tile_bbox = grid.tile_bbox((0, 0, 0))
     assert tile_bbox == (-10, 30, 10, 50)
     assert grid.resolution(0) == 1.0
예제 #54
0
파일: mapproxy.py 프로젝트: gr2m/gbi-client
class MapProxyConfiguration(object):
    def __init__(self, db_session, srs, target_dir, couchdb_url, template_dir):
        self.db_session = db_session
        self.couchdb_url = couchdb_url
        self.service_srs = srs
        self.template_dir = template_dir
        self.sources = {}
        self.caches = {}
        self.layers = []
        self.yaml_file = os.path.join(target_dir, 'mapproxy.yaml')
        self.grid = TileGrid(SRS(3857))

    def _load_sources(self):
        local_sources = self.db_session.query(LocalWMTSSource).all()
        for local_source in local_sources:
            wmts_source = local_source.wmts_source
            self.sources[wmts_source.name + '_source'] = {
                'type': 'wms',
                'req': {
                    'url': 'http://dummy.example.org/service?'
                },
                'seed_only': True,
                'coverage': {
                    'srs': 'EPSG:3857',
                    'bbox': list(coverage_from_geojson(wmts_source.download_coverage).bbox)
                }

            }
            self.caches[wmts_source.name + '_cache'] = {
                'sources': [wmts_source.name + '_source'],
                'grids': [wmts_source.matrix_set],
                'cache': {
                    'type': 'couchdb',
                    'url': '%s' % self.couchdb_url,
                    'db_name': wmts_source.name,
                    'tile_metadata': {
                        'tile_col': '{{x}}',
                        'tile_row': '{{y}}',
                        'tile_level': '{{z}}',
                        'created_ts': '{{timestamp}}',
                        'created': '{{utc_iso}}',
                        'center': '{{wgs_tile_centroid}}'
                    }
                }
            }
            self.layers.append({
                'name': wmts_source.name + '_layer',
                'title': wmts_source.title,
                'sources': [wmts_source.name + '_cache'],
                'min_res': self.grid.resolution(local_source.download_level_start),
                # increase max_res to allow a bit of oversampling
                'max_res': self.grid.resolution(local_source.download_level_end) / 2,
            })

    def _write_mapproxy_yaml(self):
        grids = {
            'GoogleMapsCompatible': {
                'base': 'GLOBAL_MERCATOR',
                'srs': 'EPSG:3857',
                'num_levels': 19,
                'origin': 'nw'
            }
        }

        services = {
            'demo': None,
            'wmts': None,
            'wms': {
                'srs': self.service_srs,
                'md': {'title': 'Geobox WMS'}
            },
        }

        globals_ = {
            'image': {
                'paletted': True,
            },
            'cache': {
                'meta_size': [8, 8],
                'meta_buffer': 50,
            },
            'http': {
                'client_timeout': 120,
            },
        }
        if self.template_dir:
            globals_['template_dir'] = self.template_dir

        config = {}

        if globals_: config['globals'] = globals_
        if grids: config['grids'] = grids
        if self.layers:
            config['layers'] = self.layers
            config['services'] = services
        if self.caches: config['caches'] = self.caches
        if self.sources: config['sources'] = self.sources


        # safe_dump does not output !!python/unicode, etc.
        mapproxy_yaml = yaml.safe_dump(config, default_flow_style=False)
        f = open(self.yaml_file, 'w')
        f.write(mapproxy_yaml)
        f.close()
        log.info('Mapproxy configuration written to %s', self.yaml_file)
예제 #55
0
 def test_factor_grid(self):
     grid = TileGrid(is_geodetic=True, res=1/0.75, tile_size=(360, 180))
     eq_(grid.resolution(0), 1.0)
     eq_(grid.resolution(1), 0.75)
     eq_(grid.resolution(2), 0.75*0.75)
예제 #56
0
 def setup(self):
     self.grid = TileGrid(SRS(31467), bbox=(3250000, 5230000, 3930000, 6110000))
예제 #57
0
 def test_tile_out_of_grid_bounds(self):
     grid = TileGrid(is_geodetic=True)
     eq_(grid.tile(-180.01, 50, 1), (-1, 0, 1))
예제 #58
0
class MapProxyConfiguration(object):
    def __init__(self, srs, target_dir):
        self.service_srs = srs
        self.sources = {}
        self.caches = {}
        self.layers = []
        self.yaml_file = os.path.join(target_dir, 'mapproxy.yaml')
        self.grid = TileGrid(SRS(3857))

    def _load_sources(self):
        public_wmts = db.session.query(WMTS, ST_Transform(WMTS.view_coverage, 3857)).filter_by(is_public=True).group_by(WMTS).all()

        for wmts, view_coverage in public_wmts:
            self.sources['%s_source' % wmts.name] = {
                'type': 'tile',
                'url': wmts.url,
                'grid': 'GoogleMapsCompatible',
                'coverage': {
                    'srs': 'EPSG:3857',
                    'bbox': list(to_shape(view_coverage).bounds)
                }
            }
            self.caches['%s_cache' % wmts.name] = {
                'sources': ['%s_source' % wmts.name],
                'grids': ['GoogleMapsCompatible'],
                'disable_storage': True
            }
            self.layers.append({
                'name': '%s_layer' % wmts.name,
                'title': wmts.title,
                'sources': ['%s_cache' % wmts.name],
                'min_res': self.grid.resolution(wmts.view_level_start),
                # increase max_res to allow a bit of oversampling
                'max_res': self.grid.resolution(wmts.view_level_end) / 2,
            })

    def _write_mapproxy_yaml(self):
        grids = {
            'GoogleMapsCompatible': {
                'base': 'GLOBAL_MERCATOR',
                'srs': 'EPSG:3857',
                'num_levels': 20,
                'origin': 'nw'
            }
        }

        services = {
            'demo': None,
            'wms': {
                'srs': self.service_srs,
                'md': {'title': _('external_wms_title')}
            },
        }

        globals_ = {
            'image': {
                'paletted': True,
            },
            'cache': {
                'meta_size': [8, 8],
                'meta_buffer': 50,
            },
            'http': {
                'client_timeout': 120,
            },
        }

        config = {}

        if globals_: config['globals'] = globals_
        if grids: config['grids'] = grids
        if self.layers:
            config['layers'] = self.layers
            config['services'] = services
        if self.caches: config['caches'] = self.caches
        if self.sources: config['sources'] = self.sources


        # safe_dump does not output !!python/unicode, etc.
        mapproxy_yaml = yaml.safe_dump(config, default_flow_style=False)
        f = open(self.yaml_file, 'w')
        f.write(mapproxy_yaml)
        f.close()