WMS / WFS istemek ve görüntü / PDF olarak kaydetmek için bir Python Lib var mı?


18

i başka bir GIS sunucusundan (örn. GeoServer) WMS / WFS çağrı desteklemek ve daha sonra resim olarak yanıt verileri (WMS Basemap ve WFS katmanı) kaydetmek için API'ları olan Python açık kaynaklı GIS lib olup olmadığını merak ediyorum.

Herhangi bir tavsiye?

herhangi bir giriş için teşekkürler!

GÜNCELLEME :

ne yapmaya çalışıyorum ön uç olarak OpenLayers ve sunucu olarak Django kullanarak bir harita yazdırma hizmetidir; İstemci kullanıcı kapsamı ve katmanları ayarladıktan sonra yazdırma isteğini (parametreler, yani harita kapsamı, katmanların adları anlamına gelir) sunucuya gönderir, daha sonra sunucu bu isteği alır ve istek parametrelerini kullanarak tekrar WMS / WFS'yi çağırır, kaydet yanıtı PDF olarak bu PDF bağlantısını istemciye aktarın.

Zor olan kısım, sunucunun WMS / WFS'yi nasıl çağırması ve bu yanıtları bir araya getirmesi / kaplamasıdır (yani, bu haritayı / katmanları bir araya getirme, çünkü WMS genellikle temel harita olduğundan, WFS özellik katmanlarına işaret eder), sonunda bu birleşik nesneyi kaydedin Görüntü olarak.

mevcut cevaplarda, urllib iyi bir görünüyor, ama bu cevapları (WMS, WFS) birlikte nasıl birleştireceğinizden emin değilim; OWSLib başka bir iyi seçenek gibi görünüyor, ancak bu bir istemci programlama aracı olduğunu gösteriyor, kullanımım için uygun olup olmadığı konusunda biraz kafam karıştı ...

başka girişler ???

takdir etmek!


Orada olduğunu sanmıyorum, ama bu iyi bir fikir!
OptimizePrime

Sadece güncellenen soru ile ilgilidir fark sorumu PDF içine WMS'yi birleştirerek hakkında.
MarkJ

Yanıtlar:


18

Orada OWSLib tam olarak neye ihtiyacınız sağlamalıdır.

OWSLib, Open Geospatial Consortium (OGC) web hizmeti (dolayısıyla OWS) arayüz standartları ve ilgili içerik modelleri ile istemci programlama için bir Python paketidir.

OWSLib, çok sayıda OGC Web Hizmeti arabirimi için hizmet meta verilerine ve paketleyicilere erişmek için ortak bir API sağlar.

Belgeler ve örnekler burada . Bu bağlamdaki istemci, bir WMS / WFS sunucusuna yönelik bir istemci uygulaması olduğu anlamına gelir - gerekirse bir sunucuda çalıştırılabilir.

Cevabınıza daha fazla ayrıntı ekledikten sonra, MapFish baskı uygulaması ihtiyaçlarınızı tam olarak karşılıyor gibi görünüyor. OpenLayers ile entegre edilebilen ve fayans, WMS, WFS vb. İle birleştirilebilen ve PDF üreten bir Java uygulamasıdır.

Bir komut satırı uygulaması olduğu için bir Python sarıcı ile manipüle edilebilir. Daha fazla ayrıntı için aşağıdaki bağlantılara bakın:

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

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


1
OWSLib'e gösterdiğiniz için teşekkürler, hiç duymamıştım.
user2856

7

Bir WMS'yi doğrudan aramak ve yanıtı bir dosyaya yazmak için python urllib kitaplığını kullanabilirsiniz. Bu cevapta urllib kullanmanın iyi bir örneği var . URL'yi bir WMS için olanla değiştirin, örneğin http: //some.wms.service? Request = GetMap & VERSION = 1.1.1 & BBOX = 141.00, -29.00,141.80, -28.40 & SRS = EPSG: 4326 & KATMANLAR = LANDSAT_MOSAIC & WIDTH = 800 & HEIGHT = 600 & FORMAT = görüntü / png .

WMS'ye erişmek için GDAL kütüphanesini ( http://www.gdal.org/frmt_wms.html ) ve WFS'ye erişmek için OGR kütüphanesini de kullanabilirsiniz ( http://www.gdal.org/ogr/drv_wfs.html )

WFS'nin bir resmini oluşturmak istiyorsanız, bir jpg oluşturmak için gdal.RasterizeLayer işlevini kullanabilirsiniz. Burada bir örnek var .


2

İşte basit bir örnek. Sunucu tarafında:

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

Ve müşteri tarafında jquery kullanarak:

$.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

Sen kullanabilirsiniz GeoTools / sunucularını WFS WMS'de veri getirmek için ve bir Java grafik nesnesine işlemek. Daha sonra iText gibi bir şey pdf'ye dönüşebilir.

Gerçekten Python kullanmanız gerekiyorsa, hepsini yönetmek için bir sarıcı kullanabileceğinizi umuyorum.


1
Teşekkürler. ama ben sadece Python kullanmak istiyorum ...
Simon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.