Esiste un Python Lib per richiedere WMS / WFS e salvarlo come immagine / PDF?


18

mi chiedo se esiste una libreria GIS open source Python che abbia API per supportare la chiamata WMS / WFS da un altro server GIS (ad esempio GeoServer) e quindi salvare i dati di risposta (WMS Basemap e livello WFS) come immagini.

qualche consiglio?

grazie per eventuali input!

AGGIORNAMENTO :

quello che sto cercando di fare è un servizio di stampa delle mappe, usando OpenLayers come front-end e Django come server; L'utente client imposta l'estensione e i livelli e quindi invia la richiesta di stampa (che si riferisce ai parametri, ovvero l'estensione della mappa, i nomi dei livelli) al server, quindi il server accetta questa richiesta e chiama nuovamente WMS / WFS utilizzando i parametri di richiesta, salva la risposta come PDF, esportare questo collegamento PDF sul client.

La parte difficile è che il modo in cui il server chiama WMS / WFS e combina / sovrappone queste risposte insieme (ovvero, metti insieme queste mappe / layer, poiché WMS è di solito la mappa di base, WFS punta ai feature layer), infine salva questo oggetto combinato come immagine.

nelle risposte attuali, urllib sembra buono, ma non sono sicuro di come combinare queste risposte (WMS, WFS) insieme; Anche OWSLib sembra un'altra buona opzione, ma indica che è uno strumento di programmazione client, sono un po 'confuso sul fatto che sia appropriato per il mio uso ...

altri ulteriori input ???

apprezzare!


Non penso che ci sia, ma è una buona idea!
OptimizePrime

Ho appena notato che la domanda aggiornata è correlata alla mia domanda sulla combinazione di WMS in PDF.
MarkJ,

Risposte:


18

C'è OWSLib che dovrebbe fornire esattamente ciò di cui hai bisogno.

OWSLib è un pacchetto Python per la programmazione client con gli standard di interfaccia del servizio Web OGC (Open Geospatial Consortium (quindi OWS) e i relativi modelli di contenuto.

OWSLib fornisce un'API comune per l'accesso ai metadati e ai wrapper del servizio per numerose interfacce del servizio Web OGC.

Documentazione ed esempi qui . Il client in questo contesto significa che è un'applicazione client per un server WMS / WFS - può essere eseguito su un server, se necessario.

Dopo aver aggiunto ulteriori dettagli alla tua risposta, sembra che l'applicazione di stampa MapFish soddisfi esattamente le tue esigenze. È un'applicazione Java che può essere integrata con OpenLayers e punti piastrelle, WMS, WFS ecc. Insieme e produce un PDF.

Essendo un'applicazione a riga di comando, può essere manipolata con un wrapper Python. Vedi i link seguenti per maggiori dettagli:

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

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


1
Grazie per il puntatore a OWSLib, non ne avevo mai sentito parlare.
user2856

7

Puoi usare la libreria urllib di Python per chiamare direttamente un WMS e scrivere la risposta in un file. C'è un esempio decente dell'uso di urllib in questa risposta . Basta sostituire l'URL con uno per un WMS, ad esempio 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 = immagine / png .

Puoi anche utilizzare la libreria GDAL per accedere a WMS ( http://www.gdal.org/frmt_wms.html ) e la libreria OGR per accedere a WFS ( http://www.gdal.org/ogr/drv_wfs.html )

Se si desidera creare un'immagine di WFS, è possibile utilizzare la funzione gdal.RasterizeLayer per creare un jpg. C'è un esempio qui .


2

Qui c'è un semplice esempio. Sul lato server:

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)}

E nel lato client 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

È possibile utilizzare GeoTools per recuperare i dati dai server WMS / WFS e renderizzarli su un oggetto grafico Java. Quindi qualcosa come iText può convertire in pdf.

Se davvero dovessi usare Python, mi aspetto che potresti usare un wrapper per gestire tutto.


1
Grazie. ma voglio solo usare Python ...
Simon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.