Apakah ada Python Lib untuk meminta WMS / WFS dan menyimpan sebagai gambar / PDF?

18

Saya bertanya-tanya apakah ada Python lib open-source GIS yang memiliki API untuk mendukung panggilan WMS / WFS dari server GIS lain (misalnya, GeoServer) dan kemudian menyimpan data respons (WMS Basemap dan lapisan WFS) sebagai gambar.

ada rekomendasi?

terima kasih atas masukan!

PEMBARUAN :

apa yang saya coba lakukan adalah layanan Pencetakan Peta, dengan menggunakan OpenLayers sebagai front-end dan Django sebagai server; Pengguna klien mengatur tingkat dan lapisan dan kemudian mengirim permintaan cetak (yang mengacu pada parameter, yaitu, tingkat peta, nama lapisan) ke server, kemudian server mengambil alih permintaan ini dan memanggil WMS / WFS lagi dengan menggunakan parameter permintaan, menyimpan respons sebagai PDF, ekspor tautan PDF ini ke klien.

Bagian yang sulit adalah bagaimana server memanggil WMS / WFS dan menggabungkan / overlay tanggapan ini bersama-sama (yaitu, menempatkan peta / lapisan ini bersama-sama, karena WMS biasanya peta dasar, WFS menunjuk ke lapisan fitur), akhirnya menyimpan objek gabungan ini sebagai Gambar.

dalam jawaban saat ini, urllib tampaknya bagus, tetapi saya tidak yakin bagaimana menggabungkan tanggapan ini (WMS, WFSs) bersama-sama; OWSLib juga tampaknya pilihan lain yang baik, tetapi ini menunjukkan itu adalah alat pemrograman klien, saya sedikit bingung apakah itu sesuai untuk saya gunakan ...

input lebih lanjut lainnya ???

menghargai!

Simon
sumber
Saya tidak berpikir ada, tapi itu ide yang bagus!
OptimizePrime
Hanya memperhatikan pertanyaan yang diperbarui terkait dengan pertanyaan saya tentang menggabungkan WMS ke PDF.
MarkJ

Jawaban:

18

Ada OWSLib yang harus menyediakan apa yang Anda butuhkan.

OWSLib adalah paket Python untuk pemrograman klien dengan layanan web Open Geospatial Consortium (OGC) (karenanya OWS) standar antarmuka, dan model konten terkait.

OWSLib menyediakan API umum untuk mengakses metadata layanan dan pembungkus untuk berbagai antarmuka Layanan Web OGC.

Dokumentasi dan contoh di sini . Klien dalam konteks ini berarti itu adalah aplikasi klien ke server WMS / WFS - dapat dijalankan di server jika diperlukan.

Setelah Anda menambahkan rincian lebih lanjut ke jawaban Anda, sepertinya aplikasi cetak MapFish cocok dengan kebutuhan Anda. Ini adalah aplikasi Java yang dapat diintegrasikan dengan OpenLayers dan ubin jahitan, WMS, WFS dll bersama-sama dan menghasilkan PDF.

Karena ini adalah aplikasi baris perintah, ia dapat dimanipulasi dengan pembungkus Python. Lihat tautan berikut untuk detail lebih lanjut:

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

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

geografi
sumber
1
Terima kasih atas penunjuk ke OWSLib, saya belum pernah mendengarnya.
user2856
7

Anda dapat menggunakan perpustakaan python urllib untuk memanggil WMS secara langsung dan menulis respons ke file. Ada contoh yang layak menggunakan urllib dalam jawaban ini . Cukup ganti URL dengan satu untuk WMS, mis. 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 & FORM = gambar / png .

Anda juga dapat menggunakan perpustakaan GDAL untuk mengakses WMS ( http://www.gdal.org/frmt_wms.html ) dan perpustakaan OGR untuk mengakses WFS ( http://www.gdal.org/ogr/drv_wfs.html )

Jika Anda ingin membuat gambar WFS, Anda bisa menggunakan fungsi gdal.RasterizeLayer untuk membuat jpg. Ada contoh di sini .

pengguna2856
sumber
2

Ini adalah contoh sederhana. Di sisi 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)}

Dan di sisi klien menggunakan 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);
}}});
Farsheed
sumber
0

Anda bisa menggunakan GeoTools untuk mengambil data dari server WMS / WFS dan merender ke objek grafis Java. Kemudian sesuatu seperti iText dapat dikonversi menjadi pdf.

Jika Anda benar-benar harus menggunakan Python, saya berharap Anda bisa menggunakan pembungkus untuk mengatur semuanya.

Ian Turton
sumber
1
Terima kasih. tetapi saya hanya ingin menggunakan Python ...
Simon