WMS / WFS를 요청하고 이미지 / PDF로 저장하기위한 Python Lib이 있습니까?


18

다른 GIS 서버 (예 : GeoServer)에서 WMS / WFS 호출을 지원하고 응답 데이터 (WMS Basemap 및 WFS 레이어)를 그림으로 저장하는 API가있는 Python 오픈 소스 GIS lib가 있는지 궁금합니다.

어떤 추천?

모든 입력에 감사드립니다!

업데이트 :

내가하려고하는 것은 OpenLayers를 프론트 엔드로 사용하고 Django를 서버로 사용하여 맵 인쇄 서비스입니다. 클라이언트 사용자는 범위와 레이어를 설정 한 다음 인쇄 요청 (매개 변수, 즉 맵 범위, 레이어 이름 참조)을 서버로 보낸 다음 서버는이 요청을 인계하고 요청 매개 변수를 사용하여 WMS / WFS를 다시 호출하고 저장합니다. PDF로 응답하려면이 PDF 링크를 클라이언트로 내 보냅니다.

어려운 부분은 서버가 WMS / WFS를 호출하고 이러한 응답을 결합 / 오버레이하는 방법 (즉, WMS는 일반적으로 기본 맵이므로 WFS는 피처 레이어를 가리킴)으로 이러한 맵 / 레이어를 결합하여 최종적으로이 결합 된 오브젝트를 저장하는 방법입니다. 이미지로.

현재 답변에서 urllib은 좋은 것으로 보이지만 이러한 응답 (WMS, WFS)을 결합하는 방법을 잘 모르겠습니다. OWSLib은 또 다른 좋은 옵션 인 것처럼 보이지만 클라이언트 프로그래밍 도구임을 나타냅니다. 내 용도에 적합한 지 약간 혼란 스럽습니다 ...

다른 추가 입력 ???

평가하다!


나는 생각하지 않지만 좋은 생각입니다!
OptimizePrime

방금 업데이트 된 질문이 WMS를 PDF로 결합하는 것에 관한 내 질문 과 관련이 있음을 알았습니다 .
MarkJ

답변:


18

OWSLib 정확히 당신이 필요로하는 무엇을 제공해야한다.

OWSLib는 OGC (Open Geospatial Consortium) 웹 서비스 (따라서 OWS) 인터페이스 표준 및 관련 컨텐츠 모델을 사용하는 클라이언트 프로그래밍을위한 Python 패키지입니다.

OWSLib는 수많은 OGC 웹 서비스 인터페이스를위한 서비스 메타 데이터 및 래퍼에 액세스하기위한 공통 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를 사용하는 적절한 예가 있습니다. URL을 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로 변환 될 수 있습니다.

파이썬을 정말로 사용해야한다면 래퍼를 사용하여 모든 것을 관리 할 수있을 것으로 기대합니다.


1
감사. 하지만 난 그냥 파이썬을 사용하고 싶습니다 ...
Simon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.