def test_tilecoord(self): self.assertEqual(self.ftg.tilecoord(1, 428000, 336000), TileCoord(1, 4, 7)) self.assertEqual(self.ftg.tilecoord(1, 430000, 334000), TileCoord(1, 5, 8)) self.assertEqual(self.ftg.tilecoord(1, 432000, 332000), TileCoord(1, 6, 9))
def test_get(self): image = Image.new('RGBA', (8, 8)) image.paste((255, 0, 0, 0), (0, 0, 4, 4)) image.paste((0, 255, 0, 0), (0, 4, 4, 8)) image.paste((0, 0, 255, 0), (4, 0, 8, 4)) image.paste((0, 0, 0, 255), (4, 4, 8, 8)) string_io = StringIO() image.save(string_io, 'PNG') tile = Tile(TileCoord(1, 0, 0, 2), data=string_io.getvalue()) tiles = list(self.mtsts.get([tile])) self.assertEqual(len(tiles), 4) self.assertEqual(tiles[0].tilecoord, TileCoord(1, 0, 0)) image = Image.open(StringIO(tiles[0].data)) self.assertEqual(image.size, (2, 2)) self.assertEqual(image.getcolors(), [(4, (255, 0, 0, 0))]) self.assertEqual(tiles[1].tilecoord, TileCoord(1, 0, 1)) image = Image.open(StringIO(tiles[1].data)) self.assertEqual(image.size, (2, 2)) self.assertEqual(image.getcolors(), [(4, (0, 255, 0, 0))]) self.assertEqual(tiles[2].tilecoord, TileCoord(1, 1, 0)) image = Image.open(StringIO(tiles[2].data)) self.assertEqual(image.size, (2, 2)) self.assertEqual(image.getcolors(), [(4, (0, 0, 255, 0))]) self.assertEqual(tiles[3].tilecoord, TileCoord(1, 1, 1)) image = Image.open(StringIO(tiles[3].data)) self.assertEqual(image.size, (2, 2)) self.assertEqual(image.getcolors(), [(4, (0, 0, 0, 255))])
def test_children_root(self): self.assertEqual(sorted(self.qtg.children(TileCoord(0, 0, 0))), [ TileCoord(1, 0, 0), TileCoord(1, 0, 1), TileCoord(1, 1, 0), TileCoord(1, 1, 1) ])
def test_children(self): self.assertEqual(sorted(self.qtg.children(TileCoord(1, 2, 3))), [ TileCoord(2, 4, 6), TileCoord(2, 4, 7), TileCoord(2, 5, 6), TileCoord(2, 5, 7) ])
def test_iter(self): tilecoords = iter(TileCoord(3, 4, 6, 2)) self.assertEqual(TileCoord(3, 4, 6), next(tilecoords)) self.assertEqual(TileCoord(3, 4, 7), next(tilecoords)) self.assertEqual(TileCoord(3, 5, 6), next(tilecoords)) self.assertEqual(TileCoord(3, 5, 7), next(tilecoords)) self.assertRaises(StopIteration, next, tilecoords)
def test_filename(self): self.assertEqual(self.rest.filename(TileCoord(1, 2, 3)), 'test/1.0.0/layer/default/2011/swissgrid/1/3/2.png') self.assertEqual( self.kvp.filename(TileCoord(1, 2, 3)), 'test?Service=WMTS&Request=GetTile&Format=.png&Version=1.0.0&Layer=layer&Style=default&DATE=2011&TileMatrixSet=swissgrid&TileMatrix=1&TileRow=3&TileCol=2' )
def test_init_boundingpyramid(self): ts = TileStore( bounding_pyramid=BoundingPyramid.from_string('1/0/0:1/1')) self.assertTrue(Tile(TileCoord(1, 0, 0)) in ts) tiles = list(ts.list()) self.assertEqual(len(tiles), 1) self.assertEqual(tiles[0].tilecoord, TileCoord(1, 0, 0))
def test_filename_without_url(self): # s3 url it shouldn't starts with a / self.assertEqual(self.rest_nourl.filename(TileCoord(1, 2, 3)), '1.0.0/layer/default/2011/swissgrid/1/3/2.png') self.assertEqual( self.kvp_nourl.filename(TileCoord(1, 2, 3)), '?Service=WMTS&Request=GetTile&Format=.png&Version=1.0.0&Layer=layer&Style=default&DATE=2011&TileMatrixSet=swissgrid&TileMatrix=1&TileRow=3&TileCol=2' )
def test_extent_z1(self): self.assertEqual(self.qtg.extent(TileCoord(1, 0, 0)), (0.0, 2.0, 1.0, 3.0)) self.assertEqual(self.qtg.extent(TileCoord(1, 0, 1)), (0.0, 1.0, 1.0, 2.0)) self.assertEqual(self.qtg.extent(TileCoord(1, 1, 0)), (1.0, 2.0, 2.0, 3.0)) self.assertEqual(self.qtg.extent(TileCoord(1, 1, 1)), (1.0, 1.0, 2.0, 2.0))
def test_extent_z2(self): self.assertEqual(self.qtg.extent(TileCoord(2, 0, 0)), (0.0, 2.5, 0.5, 3.0)) self.assertEqual(self.qtg.extent(TileCoord(2, 1, 1)), (0.5, 2.0, 1.0, 2.5)) self.assertEqual(self.qtg.extent(TileCoord(2, 2, 2)), (1.0, 1.5, 1.5, 2.0)) self.assertEqual(self.qtg.extent(TileCoord(2, 3, 3)), (1.5, 1.0, 2.0, 1.5))
def children(self, tilecoord): if self.max_zoom is None or tilecoord.z < self.max_zoom: yield TileCoord(tilecoord.z + 1, 2 * tilecoord.x, 2 * tilecoord.y) yield TileCoord(tilecoord.z + 1, 2 * tilecoord.x + 1, 2 * tilecoord.y) yield TileCoord(tilecoord.z + 1, 2 * tilecoord.x, 2 * tilecoord.y + 1) yield TileCoord(tilecoord.z + 1, 2 * tilecoord.x + 1, 2 * tilecoord.y + 1)
def test_itertopdown(self): bp = BoundingPyramid() bp.add(TileCoord(2, 1, 3)) bp.fill_up(0) self.assertEqual( list(bp.itertopdown()), [TileCoord(0, 0, 0), TileCoord(1, 0, 1), TileCoord(2, 1, 3)])
def test_metatilecoords(self): bp = BoundingPyramid.full(1, 2) metatilecoords = bp.metatilecoords(2) self.assertEqual(TileCoord(1, 0, 0, 2), next(metatilecoords)) self.assertEqual(TileCoord(2, 0, 0, 2), next(metatilecoords)) self.assertEqual(TileCoord(2, 0, 2, 2), next(metatilecoords)) self.assertEqual(TileCoord(2, 2, 0, 2), next(metatilecoords)) self.assertEqual(TileCoord(2, 2, 2, 2), next(metatilecoords)) self.assertRaises(StopIteration, next, metatilecoords)
def test_metadata(self): tilestore = MBTilesTileStore(sqlite3.connect(':memory:')) tilestore.put_one(Tile(TileCoord(1, 0, 0))) tilestore.put_one(Tile(TileCoord(2, 0, 0))) tilestore.set_metadata_zooms() self.assertEqual(int(tilestore.metadata['minzoom']), 1) self.assertEqual(int(tilestore.metadata['maxzoom']), 2) self.assertEqual(sorted(tilestore.metadata.itervalues()), ['1', '2']) self.assertEqual(sorted(tilestore.metadata.keys()), ['maxzoom', 'minzoom'])
def test_extent_border(self): self.assertEqual(self.ftg.extent(TileCoord(0, 0, 0), 50), (419999.5, 349998.5, 420001.5, 350000.5)) self.assertEqual(self.ftg.extent(TileCoord(1, 0, 0), 100), (419999.5, 349999, 420001, 350000.5)) self.assertEqual(self.ftg2.extent(TileCoord(0, 0, 0), 50), (419990.0, 349938.8, 420061.2, 350010)) self.assertEqual(self.ftg2.extent(TileCoord(1, 0, 0), 50), (419995, 349969.4, 420030.6, 350005))
def test_extent(self): self.assertEqual(self.ftg.extent(TileCoord(0, 0, 0)), (420000, 349999, 420001, 350000)) self.assertEqual(self.ftg.extent(TileCoord(1, 0, 0)), (420000, 349999.5, 420000.5, 350000)) self.assertEqual(self.ftg2.extent(TileCoord(0, 0, 0)), (420000, 349948.8, 420051.2, 350000)) self.assertEqual(self.ftg2.extent(TileCoord(1, 0, 0)), (420000, 349974.4, 420025.6, 350000))
def list(self): for x in xrange(0, self.width): for y in xrange(0, self.height): if self.pixels[x, y]: yield Tile( TileCoord(self.z, self.xbounds.start + x, self.ybounds.stop - y - 1))
def test_png(self): layout = WMSTileLayout(url='http://example.com/folder', layers='l1,l2', srs='EPSG:1000', format='image/png', tilegrid=self.tilegrid) result = urlparse(layout.filename(TileCoord(0, 0, 0))) self.assertEqual(result.netloc, 'example.com') self.assertEqual(result.path, '/folder') query = parse_qs(result.query) self.assertEqual(query['LAYERS'], ['l1,l2']) self.assertEqual(query['FORMAT'], ['image/png']) self.assertEqual(query['TRANSPARENT'], ['TRUE']) self.assertEqual(query['SERVICE'], ['WMS']) self.assertEqual(query['VERSION'], ['1.1.1']) self.assertEqual(query['REQUEST'], ['GetMap']) self.assertEqual(query['SRS'], ['EPSG:1000']) self.assertEqual(query['WIDTH'], ['100']) self.assertEqual(query['HEIGHT'], ['100']) bbox = [float(i) for i in query['BBOX'][0].split(',')] self.assertEqual(len(bbox), 4) self.assertEqual(bbox[0], 420000.0) self.assertEqual(bbox[1], 340000.0) self.assertEqual(bbox[2], 430000.0) self.assertEqual(bbox[3], 350000.0)
def test_extent(self): for z in xrange(0, 4): for x in xrange(0, 1 << z): for y in xrange(0, 1 << z): tilecoord = TileCoord(z, x, y) self.assertEqual(self.ftg.extent(tilecoord), self.qtg.extent(tilecoord))
def test_flip_y(self): self.assertEqual(self.qtsn.extent(TileCoord(2, 0, 0)), self.qtsf.extent(TileCoord(2, 0, 3))) self.assertEqual(self.qtsn.extent(TileCoord(2, 1, 1)), self.qtsf.extent(TileCoord(2, 1, 2))) self.assertEqual(self.qtsn.extent(TileCoord(2, 2, 2)), self.qtsf.extent(TileCoord(2, 2, 1))) self.assertEqual(self.qtsn.extent(TileCoord(2, 3, 3)), self.qtsf.extent(TileCoord(2, 3, 0)))
def tilecoord(self, z, x, y): tilecoord_x = int((x - self.max_extent[0]) * (1 << z) / (self.max_extent[2] - self.max_extent[0])) tilecoord_y = int((y - self.max_extent[1]) * (1 << z) / (self.max_extent[3] - self.max_extent[1])) if not self.flip_y: tilecoord_y = (1 << z) - tilecoord_y - 1 return TileCoord(z, tilecoord_x, tilecoord_y)
def popleft(self): sqs_message = self.queue.read(self.visibility_timeout) if sqs_message is None: return self.on_empty() z = sqs_message.get('z') x = sqs_message.get('x') y = sqs_message.get('y') return Tile(TileCoord(z, x, y), sqs_message=sqs_message)
def test(self): tilestore = NullTileStore() tile = Tile(TileCoord(0, 0, 0)) self.assertFalse(tile in tilestore) self.assertEqual(list(tilestore.delete([tile])), [tile]) self.assertEqual(list(tilestore.list()), []) self.assertEqual(list(tilestore.get([tile])), [tile]) self.assertEqual(list(tilestore.put([tile])), [tile])
def test_tilecoord(self): for z in xrange(0, 4): for x in xrange(0, 1 << z): for y in xrange(0, 1 << z): tilecoord = TileCoord(z, x, y) minx, miny, maxx, maxy = self.qtg.extent(tilecoord) self.assertEqual(self.qtg.tilecoord(z, minx, miny), tilecoord)
def test_empty(self): ts = TileStore() self.assertEqual(ts.bounding_pyramid, None) self.assertEqual(ts.content_type, None) self.assertEqual(len(ts), 0) self.assertRaises(NotImplementedError, next, ts.delete((Tile(TileCoord(0, 0, 0)), ))) self.assertRaises(NotImplementedError, ts.delete_one, None) self.assertEqual(ts.get_cheap_bounding_pyramid(), None) self.assertRaises(NotImplementedError, next, ts.get((Tile(TileCoord(0, 0, 0)), ))) self.assertEqual(list(ts.get_all()), []) self.assertRaises(NotImplementedError, ts.get_one, None) self.assertEqual(list(ts.list()), []) self.assertRaises(NotImplementedError, next, ts.put((Tile(TileCoord(0, 0, 0)), ))) self.assertRaises(NotImplementedError, ts.put_one, None) self.assertFalse(None in ts) self.assertEqual(ts.get_bounding_pyramid(), BoundingPyramid())
def test_add(self): bp = BoundingPyramid() bp.add(TileCoord(1, 0, 0)) self.assertEqual(len(bp), 1) self.assertTrue(TileCoord(1, 0, 0) in bp) self.assertFalse(TileCoord(1, 0, 1) in bp) self.assertFalse(TileCoord(1, 1, 0) in bp) self.assertFalse(TileCoord(1, 1, 1) in bp) self.assertEqual(list(bp), [TileCoord(1, 0, 0)])
def test_tilecoord(self): self.assertEqual(self.ftg.tilecoord(1, 428000, 336000), TileCoord(1, 4, 7)) self.assertEqual(self.ftg.tilecoord(1, 428000.1, 336000.1), TileCoord(1, 4, 6)) self.assertEqual(self.ftg.tilecoord(1, 429999.9, 337999.9), TileCoord(1, 4, 6)) self.assertEqual(self.ftg.tilecoord(1, 430000, 338000), TileCoord(1, 5, 6)) self.assertEqual(self.ftg.tilecoord(1, 430000, 334000), TileCoord(1, 5, 8)) self.assertEqual(self.ftg.tilecoord(1, 431000, 335000), TileCoord(1, 5, 7)) self.assertEqual(self.ftg.tilecoord(1, 432000, 336000), TileCoord(1, 6, 7)) self.assertEqual(self.ftg.tilecoord(1, 432000, 333000), TileCoord(1, 6, 8))
def test_extent(self): self.assertEqual(self.ftg.extent(TileCoord(0, 0, 0)), (420000, 275000, 495000, 350000)) self.assertEqual(self.ftg.extent(TileCoord(1, 0, 0)), (420000, 348000, 422000, 350000)) self.assertEqual(self.ftg.extent(TileCoord(2, 0, 0)), (420000, 349000, 421000, 350000)) self.assertEqual(self.ftg.extent(TileCoord(3, 0, 0)), (420000, 349500, 420500, 350000)) self.assertEqual(self.ftg.extent(TileCoord(1, 4, 6)), (428000, 336000, 430000, 338000)) self.assertEqual(self.ftg.extent(TileCoord(1, 5, 7)), (430000, 334000, 432000, 336000))
def test_tilecoord(self): self.assertEqual(self.ftg.tilecoord(0, 420000.75, 349999.25), TileCoord(0, 0, 0)) self.assertEqual(self.ftg.tilecoord(1, 420000.25, 349999.75), TileCoord(1, 0, 0)) self.assertEqual(self.ftg2.tilecoord(0, 420000.01, 349999.99), TileCoord(0, 0, 0)) self.assertEqual(self.ftg2.tilecoord(0, 420010, 349990), TileCoord(0, 0, 0)) self.assertEqual(self.ftg2.tilecoord(0, 420051.19, 349948.81), TileCoord(0, 0, 0)) self.assertEqual(self.ftg2.tilecoord(0, 420051.21, 349948.79), TileCoord(0, 1, 1))
def list(self): while True: try: sqs_message = self.queue.read() if sqs_message is None: try: self.on_empty(self.queue) except StopIteration: break else: z = sqs_message.get('z') x = sqs_message.get('x') y = sqs_message.get('y') n = sqs_message.get('n') # FIXME deserialize other attributes tile = Tile(TileCoord(z, x, y, n), sqs_message=sqs_message) yield tile except SQSDecodeError as e: logger.warning(str(e)) sqs_message.delete()
def test_from_string(self): self.assertEqual(TileCoord.from_string('1/2/3'), TileCoord(1, 2, 3))
def test_from_string_metatile(self): self.assertEqual(TileCoord.from_string('1/2/3:+2/+2'), TileCoord(1, 2, 3, 2))
def test_from_tuple(self): self.assertEqual(TileCoord.from_tuple((1, 2, 3)), TileCoord(1, 2, 3))
def get_all(self): for key, data in self.db.items(): tile = Tile(TileCoord.from_string(key), content_type=self.content_type, data=data) yield tile
def list(self): return imap(lambda s: Tile(TileCoord.from_string(s)), self.db.iterkeys())