23 votos

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

Me pregunto si existe una librería GIS de código abierto de Python que tenga APIs que permitan llamar a WMS/WFS desde otro servidor GIS (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 aportación.

ACTUALIZACIÓN :

Lo que estoy tratando de hacer es un servicio de impresión de mapas, mediante el uso de OpenLayers como el front-end y Django como el servidor; El usuario del cliente establece la extensión y las capas y luego enviar 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, a continuación, el servidor se hace cargo de esta solicitud y llamar WMS / WFS de nuevo mediante el uso de parámetros de la solicitud, guardar la respuesta como PDF, exportar este enlace PDF al cliente.

La parte difícil es cómo el servidor llama a WMS/WFS y combina/superpone estas respuestas juntas (es decir, pone estos mapas/capas juntos, ya que WMS es normalmente el mapa base, WFS apunta a las capas de características), 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, WFSs) juntos; OWSLib también parece otra buena opción, pero indica que es una herramienta de programación del cliente, estoy un poco confundido que si es apropiado para mi uso...

¿alguna otra aportación?

¡aprecien!

0 votos

No creo que lo haya, pero es una buena idea.

0 votos

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

22voto

Swinders Puntos 1042

Hay OWSLib que debería proporcionar exactamente lo que necesitas.

OWSLib es un paquete de Python para la programación de clientes con los estándares de interfaz de servicios web del Open Geospatial Consortium (OGC) y sus modelos de contenido relacionados.

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

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

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

Al ser una aplicación de línea de comandos puede ser manipulada con un wrapper de 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 votos

Gracias por la indicación de OWSLib, nunca había oído hablar de él.

8voto

Lucas Puntos 128

Puedes utilizar la biblioteca urllib de python para llamar directamente a un WMS y escribir la respuesta en un archivo. Hay un ejemplo decente del uso de urllib en esto respuesta . Sólo hay que sustituir la URL por la de un SGA, 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=image/png .

También puede utilizar 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 quisieras crear una imagen del WFS, podrías utilizar la función gdal.RasterizeLayer para crear un jpg. Hay un ejemplo aquí .

3voto

Farsheed Puntos 131

He aquí un ejemplo sencillo. 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);
}}});

0voto

Adam Ernst Puntos 6939

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

Si realmente tienes que usar Python supongo que podrías usar un wrapper para gestionarlo todo.

1 votos

Gracias. pero sólo quiero usar Python...

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X