Coverage for gws-app/gws/plugin/tile_layer/layer.py: 0%
38 statements
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-05 13:35 +0200
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-05 13:35 +0200
1"""The ``tile`` layer."""
3from typing import Optional
5import gws
6import gws.base.layer
7import gws.config.util
8import gws.lib.bounds
9import gws.lib.extent
10from . import grabber, provider
13@gws.ext.config.layer('tile')
14class Config(gws.base.layer.Config):
15 """Layer that shows tiles from an XYZ tile service."""
17 provider: provider.Config
18 """Tile service the layer is loaded from."""
19 display: gws.LayerDisplayMode = gws.LayerDisplayMode.tile
20 """The way the layer is rendered in the client."""
23@gws.ext.object.layer('tile')
24class Object(gws.base.layer.image.Object):
25 """Image layer that shows tiles from an XYZ tile service."""
27 provider: provider.Object
28 """Tile provider."""
30 canRenderInClient = True
32 def configure(self):
33 self.configure_layer()
35 def create_cache_name(self, cache):
36 return gws.u.sha256([
37 self.provider.cache_hash(),
38 vars(self.imageFormat),
39 list(self.wgsExtent),
40 cache.requestBuffer,
41 cache.requestTiles,
42 ])[: gws.base.layer.image.CACHE_NAME_LENGTH]
44 def create_grabber(self, opts):
45 return grabber.Object(opts, provider=self.provider)
47 def configure_provider(self):
48 return gws.config.util.configure_provider_for(self, provider.Object)
50 def configure_extent(self):
51 if super().configure_extent():
52 return True
53 grid = self.provider.grid
54 ext = gws.lib.extent.transform_to_wgs(grid.extent, grid.crs)
55 if gws.lib.extent.is_valid_wgs(ext):
56 self.wgsExtent = grid.crs.clip_wgs_extent(ext) or grid.crs.wgsMaxExtent
57 else:
58 self.wgsExtent = grid.crs.wgsMaxExtent
59 return True
61 ##
63 def props(self, user):
64 p = super().props(user)
65 if self.displayMode == gws.LayerDisplayMode.client:
66 return gws.u.merge(p, type='xyz', url=self.provider.url)
67 return p