Чи є Python Lib для запиту WMS / WFS та збереження у вигляді зображення / PDF?


18

Мені цікаво, чи є в Python GIS lib з відкритим кодом, який має API для підтримки виклику WMS / WFS з іншого GIS-сервера (наприклад, GeoServer), а потім збереження даних відповідей (WMS Basemap та WFS-шар) у вигляді зображень.

якісь рекомендації?

дякую за будь-які входи!

ОНОВЛЕННЯ :

те, що я намагаюся зробити, це послуга друку карт, використовуючи OpenLayers як фронтальний і Django як сервер; Клієнт користувач встановлює масштаб і шари, а потім надсилає запит друку (який стосується параметрів, тобто масштабування карти, назви шарів) на сервер, потім сервер приймає цей запит і знову викликає WMS / WFS, використовуючи параметри запиту, зберегти відповідь у форматі PDF, експортуйте це посилання PDF на клієнта.

Важкою частиною є те, що те, як сервер викликає WMS / WFS і комбінує / накладає ці відповіді разом (тобто, поєднує ці карти / шари разом, оскільки WMS зазвичай є базовою картою, WFS вказує на особливі шари), нарешті, збережіть цей об'єднаний об'єкт як Зображення.

у поточних відповідях urllib здається гарним, але я не впевнений, як поєднати ці відповіді (WMS, WFS) разом; OWSLib також здається ще одним хорошим варіантом, але він вказує, що це інструмент програмування клієнта, я трохи заплутався, чи підходить це для мого використання ...

будь-які інші подальші введення ???

цінуй!


Я не думаю, що існує, але це гарна ідея!
OptimizePrime

Щойно помітив оновлене запитання, пов’язане з моїм питанням про поєднання WMS в PDF.
MarkJ

Відповіді:


18

Є OWSLib, який повинен забезпечити саме те, що вам потрібно.

OWSLib - це пакет Python для програмування клієнтів з веб-сервісом Open Geospatial Consortium (OGC) (отже, OWS) та інтерфейсом відповідних моделей контенту.

OWSLib надає загальний API доступу до метаданих служб і обгортки для численних інтерфейсів веб-сервісу OGC.

Документація та приклади тут . Клієнт у цьому контексті означає, що це клієнтська програма до сервера WMS / WFS - при необхідності його можна запустити на сервері.

Після того, як ви додали більше деталей у свою відповідь, схоже, що програма для друку MapFish точно відповідає вашим потребам. Це програма Java, яка може бути інтегрована разом з OpenLayers і зшивати плитки, WMS, WFS тощо і створювати PDF.

Оскільки це додаток командного рядка, ним можна керувати обгорткою Python. Детальнішу інформацію див. У наступних посиланнях:

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

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


1
Дякую за вказівник на OWSLib, я ніколи про нього не чув.
користувач2856

7

Ви можете використовувати бібліотеку urllib python для виклику WMS безпосередньо та записування відповіді у файл. Є гідний приклад використання urllib у цій відповіді . Просто замініть URL-адресу на WMS, наприклад, 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 = 800 & FORIGHT = 600 & FORMAT = зображення / PNG .

Ви також можете використовувати бібліотеку GDAL для доступу до WMS ( http://www.gdal.org/frmt_wms.html ) та бібліотеку OGR для доступу до WFS ( http://www.gdal.org/ogr/drv_wfs.html )

Якщо ви хочете створити зображення WFS, ви можете використовувати функцію gdal.RasterizeLayer для створення jpg. Існує приклад тут .


2

Ось простий приклад. На стороні сервера:

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

І на стороні клієнта, використовуючи 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

Ви можете використовувати GeoTools для отримання даних із WMS / WFS-серверів та надання графічному об’єкту Java. Тоді щось подібне iText може конвертувати у PDF.

Якщо вам справді доведеться використовувати Python, я думаю, ви можете використовувати обгортку, щоб керувати цим усім.


1
Спасибі. але я просто хочу використовувати Python ...
Саймон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.