Valuma-alueet pilvipalvelusta Leaflet+Zoo+GeoServer -kombolla (Vuorovaikutteinen epävarmuuden huomioiva valuma-alueanalyysi avoimella lähdekoodilla IaaS-palvelussa) Janne Kovanen, Ville Mäkinen, Juha Oksanen ja Tapani Sarjakoski 26.10.2016 DevAlpo-seminaari 2016
Taustaa: Valuma-alueanalyysi Valuma-alueanalyysissä valitaan uoma ennalta määrätystä uomastosta Tälle uomalle etsitään alue, jolta vedet laskevat uomaan ja sen pääpurkupiste Tarjolla deterministisiä valuma-alueita varten SYKE:n interaktiivinen työkalu: http://paikkatieto.ymparisto.fi/value Taustalla Citrix ArcGIS-VALUE -työkalu Toteutus Silverlightilla (v. 2.0 HTML5?) Virtaussuuntamalli on laskettu valmiiksi Suomessa hilamuotoisen virtaussuuntamallin taustalla MML:n KM10
Taustaa: Valuma-alueanalyysi SYKE käyttää omaa Ranta10-uomaverkostoa; me käytämme toistaiseksi Uoma10-verkostoa KM10 reittejä korostetaan "polttamalla portaittain eri syvyyksille uomaverkoston pääreitistö + joet + vesistö Pinnasta täytetään uomaverkoston ulkopuoliset ulosvirtauksen estävät painanteet D8-algoritmilla lasketaan pinnasta virtaussuunnat Lopullinen tulos saadaan seuraamalla virtaussuuntamallin arvoja
Taustaa: Epävarmuuden huomioiva valuma-alueanalyysi
Taustaa: CSC:n IaaS-pilven kokoonpanot
Sovellus-arkkitehtuuri WPS PNG8 WMS GeoJSON REST EHdr
Web-sovellus
Web-palvelin
Esimerkki haasteista: GeoServer- + Leafletmonimittakaavaesitys Ongelma: GeoServer:llä ei luontaista tukea kuvapyramideille! Vaihtoehto LayerGroup: Tasoilla ei MapServerin tapaista resoluutio/mittakaavarajoitetta Vaihtoehto GeoTools/ImagePyramid-liitännäinen: Käyttää pyramidin tasoja vain jos kyselyn ulottuvuus on 100% alimman tason sisällä -> Muutoin interpolointi alimmalta tasolta! Leaflet kyselee tiilet siten, että tiilen rajat on tiilen ulottuvuuksilla jaolliset lähtien koordinaattijärjestelmän origosta
Esimerkki haasteista: GeoServer- + Leafletmonimittakaavaesitys Ongelma: GeoServer:llä ei luontaista tukea kuvapyramideille! Vaihtoehto LayerGroup: Tasoilla ei MapServerin tapaista resoluutio/mittakaavarajoitetta Vaihtoehto GeoTools/ImagePyramid-liitännäinen: Käyttää pyramidin tasoja vain jos kyselyn ulottuvuus on 100% alimman tason sisällä -> Muutoin interpolointi alimmalta tasolta! Leaflet kyselee tiilet siten, että tiilen rajat on tiilen ulottuvuuksilla jaolliset lähtien koordinaattijärjestelmän origosta
Esimerkki haasteista: GeoServer- + Leafletmonimittakaavaesitys Ongelma: GeoServer:llä ei luontaista tukea kuvapyramideille! Vaihtoehto LayerGroup: Tasoilla ei MapServerin tapaista resoluutio/mittakaavarajoitetta Vaihtoehto GeoTools/ImagePyramid-liitännäinen: Käyttää pyramidin tasoja vain jos kyselyn ulottuvuus on 100% alimman tason sisällä -> Muutoin interpolointi alimmalta tasolta! Leaflet kyselee tiilet siten, että tiilen rajat on tiilen ulottuvuuksilla jaolliset lähtien koordinaattijärjestelmän origosta Jokainen valuma-alue on laajennettava alueelle, jolla kuvapyramidin ylin taso on tasajaollinen > Datan määrä / pitkä vaste datan pakkaamisesta! Ratkaisu: kaikki tasot julkaistaan riippumattomina toisistaan! Toimii, mutta ei konseptuaalisesti kaunista Vaatii Leaflet:ssa (maxzoom, minzoom, styles, )
Esimerkki haasteista: Leaflet + GeoServer/GeoWebCache GeoServer tarjoaa tiilityspalveluna integroidun GeoWebCachen vaatii mm. asettamaan kyselyihin tiled-parametrin, saman CRS:n, tiilitystä vastaavan ulottuvuuden asettamisen olennaiset parametrit on liitettävissä kyselyyn tason määrittelyn kautta Ongelmat: Leaflet tekee tiilien ulottuvuuden laskennan liukuluvuilla ja Ratkaisu: liukuluvut muutettava web-sovelluksessa ennen kyselyä Layer = new L.tileLayer.wms( ); layer.gettileurl = function(coords) { var tilebounds = this._tilecoordstobounds(coords), nw = this._crs.project(tilebounds.getnorthwest()), se = this._crs.project(tilebounds.getsoutheast()), bbox = ([Math.round(nw.x), Math.round(se.y), Math.round(se.x), Math.round(nw.y)]).join(','), url = L.TileLayer.prototype.getTileUrl.call(this, coords); return url + L.Util.getParamString(this.wmsParams, url, this.options.uppercase) + (this.options.uppercase? '&BBOX=' : '&bbox=') + bbox; }
Esimerkki haasteista: Leaflet + GeoServer/GeoWebCache Ongelmat: Leaflet asettaa tiilityksen origoksi aina koordinaattijärjestelmän origon Ratkaisu: origo on huomioitava GeoWebCache/gridset määrittelyssä
Esimerkki haasteista: Zoo + GDAL + Standardituloste Esimerkiksi GDAL-binäärisovellukset kirjoittavat standarditulosteeseen (std::out) Zoo:n XML-tiedostot kirjoitetaan standarditulosteen kautta Ohjaus jätetään päälle prosessien ajaksi -> Yksikään ohjelma ei saa käyttää tulostetta sotkematta ExecuteResponse-dokumenttia! Ratkaisu: Sovellusten tuloste on uudelleenohjattava: try: args = ['gdalwarp', '--config', 'GDAL_DATA', '/usr/local/share/gdal', '-of, 'EHdr', '-dstnodata', '-100', '-te', bbox[0], bbox[1], bbox[2], bbox[3], src, trg] output,error = subprocess.popen(args, stdin=subprocess.pipe, stdout=subprocess.pipe, stderr=subprocess.pipe).communicate() except subprocess.calledprocesserror: return False Return True