Có Python Lib để yêu cầu WMS / WFS và lưu dưới dạng hình ảnh / PDF không?


18

Tôi tự hỏi liệu có lib lib mã nguồn mở Python có API để hỗ trợ gọi WMS / WFS từ một máy chủ GIS khác (ví dụ: GeoServer) và sau đó lưu dữ liệu phản hồi (lớp WMS Basemap và WFS) làm hình ảnh.

Có khuyến nghị nào không?

cảm ơn cho bất kỳ đầu vào!

CẬP NHẬT :

những gì tôi đang cố gắng làm là một dịch vụ In bản đồ, bằng cách sử dụng OpenLayers làm giao diện người dùng và Django làm máy chủ; Người dùng máy khách đặt phạm vi và các lớp rồi gửi yêu cầu in (tham chiếu đến các tham số, nghĩa là phạm vi bản đồ, tên của các lớp) đến máy chủ, sau đó máy chủ tiếp nhận yêu cầu này và gọi lại WMS / WFS bằng cách sử dụng tham số yêu cầu, lưu lại Phản hồi dưới dạng PDF, xuất liên kết PDF này tới máy khách.

Điều khó khăn là cách máy chủ gọi WMS / WFS và kết hợp / chồng các phản hồi này lại với nhau (nghĩa là đặt các bản đồ / lớp này lại với nhau, vì WMS thường là bản đồ cơ sở, WFS trỏ đến các lớp đối tượng), cuối cùng lưu đối tượng kết hợp này như hình ảnh.

trong các câu trả lời hiện tại, urllib có vẻ tốt, nhưng tôi không chắc làm thế nào để kết hợp các câu trả lời này (WMS, WFS) với nhau; OWSLib cũng có vẻ là một lựa chọn tốt khác, nhưng nó cho biết đây là một công cụ lập trình máy khách, tôi hơi bối rối rằng liệu nó có phù hợp với mục đích sử dụng của tôi không ...

còn đầu vào nào nữa không ???

đánh giá!


Tôi không nghĩ là có, nhưng đó là một ý tưởng tốt!
OptimizePrime

Chỉ cần lưu ý câu hỏi cập nhật có liên quan đến câu hỏi của tôi về việc kết hợp WMS vào PDF.
MarkJ

Câu trả lời:


18

OWSLib sẽ cung cấp chính xác những gì bạn cần.

OWSLib là gói Python để lập trình máy khách với các tiêu chuẩn giao diện dịch vụ web (OGC) của Open Geospatial Consortium (do đó là OWS) và các mô hình nội dung liên quan của chúng.

OWSLib cung cấp một API chung để truy cập siêu dữ liệu và trình bao bọc dịch vụ cho nhiều giao diện Dịch vụ Web OGC.

Tài liệu và ví dụ ở đây . Máy khách trong ngữ cảnh này có nghĩa là ứng dụng khách đến máy chủ WMS / WFS - nó có thể chạy trên máy chủ nếu được yêu cầu.

Sau khi bạn thêm chi tiết vào câu trả lời của mình, có vẻ như ứng dụng in MapFish phù hợp với nhu cầu của bạn một cách chính xác. Đây là một ứng dụng Java có thể được tích hợp với OpenLayers và ghép các ô, WMS, WFS, v.v. và tạo ra một tệp PDF.

Vì nó là một ứng dụng dòng lệnh, nó có thể được thao tác với trình bao bọc Python. Xem các liên kết sau để biết thêm chi tiết:

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

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


1
Cảm ơn con trỏ tới OWSLib, tôi chưa bao giờ nghe về nó.
dùng2856

7

Bạn có thể sử dụng thư viện urllib python để gọi WMS trực tiếp và viết phản hồi ra tệp. Có một ví dụ điển hình về việc sử dụng urllib trong câu trả lời này . Chỉ cần thay thế URL bằng một URL cho WMS, ví dụ: 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 & WID = 800 hình ảnh / png .

Bạn cũng có thể sử dụng thư viện GDAL để truy cập WMS ( http://www.gdal.org/frmt_wms.html ) và thư viện OGR để truy cập WFS ( http://www.gdal.org/ogr/drv_wfs.html )

Nếu bạn muốn tạo một hình ảnh của WFS, bạn có thể sử dụng hàm gdal.RasterizeLayer để tạo một jpg. Có một ví dụ ở đây .


2

Đây là một ví dụ đơn giản. Về phía máy chủ:

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

Và trong phía khách hàng sử dụng 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

Bạn có thể sử dụng GeoTools để tìm nạp dữ liệu từ các máy chủ WMS / WFS và kết xuất với một đối tượng đồ họa Java. Sau đó, một cái gì đó như iText có thể chuyển đổi thành pdf.

Nếu bạn thực sự phải sử dụng Python, tôi hy vọng bạn có thể sử dụng trình bao bọc để quản lý tất cả.


1
cảm ơn. nhưng tôi chỉ muốn sử dụng Python ...
Simon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.