Coverage for gws-app/gws/plugin/tile_layer/layer.py: 0%
55 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-16 23:09 +0200
« prev ^ index » next coverage.py v7.11.0, created at 2025-10-16 23:09 +0200
1"""Tile layer."""
3import gws
4import gws.base.layer
5import gws.config.util
6import gws.lib.bounds
7import gws.lib.crs
8import gws.gis.zoom
9from . import provider
11gws.ext.new.layer('tile')
14class Config(gws.base.layer.Config):
15 """Tile layer"""
17 provider: provider.Config
18 """Tile service provider."""
19 display: gws.LayerDisplayMode = gws.LayerDisplayMode.tile
20 """Layer display mode."""
23_GRID_DEFAULTS = gws.TileGrid(
24 bounds=gws.Bounds(
25 crs=gws.lib.crs.WEBMERCATOR,
26 extent=gws.lib.crs.WEBMERCATOR_SQUARE,
27 ),
28 origin=gws.Origin.nw,
29 tileSize=256,
30)
33class Object(gws.base.layer.image.Object):
34 serviceProvider: provider.Object
36 def configure(self):
37 self.configure_layer()
39 def configure_provider(self):
40 return gws.config.util.configure_service_provider_for(self, provider.Object)
42 #
43 # reprojecting the world doesn't make sense, just use the map extent here
44 # see also ows_provider/wmts
45 #
46 # def configure_bounds(self):
47 # if super().configure_bounds():
48 # return True
49 # self.bounds = gws.lib.bounds.transform(self.serviceProvider.grid.bounds, self.mapCrs)
50 # return True
52 def configure_grid(self):
53 p = self.cfg('grid', default=gws.Config())
55 self.grid = gws.TileGrid(
56 origin=p.origin or gws.Origin.nw,
57 tileSize=p.tileSize or 256,
58 )
60 if p.extent:
61 extent = p.extent
62 elif self.bounds.crs == self.serviceProvider.grid.bounds.crs:
63 extent = self.serviceProvider.grid.bounds.extent
64 else:
65 extent = self.parentBounds.extent
66 self.grid.bounds = gws.Bounds(crs=self.bounds.crs, extent=extent)
68 if p.resolutions:
69 self.grid.resolutions = p.resolutions
70 else:
71 self.grid.resolutions = gws.gis.zoom.resolutions_from_bounds(self.grid.bounds, self.grid.tileSize)
73 def mapproxy_config(self, mc, options=None):
74 if self.displayMode == gws.LayerDisplayMode.client:
75 return
77 # we use {x} like in Ol, mapproxy wants %(x)s
78 url = self.serviceProvider.url
79 url = url.replace('{x}', '%(x)s')
80 url = url.replace('{y}', '%(y)s')
81 url = url.replace('{z}', '%(z)s')
83 sg = self.serviceProvider.grid
85 if sg.origin == gws.Origin.nw:
86 origin = 'nw'
87 elif sg.origin == gws.Origin.sw:
88 origin = 'sw'
89 else:
90 raise gws.Error(f'invalid grid origin {sg.origin!r}')
92 back_grid_uid = mc.grid(gws.u.compact({
93 'origin': origin,
94 'srs': sg.bounds.crs.epsg,
95 'bbox': sg.bounds.extent,
96 'res': sg.resolutions,
97 'tile_size': [sg.tileSize, sg.tileSize],
98 }))
100 src_uid = gws.base.layer.util.mapproxy_back_cache_config(self, mc, url, back_grid_uid)
101 gws.base.layer.util.mapproxy_layer_config(self, mc, src_uid)
103 ##
105 def props(self, user):
106 p = super().props(user)
107 if self.displayMode == gws.LayerDisplayMode.client:
108 return gws.u.merge(p, type='xyz', url=self.serviceProvider.url)
109 return p
111 def render(self, lri):
112 return gws.base.layer.util.mpx_raster_render(self, lri)