Da:Fugro/Setup
Fugro-laget fungerer ved hjælp af en mængde data og software i sammenspil. Pt. drives laget af Peter Brodersen.
Denne side beskriver den generelle serveropsætning, vi gør brug af. Udgangspunktet er Linux, Debian Stable (Lenny).
Datagrundlag
Datagrundlaget er 662 .ecw-filer fra Fugro Aerial Mapping A/S. Filerne fylder fra få MB til 235 MB. Tilsammen fylder filerne 77,4 GB.
Hver fil dækker en kvadrant på 10kmx10km i EPSG25832-projiceringen (Euref89/ETRS89). Filerne er navngivet efter deres position, fx 10km_636_59.ecw - hvor 636 og 59 dækker over Northing og Easting (* 10 km).
Indeksering
Alle filer er indekseret til en Shapefile vha. gdalindex
:
gdaltindex -tileindex LOCATION -write_absolute_path fugroindex.shp 10km_ecw_e89/*.ecw
Dette opdaterer (evt. opretter) filen fugroindex.shp
, som vi kan henvise Mapserver til.
Mapserver
Softwaregrundlaget er Mapserver, som er en CGI-applikation. Som udgangspunkt har GDAL-biblioteket (som mapserver bruger) ikke understøttelse for ECW, så dette bibliotek ønsker vi at compile.
Til Debian Stable (Lenny) har vi hentet følgende pakker med git:
git clone http://rivendell.lovergine.com/pubgit/ecw.git/ git clone http://rivendell.lovergine.com/pubgit/libgdal-ecw.git/
Først bygges .deb-filer ud af ecw blot ved at køre debuild
. Efter de er installeret, bygges en .deb ud af libgdal-ecw på samme, som installeres.
Nu er der support for ECW-filer i libgdal. Dette kan bekræftes med:
gdalinfo --formats|grep -i ecw
.. som gerne skulle outputte noget i stil med:
ECW (rw): ERMapper Compressed Wavelets JP2ECW (rw+): ERMapper JPEG2000
Dertil kommer, at mapserver fra Debian Stable (Lenny) er en udgave, der ikke har understøttelse for tilemode. Kører man en nyere udgave end Lenny (eller evt. anden distribution) med en tilsvarende nyere mapserver, vil det virke uden videre. Ellers skal vi compile mapserver, blot ved at downloade mapserver-kildeteksten, configure (med relevante options) og make. Den resulterende mapserv-fil flyttes blot til /usr/lib/cgi-bin/ eller andet passende sted til script-afvikling.
I vores tilfælde blev mapserver konfigureret med følgende options:
./configure --with-proj --with-gdal --with-agg --with-jpeg
Mapfiler
Mapfiler er konfigurationsfiler til Mapserver, som beskriver den nærmere konfiguration af, hvad der skal outputtes. De refererer til fugroindex.shp-shapefilen.
Ideelt burde man sikkert kunne nøjes med én mapfil med forskellige layers i.
Fotos
fugro.map med laget ved navn "fugro" bruges til at outputte tiles:
MAP IMAGETYPE jpeg EXTENT 470000 6070000 730000 6250000 SIZE 400 300 IMAGECOLOR 255 255 255 PROJECTION "init=epsg:25832" END LAYER NAME "fugro" STATUS ON TILEINDEX "/home/username/web/fugro/mapserv/fugroindex.shp" TILEITEM "LOCATION" TYPE RASTER END END
Oversigt
overview.map er et overlagskort, der viser hvilke områder, de forskellige .ecw-filer dækker over. Det kan bruges hvis et område melder fejl, men har nok ikke den store funktion inde i en editor. Oversigten hjalp også til at prioritere køen af filer til upload, før alle var online:
MAP IMAGETYPE transpng EXTENT 440000.000000 6040000.000000 900000.000000 6410000.000000 SIZE 3000 1800 IMAGECOLOR 255 255 255 SHAPEPATH "/home/username/web/fugro/mapserv/10km_ecw_e89" FONTSET "/home/username/web/fugro/mapserv/fonts.list" PROJECTION "init=epsg:25832" END OUTPUTFORMAT NAME "transpng" DRIVER AGG/PNG MIMETYPE "image/png" IMAGEMODE RGBA TRANSPARENT ON EXTENSION "png" END LAYER NAME "denmark" STATUS ON DATA ortooversigt TYPE POLYGON LABELITEM "NAVN" CLASS NAME "Denmark" STYLE COLOR 232 232 232 OUTLINECOLOR 32 32 32 END LABEL COLOR 255 0 0 SHADOWCOLOR 255 255 255 SHADOWSIZE 0 0 TYPE TRUETYPE FONT DejaVuSans SIZE 9 ANTIALIAS TRUE POSITION CC PARTIALS FALSE MINDISTANCE 300 BUFFER 4 WRAP "_" END END END END
Oversigten gør brug af ortooversigt.shp, som blev leveret sammen med billedfilerne, og ligger i samme mappe som billedfilerne (10km_ecw_e89).
fonts.list er blot en henvisning til en TrueType-fil, og rummer blot:
DejaVuSans /usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf
Apache
Serveren kører i forvejen Apache 2.2. Der er oprettet en virtual host til formålet med relevant konfiguration.
Den rå URL til en ressource er fx:
/cgi-bin/mapserv?map=/home/username/web/fugro/mapserv/fugro.map&layers=fugro&mode=tile&tilemode=gmap&tile=17472+10400+15
Her henvises til mapfilen fugro.map
, det relevante lags navn, at serveren skal spytte en tile tilbage, at koordinaterne er i gmap-format og så endelig koordinaten på den relevante tile (x,y,z).
Idet størstedelen af disse parametere ikke er relevant over for brugeren, plus at vi gerne vil have mulighed for at ændre konfigurationen internt uden at påvirke URLs, vælger vi at rewrite URL'en. Dette er også af hensyn til have mere enkle URLs til billedlaget i de forskellige editors.
Mapserver er ret ressourcekrævende, både i forhold til hukommelse og CPU, så en oplagt optimering har været at sætte caching op. Dette kan gøres på utallige måder (Varnish, Nginx, TileCache, m.m.). Vi har valgt Apaches egen mod_cache for ikke at introducere endnu et led af software, og for at kunne styre cachingen på virtual host-niveau, uagtet af øvrige websites på kørende på serveren.
Enkelte gange kan mapserver fejle under genereringen af tiles, typisk hvis serveren løber tør for hukommelse undervejs. Idet requests er meget intensive, svinger hukommelsesforbruget ved flere samtidige requests meget op og ned. Crasher mapserver undervejs, vil der ikke blive genereret en tile (og dermed heldigvis heller ikke en "død" tile i cachen), så typisk kan brugeren blot reloade eller zoome ind og ud for at få en god tile.
RewriteRule
Vi har følgende regler i en .htaccess
-fil, som ligger i DocumentRoot for den virtuelle host:
RewriteEngine On # Aerial Imagery and File Reference RewriteRule ^fugro2005//?([0-9]+)/([0-9]+)/([0-9]+)\.(png|jpe?g)$ /cgi-bin/mapserv?map=/home/username/web/fugro/mapserv/fugro.map&layers=fugro&mode=tile&tilemode=gmap&tile=$2+$3+$1 [PT,L] RewriteRule ^fugro2005/overview/([0-9]+)/([0-9]+)/([0-9]+)\.(png|jpe?g)$ /cgi-bin/mapserv?map=/home/username/web/fugro/mapserv/overview.map&layer=denmark&mode=tile&tilemode=gmap&tile=$2+$3+$1 [PT,L]
PT-flaget (passthrough) er sat for at vi kan referere til /cgi-bin/, som ikke ligger i DocumentRoot, men er ScriptAlias'et ind.
Vælger man at lægge reglerne i virtual host-konfigurationen i stedet for i en .htaccess-fil, skal de forskellige RewriteRule-udtryk indledes med en slash, fx:
RewriteRule ^/fugro2005...
mod_cache
Apaches mod_cache og mod_disk_cache (følger med Apache Core i version 2.2, ikke enabled pr. default) er sat op til at cache requests til mapserv. Fra virtual host-filen:
CacheEnable disk /cgi-bin/mapserv CacheIgnoreNoLastMod On CacheMaxExpire 2592000
MaxExpire er her sat til 2592000 sekunder, svarende til 30 døgn. Uanset hvad en ressources Expire-tid er sat til i HTTP-headeren, gør cachen ikke brug af ældre filer. Default er et døgn, så denne er relevant at sætte højt op.
Cachen bliver vedligeholdt og ryddet op af htcacheclean
. Denne er i Debian konfigueret i /etc/default/apache2
. Her kan man også justere cachens max-størrelse, fx:
HTCACHECLEAN_SIZE=5000M
mod_expires
mod_cache cacher kun filer med querystring (dvs. URLs hvor ? indgår - efter den er rewrite't - dvs. alle tile-requests), hvis der er sat en Expire-header. Mapserver sætter ikke selv denne header, så den skal vi selv få tilføjet.
mod_expires (ikke enabled pr. default) giver mulighed for at sætte denne header, baseret på filtype, m.m.
Fra virtual host-konfigurationen tilføjer vi følgende direktiver:
ExpiresActive On ExpiresByType image/jpeg A2592000
Her beder vi Apache om at sætte en Expires-header på image/jpeg-output (bl.a. de filer, Mapserver genererer - med præmisset, at vi genererer JPEG-filer), på 2592000 sekunder (= 30 døgn) efter klientens request.