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

1"""Tile layer.""" 

2 

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 

10 

11gws.ext.new.layer('tile') 

12 

13 

14class Config(gws.base.layer.Config): 

15 """Tile layer""" 

16 

17 provider: provider.Config 

18 """Tile service provider.""" 

19 display: gws.LayerDisplayMode = gws.LayerDisplayMode.tile 

20 """Layer display mode.""" 

21 

22 

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) 

31 

32 

33class Object(gws.base.layer.image.Object): 

34 serviceProvider: provider.Object 

35 

36 def configure(self): 

37 self.configure_layer() 

38 

39 def configure_provider(self): 

40 return gws.config.util.configure_service_provider_for(self, provider.Object) 

41 

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 

51 

52 def configure_grid(self): 

53 p = self.cfg('grid', default=gws.Config()) 

54 

55 self.grid = gws.TileGrid( 

56 origin=p.origin or gws.Origin.nw, 

57 tileSize=p.tileSize or 256, 

58 ) 

59 

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) 

67 

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) 

72 

73 def mapproxy_config(self, mc, options=None): 

74 if self.displayMode == gws.LayerDisplayMode.client: 

75 return 

76 

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') 

82 

83 sg = self.serviceProvider.grid 

84 

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}') 

91 

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 })) 

99 

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) 

102 

103 ## 

104 

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 

110 

111 def render(self, lri): 

112 return gws.base.layer.util.mpx_raster_render(self, lri)