def OnListSelChanged(self, event): """Update widgets according to selected layer in list. """ curr_sel_ls = self.list.GetSelectedLayers() # update self.sel_layers (selected layer list) if 'WMS' in self.ws: for sel_l in self.sel_layers[:]: if sel_l not in curr_sel_ls: self.sel_layers.remove(sel_l) for l in curr_sel_ls: if l not in self.sel_layers: self.sel_layers.append(l) self._updateLayerOrderList() else: self.sel_layers = curr_sel_ls # update projection self.projs_list = [] projs_list = [] intersect_proj = [] first = True for l in curr_sel_ls: layer_projs = l['cap_intf_l'].GetLayerData('srs') if first: projs_list = layer_projs first = False continue projs_list = set(projs_list).intersection(layer_projs) if 'srs' not in self.drv_props['ignored_params']: for proj in projs_list: proj_code = Srs(proj.strip()).getcode() proj_spl = proj_code.split(':') if proj_spl[0].strip().lower() in self.drv_info.GetSrs(): try: int(proj_spl[1]) self.projs_list.append(proj_code) except ValueError, IndexError: continue cur_sel = self.params['srs'].GetStringSelection() self.projs_list = sorted(self.projs_list) self.params['srs'].SetItems(self.projs_list) if cur_sel: self.params['srs'].SetStringSelection(cur_sel) else: try: i = self.projs_list.index('EPSG:4326') self.params['srs'].SetSelection(i) except ValueError: if len(self.projs_list) > 0: self.params['srs'].SetSelection(0)
def _computeRequestData(self, tile_mat, params, bbox, mat_num_bbox, mat_set_srs): """!Initialize data needed for iteration through tiles.""" scale_den = float( tile_mat.find(self.xml_ns.NsWmts("ScaleDenominator")).text) pixel_span = scale_den * self.pixel_size / self._getMetersPerUnit() tl_str = tile_mat.find( self.xml_ns.NsWmts("TopLeftCorner")).text.split(" ") tl_corner = {} tl_corner["minx"] = float(tl_str[0]) tl_corner["maxy"] = float(tl_str[1]) # TODO do it more generally WMS cap parser may use it in future(not needed now)??? s = Srs( mat_set_srs ) # NOTE not used params['srs'], it is just number, encoding needed # TODO needs to be tested, tried only on # http://www.landesvermessung.sachsen.de/geoserver/gwc/service/wmts?: if s.getcode() == "EPSG:4326" and s.encoding in ("uri", "urn"): grass.warning("switch") (tl_corner["minx"], tl_corner["maxy"]) = ( tl_corner["maxy"], tl_corner["minx"], ) else: grass.warning("no switch") tile_span = {} self.tile_size = {} self.tile_size["x"] = int( tile_mat.find(self.xml_ns.NsWmts("TileWidth")).text) tile_span["x"] = pixel_span * self.tile_size["x"] self.tile_size["y"] = int( tile_mat.find(self.xml_ns.NsWmts("TileHeight")).text) tile_span["y"] = pixel_span * self.tile_size["y"] self.url = params["url"] + ( "SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&" "LAYER=%s&STYLE=%s&FORMAT=%s&TILEMATRIXSET=%s&TILEMATRIX=%s" % ( params["layers"], params["styles"], params["format"], params["tile_matrix_set"], tile_mat.find(self.xml_ns.NsOws("Identifier")).text, )) BaseRequestMgr._computeRequestData(self, bbox, tl_corner, tile_span, self.tile_size, mat_num_bbox)
def _computeRequestData(self, tile_mat, params, bbox, mat_num_bbox, mat_set_srs): """!Initialize data needed for iteration through tiles. """ scale_den = float(tile_mat.find(self.xml_ns.NsWmts('ScaleDenominator')).text) pixel_span = scale_den * self.pixel_size / self._getMetersPerUnit() tl_str = tile_mat.find(self.xml_ns.NsWmts('TopLeftCorner')).text.split(' ') tl_corner = {} tl_corner['minx'] = float(tl_str[0]) tl_corner['maxy'] = float(tl_str[1]) # TODO do it more generally WMS cap parser may use it in future(not needed now)??? s = Srs(mat_set_srs) # NOTE not used params['srs'], it is just number, encoding needed # TODO needs to be tested, tried only on # http://www.landesvermessung.sachsen.de/geoserver/gwc/service/wmts?: if s.getcode() == 'EPSG:4326' and s.encoding in ('uri', 'urn'): grass.warning('switch') (tl_corner['minx'], tl_corner['maxy']) = (tl_corner['maxy'], tl_corner['minx']) else: grass.warning('no switch') tile_span = {} self.tile_size = {} self.tile_size['x'] = int(tile_mat.find(self.xml_ns.NsWmts('TileWidth')).text) tile_span['x'] = pixel_span * self.tile_size['x'] self.tile_size['y'] = int(tile_mat.find(self.xml_ns.NsWmts('TileHeight')).text) tile_span['y'] = pixel_span * self.tile_size['y'] self.url = params['url'] + ("SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&" "LAYER=%s&STYLE=%s&FORMAT=%s&TILEMATRIXSET=%s&TILEMATRIX=%s" % (params['layers'], params['styles'], params['format'], params['tile_matrix_set'], tile_mat.find(self.xml_ns.NsOws('Identifier')).text)) BaseRequestMgr._computeRequestData( self, bbox, tl_corner, tile_span, self.tile_size, mat_num_bbox)
def _getQueryBbox(self, bbox, proj, srs_param, version): """!Creates query bbox (used in request URL) Mostly bbox is not modified but if WMS standard is 1.3.0 and projection is geographic, the bbox x and y are in most cases flipped. """ # CRS:84 and CRS:83 are exception (CRS:83 and CRS:27 need to be tested) if srs_param in [84, 83] or version != '1.3.0': return bbox elif Srs(GetSRSParamVal(srs_param)).axisorder == 'yx': return self._flipBbox(bbox) return bbox
def _computeRequestData(self, tile_mat, params, bbox, mat_num_bbox, mat_set_srs): """!Initialize data needed for iteration through tiles. """ scale_den = float(tile_mat.find(self.xml_ns.NsWmts('ScaleDenominator')).text) pixel_span = scale_den * self.pixel_size / self._getMetersPerUnit() tl_str = tile_mat.find(self.xml_ns.NsWmts('TopLeftCorner')).text.split(' ') tl_corner = {} tl_corner['minx'] = float(tl_str[0]) tl_corner['maxy'] = float(tl_str[1]) #TODO do it more generally WMS cap parser may use it in future(not needed now)??? s = Srs(mat_set_srs) #NOTE not used params['srs'], it is just number, encoding needed # TODO needs to be tested, tried only on http://www.landesvermessung.sachsen.de/geoserver/gwc/service/wmts?: if s.getcode() == 'EPSG:4326' and s.encoding in ('uri', 'urn'): grass.warning('switch') (tl_corner['minx'], tl_corner['maxy']) = (tl_corner['maxy'], tl_corner['minx']) else: grass.warning('no switch') tile_span = {} self.tile_size = {} self.tile_size['x'] = int(tile_mat.find(self.xml_ns.NsWmts('TileWidth')).text) tile_span['x'] = pixel_span * self.tile_size['x'] self.tile_size['y'] = int(tile_mat.find(self.xml_ns.NsWmts('TileHeight')).text) tile_span['y'] = pixel_span * self.tile_size['y'] self.url = params['url'] + ("SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&" \ "LAYER=%s&STYLE=%s&FORMAT=%s&TILEMATRIXSET=%s&TILEMATRIX=%s" % \ (params['layers'], params['styles'], params['format'], params['tile_matrix_set'], tile_mat.find(self.xml_ns.NsOws('Identifier')).text )) BaseRequestMgr._computeRequestData(self, bbox, tl_corner, tile_span, self.tile_size, mat_num_bbox)
def _getMatSets(self, root, layer_name, srs): """!Get matrix sets which are available for chosen layer and have required EPSG. """ contents = root.find(self.xml_ns.NsWmts('Contents')) layers = contents.findall(self.xml_ns.NsWmts('Layer')) ch_layer = None for layer in layers: layer_id = layer.find(self.xml_ns.NsOws('Identifier')).text if layer_id == layer_name: ch_layer = layer break if ch_layer is None: grass.fatal( _("Layer '%s' was not found in capabilities file") % layer_name) mat_set_links = ch_layer.findall( self.xml_ns.NsWmts('TileMatrixSetLink')) suitable_mat_sets = [] tileMatrixSets = contents.findall(self.xml_ns.NsWmts('TileMatrixSet')) for link in mat_set_links: mat_set_link_id = link.find( self.xml_ns.NsWmts('TileMatrixSet')).text for mat_set in tileMatrixSets: mat_set_id = mat_set.find(self.xml_ns.NsOws('Identifier')).text if mat_set_id != mat_set_link_id: continue mat_set_srs = self._getMatSetSrs(mat_set) if Srs(mat_set_srs).getcode() == (GetSRSParamVal(srs)).upper(): suitable_mat_sets.append([mat_set, link]) if not suitable_mat_sets: grass.fatal( _("Layer '%s' is not available with %s code.") % (layer_name, "EPSG:" + str(srs))) return suitable_mat_sets # [[TileMatrixSet, TileMatrixSetLink], ....]
def OnListSelChanged(self, event): """Update widgets according to selected layer in list.""" curr_sel_ls = self.list.GetSelectedLayers() # update self.sel_layers (selected layer list) if "WMS" in self.ws: for sel_l in self.sel_layers[:]: if sel_l not in curr_sel_ls: self.sel_layers.remove(sel_l) for l in curr_sel_ls: if l not in self.sel_layers: self.sel_layers.append(l) self._updateLayerOrderList() else: self.sel_layers = curr_sel_ls # update projection self.projs_list = [] projs_list = [] intersect_proj = [] first = True for l in curr_sel_ls: layer_projs = l["cap_intf_l"].GetLayerData("srs") if first: projs_list = layer_projs first = False continue projs_list = set(projs_list).intersection(layer_projs) if "srs" not in self.drv_props["ignored_params"]: for proj in projs_list: proj_code = Srs(proj.strip()).getcode() proj_spl = proj_code.split(":") if proj_spl[0].strip().lower() in self.drv_info.GetSrs(): # accept ogc:crs code self.projs_list.append(proj_code) cur_sel = self.params["srs"].GetStringSelection() self.projs_list = sorted(self.projs_list) self.params["srs"].SetItems(self.projs_list) if cur_sel: self.params["srs"].SetStringSelection(cur_sel) else: try: i = self.projs_list.index("EPSG:4326") self.params["srs"].SetSelection(i) except ValueError: if len(self.projs_list) > 0: self.params["srs"].SetSelection(0) # update format if "WMS" not in self.ws and "format" not in self.drv_props["ignored_params"]: self.formats_list = [] cur_sel = None if self.params["format"]: cur_sel = self.params["format"].GetStringSelection() if len(curr_sel_ls) > 0: self.formats_list = sorted( self._getFormats(curr_sel_ls[0]["cap_intf_l"]) ) self._updateFormatRadioBox(self.formats_list) if cur_sel: if self.params["format"]: self.params["format"].SetStringSelection(cur_sel) else: self._setDefaultFormatVal() self.Layout()