Czy istnieje biblioteka Python Lib do żądania WMS / WFS i zapisywania jako obraz / plik PDF?

18

Zastanawiam się, czy istnieje biblioteka GIS w języku open source Python, która ma interfejsy API do obsługi połączeń WMS / WFS z innego serwera GIS (np. GeoServer), a następnie zapisuje dane odpowiedzi (mapa bazowa WMS i warstwa WFS) jako obrazy.

jakieś rekomendacje?

dzięki za wszelkie dane wejściowe!

AKTUALIZACJA :

to, co próbuję zrobić, to usługa drukowania map, wykorzystująca OpenLayers jako interfejs i Django jako serwer; Użytkownik klienta ustawia zasięg i warstwy, a następnie wysyła żądanie wydruku (które odnosi się do parametrów, tj. Zasięg mapy, nazwy warstw) do serwera, a następnie serwer przejmuje to żądanie i ponownie wywołuje WMS / WFS przy użyciu parametrów żądania, zapisz odpowiedź jako PDF, wyeksportuj ten link PDF do klienta.

Najtrudniejsze jest to, jak serwer wywołuje WMS / WFS i łączy / nakłada te odpowiedzi razem (tj. Łączy te mapy / warstwy razem, ponieważ WMS jest zwykle mapą podstawową, WFS wskazuje na warstwy obiektów), w końcu zapisuje ten połączony obiekt jako obraz.

w obecnych odpowiedziach urllib wydaje się dobry, ale nie jestem pewien, jak połączyć te odpowiedzi (WMS, WFS) razem; OWSLib wydaje się również inną dobrą opcją, ale wskazuje, że jest to narzędzie do programowania klienta, jestem trochę zdezorientowany, czy jest odpowiedni do mojego użytku ...

jakieś inne dalsze dane?

doceniać!

Szymon
źródło
Nie sądzę, żeby tak było, ale to dobry pomysł!
OptimizePrime,
Właśnie zauważyłem, że zaktualizowane pytanie jest związane z moim pytaniem o połączenie WMS z plikiem PDF.
MarkJ

Odpowiedzi:

18

Istnieje OWSLib który powinien dostarczyć dokładnie to, czego potrzebujesz.

OWSLib to pakiet Pythona do programowania klienta ze standardami interfejsu usługi Open Geospatial Consortium (OGC) (stąd OWS) i powiązanymi modelami treści.

OWSLib zapewnia wspólny interfejs API do uzyskiwania dostępu do metadanych usług i opakowań dla wielu interfejsów usługi WWW OGC.

Dokumentacja i przykłady tutaj . Klient w tym kontekście oznacza, że ​​jest to aplikacja kliencka na serwerze WMS / WFS - w razie potrzeby można go uruchomić na serwerze.

Po dodaniu dodatkowych szczegółów do odpowiedzi wygląda na to, że aplikacja do drukowania MapFish dokładnie odpowiada Twoim potrzebom. Jest to aplikacja Java, która może być zintegrowana z OpenLayers i zszywa kafelki, WMS, WFS itp. I tworzy plik PDF.

Ponieważ jest to aplikacja wiersza poleceń, można nią manipulować za pomocą opakowania w języku Python. Aby uzyskać więcej informacji, zobacz następujące łącza:

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

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

geografia
źródło
1
Dzięki za wskaźnik do OWSLib, nigdy o nim nie słyszałem.
user2856,
7

Możesz użyć biblioteki urllib Pythona, aby bezpośrednio wywołać WMS i zapisać odpowiedź w pliku. Istnieje przyzwoity przykład użycia urllib w tej odpowiedzi . Wystarczy zastąpić adres URL adresem WMS, np. 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 = obraz / png .

Możesz także użyć biblioteki GDAL, aby uzyskać dostęp do WMS ( http://www.gdal.org/frmt_wms.html ) i biblioteki OGR, aby uzyskać dostęp do WFS ( http://www.gdal.org/ogr/drv_wfs.html )

Jeśli chcesz utworzyć obraz WFS, możesz użyć funkcji gdal.RasterizeLayer, aby utworzyć plik JPG. Oto przykład .

użytkownik2856
źródło
2

Oto prosty przykład. Po stronie serwera:

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

A po stronie klienta za pomocą 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);
}}});
Przeklęty
źródło
0

Możesz użyć GeoTools do pobrania danych z serwerów WMS / WFS i renderowania do obiektu graficznego Java. Następnie coś takiego jak iText można przekonwertować na pdf.

Jeśli naprawdę musisz używać Pythona, spodziewam się, że możesz użyć opakowania do zarządzania tym wszystkim.

Ian Turton
źródło
1
dzięki. ale chcę po prostu używać Pythona ...
Simon,