是否存在用于请求WMS / WFS并另存为图像/ PDF的Python库?


18

我想知道是否有Python开源GIS库,它具有API以支持从另一个GIS服务器(例如GeoServer)调用WMS / WFS,然后将响应数据(WMS底图和WFS层)保存为图片。

有什么建议吗?

感谢您的任何投入!

更新

我想做的是通过使用OpenLayers作为前端和Django作为服务器的Map Printing服务。客户端用户设置范围和图层,然后将打印请求(指的是参数,即地图范围,图层名称)发送到服务器,然后服务器接管此请求并使用请求参数再次调用WMS / WFS,保存回复为PDF,然后将此PDF链接导出到客户端。

困难的部分是服务器如何调用WMS / WFS并将这些响应合并/叠加在一起(即,将这些地图/图层放在一起,因为WMS通常是基础地图,WFS指向要素图层),最后保存此组合对象作为图像。

在当前答案中,urllib似乎是一个不错的选择,但是我不确定如何将这些响应(WMS,WFS)组合在一起;OWSLib似乎也是另一个不错的选择,但是它表明它是一个客户端编程工具,我有点困惑它是否适合我的使用...

任何其他进一步的投入???

欣赏!


我不认为有,但这是个好主意!
OptimizePrime

刚注意到更新的问题与有关将WMS合并为PDF的问题有关。
MarkJ 2012年

Answers:


18

OWSLib应提供正是你需要的。

OWSLib是一个Python软件包,用于使用开放地理空间联盟(OGC)Web服务(因此称为OWS)接口标准及其相关内容模型进行客户端编程。

OWSLib提供了一个公共API,用于访问众多OGC Web Service接口的服务元数据和包装。

文档和示例在这里。在这种情况下,客户端意味着它是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的指针,我从未听说过它。
user2856 2011年

7

您可以使用python urllib库直接调用WMS,并将响应写到文件中。这个答案中有一个使用urllib的不错的例子。只需将WMS替换为一个URL,例如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 = image / 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 ...
西蒙
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.