Da:Fugro/Setup

From OpenStreetMap Wiki
Jump to navigation Jump to search

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.