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

1"""Tile layer.""" 

2 

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 

10 

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

12 

13 

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""" 

20 

21 

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) 

30 

31 

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

33 serviceProvider: provider.Object 

34 

35 def configure(self): 

36 self.configure_layer() 

37 

38 def configure_provider(self): 

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

40 

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 

50 

51 def configure_grid(self): 

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

53 

54 self.grid = gws.TileGrid( 

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

56 tileSize=p.tileSize or 256, 

57 ) 

58 

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) 

66 

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) 

71 

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

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

74 return 

75 

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

81 

82 sg = self.serviceProvider.grid 

83 

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

90 

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

98 

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) 

101 

102 ## 

103 

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 

109 

110 def render(self, lri): 

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