Načítání dat pomocí webových služeb OGC

Open Geospatial Consortium (OGC) je mezinárodní standardizační organizace. Její členové se zabývají vývojem a údržbou standardů pro prostorová data a služby. Mezi nejznámnější OGC standardy patří formát Geography Markup Language, Keyhole Markup Language a tzv. Otevřené webové služby (OGC OWS), mezi které patří Web Mapping Service (OGC WMS), Web Feature Service (OGC WFS), Web Coveradge Service (OGC WCS) a další.

Standardy OGC OWS jsou postaveny na komunikaci mezi serverem a klientem (client-server protocol), kdy klient (váš počítač) posílá serveru (počítači, ze kterého chcete získat data či na něm spusit službu) požadavky. Server odpovídá prostřednictvím souboru ve formátu XML. Požadavek může mít buď podobu speciálního URL, kdy jednotlivé paramery jsou od sebe odděleny znakem &, například:

http://server/sluzba/request=GetCapabilies&service=WMS

V tomto případě posíláme 2 parametry: request má hodnotu GetCapabilities a parametr service má hodnotu WMS.

Další možností je poslat serveru požadavek jako soubor ve formátu XML, například:

<wps:GetCapabilities xmlns:wps="http://www.opengis.net/wps/1.0.0" ...>
     <ows:Identifier>Buffer</ows:Identifier>
</wps:Execute>

Práce s těmito dotazy a zpracovávání odpovědí může být komplikovaná. Jednotlivé zápisy se liší každou verzi standardů. Také proto vznikla knihovna OWSLib, která život programátorů značně usnadňuje.

OWSLib

Knihovna OWSLib je Python rozhraní pro otevřené webové služby OGC OWS. Knihovna umožňuje se připojit k různým službám a pracovat s nimi z pozice klienta a to bez ohledu na serverovou implementaci. Knihovna momentálně podporuje standardy WMS, WFS, WCS, CSW, WPS, SOS, WMC a další (seznam se stále rozšiřuje).

Dokumentace: http://geopython.github.io/OWSLib/

OGC CSW

Chceme-li nějakou OGC webovou službu začít využívat, musíme především znát její adresu. Také pro tento účel vznikají katalogové služby, kdy specializované servery udržující metadatové záznamy webových služeb a datových souborů. Pro Českou republiku je organizací Cenia udržován Národní geoportál INSPIRE, který obsahuje informace o všech dostupných webových službách a datových souborech poskytovaných veřejnou správnou. Umožňuje v nich vyhledávat pomocí stanardu OGC CSW.

Webové rozhraní k tomuto serveru najdete na adrese http://geoportal.gov.cz/web/guest/catalogue-client. Rozhraní pro webovou službu je dostupné na adrese http://geoportal.gov.cz/php/micka/csw/index.php.

from owslib.csw import CatalogueServiceWeb
cenia = CatalogueServiceWeb('http://geoportal.gov.cz/php/micka/csw/index.php')
print (cenia.service)
'CSW'

Vyhledávání záznamů:

cenia.getrecords2()
print (cenia.results)
{'matches': 422, 'nextrecord': 11, 'returned': 10}

Zjištění hodnot nalezených záznamů:

for rec in cenia.records:
    print (cenia.records[rec].title)
...
ÚP VÚC Adršpach
Pasport úpo na území Královéhradeckého kraje
VÚC Hradecko-Pardubické aglomerace
ÚP VÚC okresu Jičín
ÚP VÚC Krkonoše
ÚP VÚC Orlické hory a podhůří
ÚP VÚC Trutnovsko - Náchodsko
Prognóza rozvoje území kraje
Pasport obcí ÚPD Pardubického kraje - mapová služba WMS
WMS služba Pardubického kraje - polohopis, ortofoto

Vyhledávání s omezením na záznamy obsahující slovo WMS a minimální ohraničující obdélník Prahy:

from owslib.fes import PropertyIsLike, BBox, And, PropertyIsEqualTo
wms_query = PropertyIsEqualTo('csw:AnyText', 'WMS')
praha_query = BBox([14.22,49.94,14.71,50.18])
praha_and_wms = And([praha_query, wms_query])
cenia.getrecords2([praha_and_wms], esn='full')
print (cenia.results)
{'matches': 351, 'nextrecord': 11, 'returned': 10}
for recid in cenia.records:
    record = cenia.records[recid]
    print (u'{}: {} {} {} {}'.format(record.title, record.bbox.minx, record.bbox.miny,
                                     record.bbox.maxx, record.bbox.maxy))

Vlastnosti záznamu:

zm_query = PropertyIsEqualTo('csw:AnyText', 'ZM10')
cenia.getrecords2([zm_query], esn='full')
zm10 = cenia.records['CZ-CUZK-WMS-ZM10-P']
print (zm10.type)
'service'
print (u'{}\n{}'.format(zm10.title, zm10.abstract))
Prohlížecí služba WMS - ZM 10
Prohlížecí služba WMS-ZM10-P je poskytována jako veřejná prohlížecí
služba nad daty Základní mapy ČR 1:10 000.  Služba splňuje Technické
pokyny pro INSPIRE prohlížecí služby v. 3.11 a zároveň splňuje
standard OGC WMS 1.1.1. a 1.3.0.
url = zm10.references[0]['url']
'http://geoportal.cuzk.cz/WMS_ZM10_PUB/WMService.aspx?service=WMS&request=getCapabilities'

OGC WMS

OGC Web Map Service slouží ke stahování a sdílení mapových dat. Ke klientovi nejsou posílána vlastní data, ale pouze náhled (obrázek) těchto dat.

Poznámka

Více informací na školení Úvod do GIS.

from owslib.wms import WebMapService
wms = WebMapService(url)
print (u'{}\n{}{}\n{}'.format(wms.identification.title,
                              wms.identification.abstract,
                              wms.provider.name,
                              wms.provider.contact.address))
Prohlížecí služba WMS - ZM 10
Prohlížecí služba WMS-ZM10-P je poskytována jako veřejná prohlížecí
služba nad daty Základní mapy ČR 1:10 000.
Zeměměřický úřad
Pod Sídlištěm 9

Dostupné mapové vrstvy:

print (wms.contents)
{'GR_ZM10': <owslib.wms.ContentMetadata instance at 0x7f1d7bc1b8c0>}

Rozsah vrstvy:

layer = 'GR_ZM10'
print ('{}\n{}'.format(wms.contents[layer].boundingBox,
                       wms.contents[layer].boundingBoxWGS84))
(-950003.175021186, -1250003.1750036045, -399990.474995786, -899996.8249909044, 'EPSG:5514')
(11.214011580382529, 47.96491460125967, 19.40766262309513, 51.691664934538636)

Stažení a uložení dat:


img = wms.getmap(
    layers=[layer],
    size=[800, 600],
    srs="EPSG:5514",
    bbox=[-950003, -1250003, -399990, -899996],
    format="image/png"
)
with open('data/wms_download.png', 'w') as out:
    out.write(img.read())

Důležité

Aktuálně OWSLib webové služby ČÚZK nedokáže konzumovat. Připojení ke službě padá na chybě requests.exceptions.TooManyRedirects: Exceeded 30 redirects.

Fungující ukázku lze prezentovat nad službou:

url='http://gis.nature.cz/arcgis/services/UzemniOchrana/Natura2000/MapServer/WmsServer'
layer='1' # Evropsky významné lokality (EVL)

Výše zmíněna služba AOPK podporuje pouze WMS verze 1.3.0. Vzhledem k tomu, že OWSLib používá ve výchozím nastavení verzi služby 1.1.1, je třeba verzi vynutit:

wms = WebMapService(url, version='1.3.0')

OGC WFS

Služba OGC Web Feature Service slouží ke stahování a sdílení vektorových dat. Nejčastějším výměnným formátem je OGC GML.

Poznámka

Předpokládáme, že máme naimportováno vše potřebné pro práci s katalogovou službou, pokud ne, vraťte se prosím výše, viz OGC CSW.

Nejprve najdeme nějaké WFS v katalogové službě:

wfs_query = PropertyIsLike('csw:AnyText', 'WFS')
aopk_query = PropertyIsLike('csw:AnyText', 'AOPK')
service_query = PropertyIsLike('apiso:type', 'service')
aopk_and_wfs = And([aopk_query, wfs_query, service_query])
cenia.getrecords2([aopk_and_wfs], esn='full')
print (cenia.results)
{'matches': 6, 'nextrecord': 0, 'returned': 6}
for recid in cenia.records:
    record = cenia.records[recid]
    print (u'{}: {}'.format(recid, record.title))
...
53e37222-89a0-472b-9781-5bfc0a02080a WFS Soustava území Natura 2000
53e37cd6-5cb8-4ee9-b862-62e10a02080a WFS Památné stromy
5473579f-fb08-48ab-893d-3d3e0a02080a WFS Chráněná území
54735935-a88c-4c58-99bc-3dee0a02080a WFS Mezinárodní ochrana přírody
53e47f1f-1bb8-405f-9254-514a0a02080a WFS Údaje o území
53f3708e-9d1c-4da6-983c-086e0a02080a WFS Průchodnost krajiny pro velké savce

Podíváme se, jaká data mají v Agentůře ochrany přírody a krajiny (AOPK):

natura = cenia.records['53e37222-89a0-472b-9781-5bfc0a02080a']
print (u'{}\n{}'.format(natura.abstract, natura.identifiers[1]['identifier']))
Služba zpřístupňuje geografická data soustavy území Natura 2000 v České republice; © AOPK ČR
https://gis.nature.cz/arcgis/services/UzemniOchrana/Natura2000/MapServer/
WFSServer?service=WFS&request=GetCapabilities&version=1.1.0

Načteme WFS AOPK:

from owslib.wfs import WebFeatureService
# nefunguje na pripojeni https, pouzijeme http
url = 'http://gis.nature.cz/arcgis/services/UzemniOchrana/Natura2000/MapServer/WFSServer'
aopk = WebFeatureService(url)

Zjistíme vlastnosti služby (Capabilities):

capabilities = aopk.getcapabilities()
print (capabilities.geturl())
'https://gis.nature.cz/arcgis/services/UzemniOchrana/Natura2000/MapServer/WFSServer?service=WFS&request=GetCapabilities&version=1.1.0'
print (u'{}\n{}\n{}\n{}\n{}'.format(aopk.provider.name,
                                    aopk.identification.title,
                                    aopk.identification.keywords[0],
                                    aopk.identification.fees,
                                    aopk.identification.abstract))
Agentura ochrany přírody a krajiny České republiky
Soustava chránených území evropského významu Natura 2000
Natura 2000, Chráněné území
žádné
Služba zpřístupňuje geografická data soustavy chránených území evropského významu Natura 2000 v České republice

Metadata

for rec in aopk.contents:
    print (rec)
...
UzemniOchrana_Natura2000:Ptačí_oblast
UzemniOchrana_Natura2000:Forma_ochrany_EVL_-_stav_k_24._5._2013
UzemniOchrana_Natura2000:Evropsky_významná_lokalita__EVL_

Načteme ještě službu chránených území

url='http://gis.nature.cz/arcgis/services/UzemniOchrana/ChranUzemi/MapServer/WFSServer'
chranena_uzemi_wfs = WebFeatureService(url)
for rec in chranena_uzemi_wfs.contents:
    print (rec)
...
UzemniOchrana_ChranUzemi:Maloploplošná_zvláště_chránená_oblast
UzemniOchrana_ChranUzemi:Smluvní_chránené_území
UzemniOchrana_ChranUzemi:Zákonem_chránené_pásmo_MZCHU
UzemniOchrana_ChranUzemi:Velkoplošné_zvláště_chránené_území
UzemniOchrana_ChranUzemi:Zonace_velkoplošného_zvláště_chráneného_území
identifier = u'ChranUzemi:Zonace_velkoplošného_zvláště_chráněného_území'
print (chranena_uzemi_wfs.contents[identifier])
<owslib.feature.wfs100.ContentMetadata instance at 0x7f90a1ec3e60>
print ('{}\n{}'.format(chranena_uzemi_wfs.contents[identifier].boundingBoxWGS84,
                       chranena_uzemi_wfs.contents[identifier].crsOptions))
(-891817.1765, -1209945.389, -440108.91589999903, -943075.1875)
[urn:ogc:def:crs:EPSG::5514]

Data

# getfeature nepodporuje UTF-8
identifier = 'ChranUzemi:Zonace_velkoplo\xc5\xa1n\xc3\xa9ho_zvl\xc3\xa1\xc5\xa1t\xc4\x9b_chr\xc3\xa1n\xc4\x9bn\xc3\xa9ho_\xc3\xbazem\xc3\xad'
features = chranena_uzemi_wfs.getfeature([identifier])
print (features)
<owslib.util.ResponseWrapper object at 0x7f697152df90>
print (features.read())
<wfs:FeatureCollection xsi:schemaLocation='https:gis.nature.cz:6443/arcgis/services/UzemniOchrana/Ch...

CUZK WFS

Todo

Nefunguje kraj.read()

cuzk = WebFeatureService('http://geoportal.cuzk.cz/wfs_au/wfservice.aspx',
                         version="2.0.0")
for c in cuzk.contents:
    print (c)
...
gmgml:OKRES
gmgml:KRAJ
gmgml:OBLAST
gmgml:MC
gmgml:OPU
gmgml:KU
gmgml:ZSJ
gmgml:SO
gmgml:STAT
gmgml:ORP
gmgml:OBEC
kraj = cuzk.getfeature(['gmgml:KRAJ'])
print (kraj.read())
<gmgml:FeatureCollection xsi:schemaLocation="http://www.intergraph.com/geomedia/gml http://geopor....