WMS / WFSをリクエストし、image / PDFとして保存するためのPython Libはありますか?


18

別のGISサーバー(GeoServerなど)からのWMS / WFSの呼び出しをサポートし、応答データ(WMS BasemapおよびWFSレイヤー)を写真として保存するためのAPIを備えたPythonオープンソースGISライブラリがあるかどうか疑問に思っています。

推奨事項はありますか?

入力をありがとう!

更新

私がしようとしているのは、OpenLayersをフロントエンドとして、Djangoをサーバーとして使用する地図印刷サービスです。クライアントユーザーがエクステントとレイヤーを設定し、印刷要求(パラメーター、つまり、マップエクステント、レイヤーの名前を参照)をサーバーに送信し、サーバーがこの要求を引き継ぎ、要求パラメーターを使用してWMS / WFSを再度呼び出し、保存します応答をPDFとして、このPDFリンクをクライアントにエクスポートします。

困難な部分は、サーバーがWMS / WFSを呼び出してこれらの応答を結合/オーバーレイする方法です(つまり、WMSは通常ベースマップであり、WFSはフィーチャレイヤーを指すため、これらのマップ/レイヤーを結合する)。画像として。

現在の回答では、urllibは良いもののようですが、これらの応答(WMS、WFS)をどのように組み合わせるかはわかりません。OWSLibも別の良いオプションのように見えますが、それはクライアントプログラミングツールであることを示しています。

その他の入力

感謝する!


あるとは思いませんが、それは良いアイデアです!
OptimizePrime

更新された質問が、WMSをPDFに結合することに関する私の質問に関連しいることに気付いただけです。
MarkJ

回答:


18

必要なものを正確に提供するOWSLibがあります。

OWSLibは、Open Geospatial Consortium(OGC)Webサービス(したがってOWS)インターフェース標準および関連するコンテンツモデルを使用したクライアントプログラミング用のPythonパッケージです。

OWSLibは、多数のOGC Webサービスインターフェイスのサービスメタデータとラッパーにアクセスするための共通APIを提供します。

ドキュメントと例はこちら。このコンテキストのクライアントは、WMS / WFSサーバーのクライアントアプリケーションであることを意味します。必要に応じてサーバー上で実行できます。

回答に詳細を追加すると、MapFish印刷アプリケーションがニーズにぴったり合っているように見えます。これは、OpenLayersと統合し、タイル、WMS、WFSなどをつなぎ合わせてPDFを生成できるJavaアプリケーションです。

コマンドラインアプリケーションであるため、Pythonラッパーで操作できます。詳細については、次のリンクを参照してください。

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

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


1
OWSLibへのポインタをありがとう、聞いたことがない。
user2856

7

python urllibライブラリを使用して、WMSを直接呼び出し、応答をファイルに書き込むことができます。この回答では urllibを使用する適切な例があります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 =のように、URLをWMSのURLに置き換えるだけです。 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を使いたい
サイモン・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.