Exemplo n.º 1
0
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
    }
Exemplo n.º 2
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)
Exemplo n.º 3
0
    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]
Exemplo n.º 4
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)
Exemplo n.º 5
0
    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]
Exemplo n.º 6
0
    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]