¿Hay una Python Lib para solicitar WMS / WFS y guardar como imagen / PDF?


18

Me pregunto si hay una biblioteca GIS de código abierto de Python que tiene API para admitir llamadas WMS / WFS desde otro servidor SIG (por ejemplo, GeoServer) y luego guardar los datos de respuesta (mapa base WMS y capa WFS) como imágenes.

¿alguna recomendación?

gracias por cualquier entrada!

ACTUALIZACIÓN :

lo que intento hacer es un servicio de impresión de mapas, usando OpenLayers como front-end y Django como servidor; El usuario del cliente establece la extensión y las capas y luego envía la solicitud de impresión (que se refiere a los parámetros, es decir, la extensión del mapa, los nombres de las capas) al servidor, luego el servidor se hace cargo de esta solicitud y vuelve a llamar a WMS / WFS utilizando los parámetros de solicitud, guardar la respuesta como PDF, exporte este enlace PDF al cliente.

La parte difícil es que la forma en que el servidor llama a WMS / WFS y combina / superpone estas respuestas juntas (es decir, combina estos mapas / capas, ya que WMS suele ser el mapa base, WFS apunta a las capas de entidades), finalmente guarda este objeto combinado como imagen.

en las respuestas actuales, urllib parece una buena, pero no estoy seguro de cómo combinar estas respuestas (WMS, WFS) juntas; OWSLib también parece otra buena opción, pero indica que es una herramienta de programación del cliente, estoy un poco confundido sobre si es apropiado para mi uso ...

¿Alguna otra entrada adicional?

¡apreciar!


No creo que la haya, ¡pero es una buena idea!
OptimizePrime

Acabo de notar que la pregunta actualizada está relacionada con mi pregunta sobre la combinación de WMS en PDF.
MarkJ

Respuestas:


18

Hay OWSLib que debe proporcionar exactamente lo que necesita.

OWSLib es un paquete de Python para la programación del cliente con los estándares de interfaz del servicio web Open Geospatial Consortium (OGC) y, por lo tanto, sus modelos de contenido relacionados.

OWSLib proporciona una API común para acceder a metadatos de servicio y contenedores para numerosas interfaces de servicios web de OGC.

Documentación y ejemplos aquí . Cliente en este contexto significa que es una aplicación cliente para un servidor WMS / WFS; se puede ejecutar en un servidor si es necesario.

Después de agregar más detalles a su respuesta, parece que la aplicación de impresión MapFish se adapta exactamente a sus necesidades. Es una aplicación Java que se puede integrar con OpenLayers y unir mosaicos, WMS, WFS, etc. y produce un PDF.

Como es una aplicación de línea de comandos, puede manipularse con un contenedor Python. Vea los siguientes enlaces para más detalles:

http://geographika.co.uk/mapfish-print-module-for-iis

https://github.com/amercader/MapFish-Print-IIS


1
Gracias por el puntero a OWSLib, nunca había oído hablar de él.
user2856

7

Puede usar la biblioteca urllib de python para llamar a un WMS directamente y escribir la respuesta en un archivo. Hay un ejemplo decente de usar urllib en esta respuesta . Simplemente reemplace la URL con una para un WMS, por ejemplo, http: //some.wms.service? Request = GetMap & VERSION = 1.1.1 & BBOX = 141.00, -29.00,141.80, -28.40 & SRS = EPSG: 4326 & LAYERS = LANDSAT_MOSAIC & WIDTH = 800 & HEIGHT = 600 & FORMAT = imagen / png .

También puede usar la biblioteca GDAL para acceder a WMS ( http://www.gdal.org/frmt_wms.html ) y la biblioteca OGR para acceder a WFS ( http://www.gdal.org/ogr/drv_wfs.html )

Si desea crear una imagen de WFS, puede usar la función gdal.RasterizeLayer para crear un jpg. Hay un ejemplo aquí .


2

Aquí hay un ejemplo simple. En el lado del servidor:

def get_wfs():
    '''
    Get data from wfs server. Example url is:
    http://192.168.0.1:8080/geoserver/wfs?request=GetFeature&version=1.0.0&service=WFS&typeName=ChistaWS:Chista_new_POIs&maxfeatures=20&srsname=EPSG:4326&outputFormat=json
    We can add CQL filter like this:
    CQL_FILTER=name LIKE 'A%25'
    or
    CQL_FILTER=type=1913

    '''
    cql = ''
    if request.vars.cql:
        cql = urllib.quote_plus(request.vars.cql)
    req = 'GetFeature' # request
    version = '1.0.0'
    service = 'WFS'
    typeName = 'Test:Test_Places'
    maxfeatures = 200000
    if request.vars.mf:
        maxfeatures = request.vars.mf
    srsname = 'EPSG:4326'
    outputFormat = 'json'   
    # format_options = 'callback:getLayerFeatures_MY'
    wfs_url = '%s?request=%s&version=%s&service=%s&typeName=%s&maxfeatures=%s&srsname=%s&outputFormat=%s' % \
                (wfs_server, req, version, service, typeName,\
                 maxfeatures, srsname, outputFormat)
    if cql:
        # print cql
        wfs_url += '&CQL_FILTER=%s'%cql
    # print wfs_url
    try:
        jsonp = urllib2.urlopen(wfs_url).read()  # Get the raw server data
    except urllib2.HTTPError:
        return 'WFS Server <a target="_new" href="%s">%s</a> is down!' % (wfs_server, wfs_server)
    # return jsonp
    # try:
        # apijson = jsonp[ jsonp.index("(") + 1 : jsonp.rindex(")") ]
    # except ValueError:
    apijson = jsonp
    try:
        data = sj.loads(apijson)
    except sj.JSONDecodeError:
        return 'Can not parse data. No JSON! here is the data: <pre>%s</pre>' % apijson
    # return data
    features =[{
            'name':i['properties']['name'],
            'type':i['properties']['type'],
            'coordinates':i['geometry']['coordinates'],
            } for i in data['features']]
    # features =[i for i in data['features']]
    # return dict(features=features)
    return {'result':features, 'length':len(features)}

Y en el lado del cliente usando jquery:

$.ajax({
dataType : 'json',
url: wfsurl,
success  : function (response) {
if (response.length>0){
$('#'+subitem).empty();
for (var i = 0, len = response.length; i < len; i++) {
name = response.result[i].name;
lng = response.result[i].coordinates[0];
lat = response.result[i].coordinates[1];
// console.log(name, lng, lat)
html = '<li class="li-subitem"><a onclick="lazyview($(this));" lat="'+lat+'" lng="'+lng+'">'+name+'</a></li>';
$('#'+subitem).append(html);
}}
else{
$('#'+subitem).toggle(100);
}}});

0

Puede usar GeoTools para obtener los datos de los servidores WMS / WFS y procesarlos en un objeto gráfico Java. Entonces algo como iText puede convertir a un pdf.

Si realmente tiene que usar Python, espero que pueda usar un contenedor para administrarlo todo.


1
Gracias. pero solo quiero usar Python ...
Simon
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.