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

17

me pregunto si hay una biblioteca GIS de código abierto de Python que tiene API para admitir llamadas 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 entrada!

ACTUALIZACIÓN :

lo que estoy tratando de hacer es un servicio de impresión de mapas, utilizando OpenLayers como front-end y Django como servidor; El usuario cliente configura 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 llama a WMS / WFS nuevamente usando los parámetros de solicitud, guardar La respuesta como PDF, exporta 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 (es decir, coloca estos mapas / capas juntos, ya que WMS suele ser el mapa base, WFS apunta a las capas de entidades), finalmente, guarde este objeto combinado como imagen.

en las respuestas actuales, urllib parece ser bueno, 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 de clientes, estoy un poco confundido de que sea apropiado para mi uso ...

cualquier otra entrada adicional ???

aprecio!

    
pregunta Simon 16.11.2011 - 19:44

4 respuestas

17

Hay OWSLib que debe proporcionarle exactamente lo que necesita.

  

OWSLib es un paquete de Python para la programación del cliente con Open Geospatial Consortium (OGC)   estándares de interfaz de servicios web (por lo tanto, OWS) 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 servicio web OGC.

Documentación y ejemplos aquí . En este contexto, el cliente 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 ajusta exactamente a sus necesidades. Es una aplicación Java que se puede integrar con OpenLayers y puntos de mosaicos, WMS, WFS, etc. juntos y produce un PDF.

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

enlace

enlace

    
respondido por el geographika 17.11.2011 - 10:35
7

Puede usar la biblioteca python urllib para llamar directamente a un WMS y escribir la respuesta en un archivo. Hay un ejemplo decente de usar urllib en este answer . Simplemente reemplace la URL con una para un WMS, por ejemplo. enlace .

También puede usar la biblioteca GDAL para acceder a WMS ( enlace ) y la biblioteca OGR para acceder a WFS ( enlace )

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

    
respondido por el Luke 17.11.2011 - 06:13
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);
}}});
    
respondido por el Farsheed 01.12.2013 - 13:01
0

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

Si realmente tienes que usar Python, espero que puedas usar un contenedor para administrarlo todo.

    
respondido por el Ian Turton 17.11.2011 - 09:48

Lea otras preguntas en las etiquetas