มี Python Lib สำหรับการร้องขอ WMS / WFS และบันทึกเป็นรูปภาพ / PDF หรือไม่?


18

ฉันสงสัยว่า Python lib - open source ของ Python นั้นมี API ที่รองรับการโทร WMS / WFS จากเซิร์ฟเวอร์ GIS อื่น (เช่น GeoServer) แล้วบันทึกข้อมูลการตอบกลับ (WMS Basemap และ WFS layer) เป็นรูปภาพ

คำแนะนำใด ๆ

ขอบคุณสำหรับอินพุตใด ๆ !

อัปเดต :

สิ่งที่ฉันพยายามทำคือบริการการพิมพ์แผนที่โดยใช้ OpenLayers เป็น front-end และ 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 Web Service จำนวนมาก

เอกสารและตัวอย่างที่นี่ ไคลเอนต์ในบริบทนี้หมายความว่ามันเป็นแอปพลิเคชันไคลเอนต์ไปยังเซิร์ฟเวอร์ WMS / WFS - มันสามารถทำงานบนเซิร์ฟเวอร์หากจำเป็น

หลังจากที่คุณเพิ่มรายละเอียดเพิ่มเติมลงในคำตอบของคุณดูเหมือนว่าแอปพลิเคชันการพิมพ์ MapFish จะตรงกับความต้องการของคุณ มันเป็นแอปพลิเคชั่น Java ที่สามารถรวมเข้ากับ OpenLayers และ stitches tile, WMS, WFS เป็นต้นไปด้วยกันและสร้าง PDF

เนื่องจากเป็นแอปพลิเคชันบรรทัดคำสั่งจึงสามารถจัดการได้ด้วยเครื่องมือห่อหุ้มงูหลาม ดูลิงค์ต่อไปนี้สำหรับรายละเอียดเพิ่มเติม:

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

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


1
ขอบคุณสำหรับตัวชี้ไปยัง OWSLib ฉันไม่เคยได้ยินมาก่อน
2856

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 & ความสูง = 600 image

คุณยังสามารถใช้ห้องสมุด 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 ฉันคาดหวังว่าคุณสามารถใช้ wrapper เพื่อจัดการมันทั้งหมด


1
ขอบคุณ แต่ฉันเพียงต้องการที่จะใช้งูหลาม ...
ไซมอน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.