def doWmts(url): wmts = WebMapTileService(url) ## Huom! Katsoin mitä QGIS tallentaa WMTS "sourceen" ja siellä näkyy olevan GetCapaiblities-osoite wmtsGetCaps = next( (i for i in wmts.getOperationByName('GetCapabilities').methods if i['type'] == 'Get'), None) return { 'type': 'WMTS', 'contents': list(wmts.contents), 'formatPerLayer': dict(map(lambda kv: (kv[0], kv[1].formats), wmts.contents.items())), 'tileMatrixSetsPerLayer': dict( map(lambda kv: (kv[0], kv[1].tilematrixsets), wmts.contents.items())), 'url': wmtsGetCaps['url'], 'service': wmts }
def process_wmts_service(url, name, type, username, password, wmts=None, owner=None, parent=None): """ Create a new WMTS service """ if wmts is None: wmts = WebMapTileService(url) try: base_url = _clean_url( wmts.getOperationByName('GetTile').methods['Get']['url']) if base_url and base_url != url: url = base_url wmts = WebMapTileService(base_url) except: logger.info( "Could not retrieve GetMap url, using originally supplied URL %s" % url) pass try: service = Service.objects.get(base_url=url) return_dict = [{ 'status': 'ok', 'msg': _("This is an existing service"), 'service_id': service.pk, 'service_name': service.name, 'service_title': service.title }] return HttpResponse(json.dumps(return_dict), mimetype='application/json', status=200) except: pass title = wmts.identification.title if not name: if title: name = wmts.identification.title else: name = urlsplit(url).netloc for layer, layer_metadata in wmts.contents.items(): if layer is None or layer_metadata.name is None: continue logger.info("Registering layer %s" % layer_metadata.name) layer_uuid = str(uuid.uuid1()) try: keywords = map(lambda x: x[:100], layer_metadata.keywords) except: keywords = [] if not layer_metadata.abstract: abstract = "" else: abstract = layer_metadata.abstract bbox = list(layer_metadata.boundingBoxWGS84 or (-179.0, -89.0, 179.0, 89.0)) # Need to check if layer already exists?? saved_layer, created = Layer.objects.get_or_create( typename=layer_metadata.name, service=service, defaults=dict( name=layer_metadata.name, store=service.name, # ?? storeType="remoteStore", workspace="remoteWorkspace", title=layer_metadata.title or layer_metadata.name, abstract=layer_metadata.abstract or ("Not provided"), uuid=layer_uuid, owner=None, srid=layer_metadata.tilematrixsets, bbox_x0=bbox[0], bbox_x1=bbox[2], bbox_y0=bbox[1], bbox_y1=bbox[3])) if created: saved_layer.save() saved_layer.set_default_permissions() saved_layer.keywords.add(*keywords) set_attributes(saved_layer) service_layer, created = ServiceLayer.objects.get_or_create( typename=layer_metadata.name, service=service) service_layer.layer = saved_layer service_layer.title = layer_metadata.title service_layer.description = layer_metadata.abstract service_layer.styles = layer_metadata.styles service_layer.save() message = "%d Layers Registered" % count return_dict = {'status': 'ok', 'msg': message} return HttpResponse(json.dumps(return_dict), mimetype='application/json', status=200)
srs = current_crs elif "EPSG:4326" in wmts_lyr.tilematrixsets: print("It's a SRS match! With standard WGS 84 (EPSG:4326)") tile_matrix_set = wmts.tilematrixsets.get("EPSG:4326").identifier srs = "EPSG:4326" elif "EPSG:900913" in wmts_lyr.tilematrixsets: print("It's a SRS match! With Google (EPSG:900913)") tile_matrix_set = wmts.tilematrixsets.get("EPSG:900913").identifier srs = "EPSG:900913" else: print("Searched SRS not available within service CRS.") tile_matrix_set = wmts.tilematrixsets.get(def_tile_matrix_set).identifier srs = tile_matrix_set # Format definition wmts_lyr_formats = wmts.getOperationByName("GetTile").formatOptions formats_image = [f.split(" ", 1)[0] for f in wmts_lyr_formats if f in qgis_wms_formats] if len(formats_image): if "image/png" in formats_image: layer_format = "image/png" elif "image/jpeg" in formats_image: layer_format = "image/jpeg" else: layer_format = formats_image[0] else: # try with PNG layer_format = "image/png" # Style definition print("Available styles: ", wmts_lyr.styles) lyr_style = wmts_lyr.styles.keys()[0]
def process_wmts_service(url, name, type, username, password, wmts=None, owner=None, parent=None): """ Create a new WMTS service """ if wmts is None: wmts = WebMapTileService(url) try: base_url = _clean_url(wmts.getOperationByName("GetTile").methods["Get"]["url"]) if base_url and base_url != url: url = base_url wmts = WebMapTileService(base_url) except: logger.info("Could not retrieve GetMap url, using originally supplied URL %s" % url) pass try: service = Service.objects.get(base_url=url) return_dict = [ { "status": "ok", "msg": _("This is an existing service"), "service_id": service.pk, "service_name": service.name, "service_title": service.title, } ] return HttpResponse(json.dumps(return_dict), mimetype="application/json", status=200) except: pass title = wmts.identification.title if not name: if title: name = wmts.identification.title else: name = urlsplit(url).netloc for layer, layer_metadata in wmts.contents.items(): if layer is None or layer_metadata.name is None: continue logger.info("Registering layer %s" % layer_metadata.name) layer_uuid = str(uuid.uuid1()) try: keywords = map(lambda x: x[:100], layer_metadata.keywords) except: keywords = [] if not layer_metadata.abstract: abstract = "" else: abstract = layer_metadata.abstract bbox = list(layer_metadata.boundingBoxWGS84 or (-179.0, -89.0, 179.0, 89.0)) # Need to check if layer already exists?? saved_layer, created = Layer.objects.get_or_create( typename=layer_metadata.name, service=service, defaults=dict( name=layer_metadata.name, store=service.name, # ?? storeType="remoteStore", workspace="remoteWorkspace", title=layer_metadata.title or layer_metadata.name, abstract=layer_metadata.abstract or ("Not provided"), uuid=layer_uuid, owner=None, srid=layer_metadata.tilematrixsets, bbox_x0=bbox[0], bbox_x1=bbox[2], bbox_y0=bbox[1], bbox_y1=bbox[3], ), ) if created: saved_layer.save() saved_layer.set_default_permissions() saved_layer.keywords.add(*keywords) set_attributes(saved_layer) service_layer, created = ServiceLayer.objects.get_or_create(typename=layer_metadata.name, service=service) service_layer.layer = saved_layer service_layer.title = layer_metadata.title service_layer.description = layer_metadata.abstract service_layer.styles = layer_metadata.styles service_layer.save() message = "%d Layers Registered" % count return_dict = {"status": "ok", "msg": message} return HttpResponse(json.dumps(return_dict), mimetype="application/json", status=200)
def build_wmts_url(self, api_layer, srv_details, rsc_type="ds_dyn_lyr_srv", mode="complete"): """Format the input WMTS URL to fit QGIS criterias. Retrieve GetCapabilities from information transmitted by Isogeo API to complete URL syntax. """ # local variables layer_name = api_layer.get("id") layer_title = api_layer.get("titles")[0].get("value", "WMTS Layer") wmts_url_getcap = srv_details.get("path")\ + "?request=GetCapabilities&service=WMTS" geoserver = "geoserver" in wmts_url_getcap # basic checks on service url try: wmts = WebMapTileService(wmts_url_getcap) except TypeError as e: logger.error("WMTS - OWSLib mixing str and unicode args", e) wmts = WebMapTileService(unicode(wmts_url_getcap)) except ServiceException as e: logger.error(e) return 0, "WMTS - Bad operation: " + wmts_url_getcap, str(e) except HTTPError as e: logger.error(e) return 0, "WMTS - Service not reached: " + wmts_url_getcap, e except Exception as e: logger.error("WMTS - {}: {}".format(wmts_url_getcap, e)) return 0, "WMTS - Service not reached: " + wmts_url_getcap, e # check if GetTile operation is available if not hasattr(wmts, "gettile") or "GetTile" not in [op.name for op in wmts.operations]: return 0, "Required GetTile operation not available in: " + wmts_url_getcap else: logger.debug("GetTile available") pass # check if layer is present and queryable try: wmts_lyr = wmts[layer_name] layer_title = wmts_lyr.title layer_id = wmts_lyr.id except KeyError as e: logger.error("Layer {} not found in WMTS service: {}" .format(layer_name, wmts_url_getcap)) return (0, "Layer {} not found in WMS service: {}" .format(layer_name, wmts_url_getcap), e) # Tile Matrix Set & SRS srs_map = plg_tools.get_map_crs() def_tile_matrix_set = wmts_lyr.tilematrixsets[0] if srs_map in wmts_lyr.tilematrixsets: logger.debug("WMTS - It's a SRS match! With map canvas: " + srs_map) tile_matrix_set = wmts.tilematrixsets.get(srs_map).identifier srs = srs_map elif "EPSG:4326" in wmts_lyr.tilematrixsets: logger.debug("WMTS - It's a SRS match! With standard WGS 84 (4326)") tile_matrix_set = wmts.tilematrixsets.get("EPSG:4326").identifier srs = "EPSG:4326" elif "EPSG:900913" in wmts_lyr.tilematrixsets: logger.debug("WMTS - It's a SRS match! With Google (900913)") tile_matrix_set = wmts.tilematrixsets.get("EPSG:900913").identifier srs = "EPSG:900913" else: logger.debug("WMTS - Searched SRS not available within service CRS.") tile_matrix_set = wmts.tilematrixsets.get(def_tile_matrix_set).identifier srs = tile_matrix_set # Format definition wmts_lyr_formats = wmts.getOperationByName('GetTile').formatOptions formats_image = [f.split(" ", 1)[0] for f in wmts_lyr_formats if f in qgis_wms_formats] if len(formats_image): if "image/png" in formats_image: layer_format = "image/png" elif "image/jpeg" in formats_image: layer_format = "image/jpeg" else: layer_format = formats_image[0] else: logger.debug("WMTS - No format available among preferred by QGIS.") layer_format = "image/png" # Style definition lyr_style = wmts_lyr.styles.keys()[0] # GetTile URL wmts_lyr_url = wmts.getOperationByName('GetTile').methods wmts_lyr_url = wmts_lyr_url[0].get("url") if wmts_lyr_url[-1] == "&": wmts_lyr_url = wmts_lyr_url[:-1] else: pass # construct URL wmts_url_params = {"SERVICE": "WMTS", "VERSION": "1.0.0", "REQUEST": "GetCapabilities", "layers": layer_id, "crs": srs, "format": layer_format, "styles": "", "tileMatrixSet": tile_matrix_set, "url": wmts_lyr_url, } wmts_url_final = unquote(urlencode(wmts_url_params, "utf8")) logger.debug(wmts_url_final) # method ending return ["WMTS", layer_title, wmts_url_final]
def build_wmts_url(self, api_layer, srv_details, rsc_type="ds_dyn_lyr_srv", mode="complete"): """Format the input WMTS URL to fit QGIS criterias. Retrieve GetCapabilities from information transmitted by Isogeo API to complete URL syntax. """ # local variables layer_name = api_layer.get("id") layer_title = "WMTS Layer" if len(api_layer.get("titles")): layer_title = api_layer.get("titles")[0].get("value", "WMTS Layer") else: pass wmts_url_getcap = (srv_details.get("path") + "?request=GetCapabilities&service=WMTS") # basic checks on service url try: wmts = WebMapTileService(wmts_url_getcap) except TypeError as e: logger.error( "WMTS - OWSLib mixing str and unicode args :{}".format(e)) except ServiceException as e: logger.error(e) return 0, "WMTS - Bad operation: " + wmts_url_getcap, str(e) except HTTPError as e: logger.error(e) return 0, "WMTS - Service not reached: " + wmts_url_getcap, e except Exception as e: logger.error("WMTS - {}: {}".format(wmts_url_getcap, e)) return 0, "WMTS - Service not reached: " + wmts_url_getcap, e # check if GetTile operation is available if not hasattr(wmts, "gettile") or "GetTile" not in [ op.name for op in wmts.operations ]: return 0, "Required GetTile operation not available in: " + wmts_url_getcap else: logger.debug("GetTile available") pass # check if layer is present and queryable try: wmts_lyr = wmts[layer_name] layer_title = wmts_lyr.title layer_id = wmts_lyr.id except KeyError as e: logger.error("Layer {} not found in WMTS service: {}".format( layer_name, wmts_url_getcap)) return ( 0, "Layer {} not found in WMS service: {}".format( layer_name, wmts_url_getcap), e, ) # Tile Matrix Set & SRS srs_map = plg_tools.get_map_crs() def_tile_matrix_set = wmts_lyr.tilematrixsets[0] if srs_map in wmts_lyr.tilematrixsets: logger.debug("WMTS - It's a SRS match! With map canvas: " + srs_map) tile_matrix_set = wmts.tilematrixsets.get(srs_map).identifier srs = srs_map elif "EPSG:4326" in wmts_lyr.tilematrixsets: logger.debug( "WMTS - It's a SRS match! With standard WGS 84 (4326)") tile_matrix_set = wmts.tilematrixsets.get("EPSG:4326").identifier srs = "EPSG:4326" elif "EPSG:900913" in wmts_lyr.tilematrixsets: logger.debug("WMTS - It's a SRS match! With Google (900913)") tile_matrix_set = wmts.tilematrixsets.get("EPSG:900913").identifier srs = "EPSG:900913" else: logger.debug( "WMTS - Searched SRS not available within service CRS.") tile_matrix_set = wmts.tilematrixsets.get( def_tile_matrix_set).identifier srs = tile_matrix_set # Format definition wmts_lyr_formats = wmts.getOperationByName("GetTile").formatOptions formats_image = [ f.split(" ", 1)[0] for f in wmts_lyr_formats if f in qgis_wms_formats ] if len(formats_image): if "image/png" in formats_image: layer_format = "image/png" elif "image/jpeg" in formats_image: layer_format = "image/jpeg" else: layer_format = formats_image[0] else: logger.debug("WMTS - No format available among preferred by QGIS.") layer_format = "image/png" # Style definition # lyr_style = wmts_lyr.styles.keys()[0] # GetTile URL wmts_lyr_url = wmts.getOperationByName("GetTile").methods wmts_lyr_url = wmts_lyr_url[0].get("url") if wmts_lyr_url[-1] == "&": wmts_lyr_url = wmts_lyr_url[:-1] else: pass # construct URL wmts_url_params = { "SERVICE": "WMTS", "VERSION": "1.0.0", "REQUEST": "GetCapabilities", "layers": layer_id, "crs": srs, "format": layer_format, "styles": "", "tileMatrixSet": tile_matrix_set, "url": wmts_lyr_url, } wmts_url_final = unquote(urlencode(wmts_url_params, "utf8")) logger.debug(wmts_url_final) # method ending return ["WMTS", layer_title, wmts_url_final]