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