Существует ли Python Lib для запроса WMS / WFS и сохранения в виде изображения / PDF?

18

мне интересно, есть ли Python-библиотека ГИС с открытым исходным кодом, в которой есть API для поддержки вызова WMS / WFS с другого ГИС-сервера (например, GeoServer), а затем сохранения данных ответов (базовая карта WMS и слой 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

geographika
источник
1
Спасибо за указатель на OWSLib, я никогда не слышал об этом.
user2856
7

Вы можете использовать библиотеку python urllib для непосредственного вызова 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 = 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. Существует пример здесь .

user2856
источник
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);
}}});
Farsheed
источник
0

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

Если вам действительно нужно использовать Python, я ожидаю, что вы можете использовать оболочку для управления всем этим.

Ян Тертон
источник
1
Благодарю. но я просто хочу использовать Python ...
Simon