A MapServer az UMN (University of Minnesota) által kifejlesztett nyílt forráskódú webes kartográfiai/térinformatikai programcsomag. Működhet CGI programként (ebben a leírásban erről lesz szó), vagy a MapScript segítségével különböző szerveroldali script nyelvek kiegészítéseként.
Hivatalos MapServer dokumentáció
A program segítségével térképeket állíthatunk elő a legkülönfélébb formátumú raszteres és vektoros geoadatokból, azokon lekérdezéseket hajthatunk végre, stb.
A Maperver lelke a Mapfile, amely leírja, hogy a különböző adatforrások tartalmát hogyan ábrázoljuk a térképen. A Mapfile - ami egyébként egy egyszerű szövegfájl - kiterjesztése .MAP.
A Mapfile egymásba ágyazott objektumokból áll, melyek mindegyike az objektum típusát jelző kulcsszóval kezdődik (pl.: MAP, LAYER), és az END kulcsszóval végződik.
Nézzünk egy egyszerű Mapfile-t:
# Mapfile minta - Magyarország megyéi EOV-ban
MAP
NAME "Magyarország"
STATUS ON
SIZE 800 600 # képméret pixelben
IMAGETYPE png
EXTENT 420000 45000 950000 380000 # a térkép határai (most EOV koordináták)
SHAPEPATH "/geodata/eov" # az adatfájlok elérési útja
PROJECTION
"init=epsg:23700" # EOV vetület
END
LAYER
NAME "Megye"
TYPE polygon
DATA "megyek.shp"
STATUS DEFAULT
PROJECTION
"init=epsg:23700"
END
CLASS # az elemeket osztályokba soroljuk. Legalább 1 osztály kell.
NAME "default"
STYLE # a Megye réteg default osztályának megjelenítési beállításai
OUTLINECOLOR 0 127 0
COLOR 180 255 180
END
END
END
END
A Mapfile által leírt térképet a MapServer CGI programja segítségével hozhatjuk létre. Ezen a webszerveren (wms.elte.hu) ezt legegyszerűben úgy érhetjük el, ha a következő URL-t megnyitjuk egy böngészőben:
http://wms.elte.hu/cgi-bin/mapserv?map=/home/saman/mapserver/p1.map&mode=map,
aminek eredménye a következő kép lesz:
A http://wms.elte.hu/cgi-bin/mapserv URL-en található CGI program létrehozott egy raszteres térképet a paraméterként kapott fájlban (/home/saman/mapserver/p1.map) található Mapfile alapján.
Ez a MapServer map üzemmódja, amit a mode=map paraméter beállításával érünk el.
A Mapfile mindig tartalmaz egy MAP objektumot. Ez leírja a készítendő térkép általános tulajdonságait, és tartalmaz egy vagy több LAYER objektumot, melyek a különböző térképi rétegeket definiálják.
A # után található szövegek megjegyzések, nincs semmilyen hatásuk, csak segítik a megértést. Ez a térkép csak egy LAYER objektumot, azaz egy réteget tartalmaz, ami egy shapefile-ból nyeri az adatokat.
A réteg poligonokat tartalmaz (TYPE polygon), melyeket most egységesen egy osztályba sorolunk (a default nevűbe). Ennek az osztálynak a megjelenése: sötétzöld kontúr és halványzöld kitöltés.
FONTOS: Problémánk lehet a Mapfile értelmezéssel, ha azt Windowsos szövegszerkesztőben UTF-8 kódolással mentjük. Ennek oka az úgynevezett BOM (byte order mark) - egy speciális kód a fájl kezdetén, amely megzavarja az értelmezőt. A megoldás áttérés más kódolásra. Jobb szövegszerkesztőkben (pl. Notepad++) lehetőség van az "UTF-8 BOM nélkül" kódolás választására is; ezzel nem lesz probléma.
A MapServer természetesen nem csak az alapértelmezett méretben és kiterjedéssel tudja elkészíteni a térképet. Az URL-t különféle paraméterekkel is kiegészíthetjük.
A mapsize=400+300 a képméretet 400*300 pixelre állítja, a mapext=600000+200000+720000+290000 pedig egy kisebb részletet rajzol csak meg (a megfelelő koordináták közé esőt). A teljes URL így:
http://wms.elte.hu/cgi-bin/mapserv?map=/home/saman/mapserver/p1.map&mode=map&mapsize=400+300&mapext=600000+200000+720000+290000,
ami a következő képet adja:
A MapServer által szolgálatott térképeket általában valamilyen interaktív megjelenítő felület segítségével teszik hozzáférhetővé az interneten. Erre az egyik lehetőség az OpenLayers használata. A továbbiakban az egyszerűség kedvéért itt is ilyen módon lesznek mellékelve a mintapéldák. Az OpenLayers használatához ezen az oldalon is található útmutató. A fentebb definiált térkép például így néz ki egy OpenLayers megjelenítőn:
Egy egyszerű OpenLayers megjelenítő MapServerhez innen letölthető.
Az OpenLayers, és más hasonló megjelenítők általában a Web Map Service (WMS) protokollt használják a MapServerrel való kommunikációhoz.
Amennyiben valamilyen ehhez hasonló keretrendszert használunk a megjelenítéshez, a térképből semmit sem fogunk látni akkor, ha bármilyen hiba van a Mapfile-ban, vagy a felhasznált adatokban. Ilyenkor a hibakereséshez érdemes a MapServer map üzemmódját használni, mivel bármilyen hiba esetén az a kép helyett szöveges hibazeneteket ad vissza.
Ha az adatforrás nem csak geometriai információkat tartalmaz, hanem adatmezőket is, akkor ezek alapján egyszerűen osztályozhatjuk az elemeket, a különféle osztályokba tartozó elemeket pedig más és más módon jeleníthetjük meg. Ez a legegyszerűbb módja a tematikustérkép-készítésnek.
# Mapfile minta - Magyarország megyéi népesség alapján színezve
MAP
NAME "Magyarország"
STATUS ON
SIZE 800 600 # képméret pixelben
IMAGETYPE png
EXTENT 420000 45000 950000 380000 # a térkép határai (most EOV koordináták)
SHAPEPATH "/geodata/eov" # az adatfájlok elérési útja
PROJECTION
"init=epsg:23700" # EOV vetület
END
LAYER
NAME "Megye_nepesseg"
TYPE polygon
DATA "megyek.shp"
STATUS DEFAULT
PROJECTION
"init=epsg:23700"
END
CLASS
NAME "0-300000"
EXPRESSION ([Nepesseg]<=300000)
STYLE
OUTLINECOLOR 0 127 0
COLOR 180 255 180
END
END # class 0-300000
CLASS
NAME "3-500000"
EXPRESSION ([Nepesseg]<=500000)
STYLE
OUTLINECOLOR 0 127 0
COLOR 150 215 150
END
END # class 3-500000
CLASS
NAME "5-900000"
EXPRESSION ([Nepesseg]<=900000)
STYLE
OUTLINECOLOR 0 127 0
COLOR 110 185 110
END
END # class 5-900000
CLASS
NAME "900000-"
STYLE
OUTLINECOLOR 0 127 0
COLOR 80 155 80
END
END # class 0-300000
END
END
Eben a Mapfile-ban a megyéket népességük alapján soroljuk 4 osztályba. Minden osztálynál van egy EXPRESSION kifejezés, ami meghatározza, hogy melyik elemek esnek az adott osztályba.
A kifejezésben felhasználhatók az adatforrásban található adatmezők, melyek nevét szögletes zárójelek közé kell tenni. Az osztályozás során a MapServer minden elemet az első olyan osztályba helyez, amely szűrőjének megfelel. Az eredmény a következő:
A tematikus térképhez jelmagyarázat is készíthető, ha a CGI-t mode=legend paraméterrel hívjuk meg. Jelen esetben pl.:
http://wms.elte.hu/cgi-bin/mapserv?map=/home/saman/mapserver/p2.map&mode=legend
Ez következő képet eredményezi:
Az osztályozás során az elemek az első olyan osztályba kerülnek, amelyik EXPRESSION feltételének megfelelnek.
Amennyiben az osztályozási feltételel egyszerű egyenlőségek, gyorsíthatjuk a folyamatot:
a LAYER objektumban adjuk meg a CLASSITEM "attribútum" segítségével, hogy melyik attribútumot kell vizsgálni, az egyes osztályokban pedig az EXPRESSION után írhatjuk a konkrét értéket.
A MapServer rengeteg különféle adatformátumot képes kezelni. Ezek teljes listája a dokumentációban olvasható.
A leggyakoribb formátumok használatáról részletesebben
Ha egy réteg elemeihez neveket is akarunk írni a térképre, akkor egyrészt a réteg objektumban a LABELITEM elemmel meg kell határozni, hogy melyik attribútum legyen a név,
másrészt az osztályokban egy LABEL objektumot is definiálni kell.
A LABEL objektumban az adott osztályhoz tartozó betűtípust és egyéb beállításokat is megadhatunk, ha nem elégedünk meg az alapértelmezett cimkével.
... LABELITEM "Nev" ... CLASS ... LABEL END END # class ...
az eredmény:
Diagramokat is készíthetünk MapServerben. Ehhez egy chart típusú réteget kell készíteni. Az előző térképet kiegészíthetjük pl. a következő réteg-definícióval:
...
LAYER
NAME "Megye_osszetetel"
TYPE chart
DATA "megyek.shp"
PROCESSING "CHART_SIZE_RANGE= Nepesseg 15 30 200000 1700000"
STATUS DEFAULT
PROJECTION
"init=epsg:23700"
END
CLASS
NAME "Gyermek"
STYLE
SIZE [Gyermek]
OUTLINECOLOR 0 127 0
COLOR 255 0 0
END
END # class Gyermek
CLASS
NAME "Felnőtt"
STYLE
SIZE [Felnott]
OUTLINECOLOR 0 127 0
COLOR 0 255 0
END
END # class Felnőtt
CLASS
NAME "Idős"
STYLE
SIZE [Idos]
OUTLINECOLOR 0 127 0
COLOR 0 0 255
END
END # class Idos
END # layer Megye_osszetetel
...
Az eredmény a következő: (a térkép mellett az automatikusan generált jelmagyarázat is látható)
Vonalas elemekhez a réteg típusa legye "line": TYPE line.
A vonalas elemek stílusát legegyszerűbben a COLOR r g b és a WIDTH szélesség beállításokkal határozhatjuk meg.
Összetettebb vonaltípusokat is megadhatunk többféle stílus egymásra rakásával. Pl. egy autópálya esetén:
...
CLASS # Autópályák
EXPRESSION "AP"
NAME "Autopalya"
STYLE # alapvonal (ebből lesz a kontúr)
WIDTH 8
COLOR 127 127 127
END
STYLE # kitöltés
WIDTH 5
COLOR 250 220 127
END
STYLE # középvonal
WIDTH 1
COLOR 127 127 127
END
END # class Autópálya
...
A következő példában egy úthálózat elemei egy MapInfo fájlban vannak. A "Tipus" attribútum határozza meg, hogy az adott elem autópálya-e vagy főút.
...
LAYER
NAME "Foutak"
TYPE line
CONNECTIONTYPE OGR # MapInfo tab-okat így használunk, nem a DATA-val
CONNECTION "foutak.tab"
STATUS DEFAULT
PROJECTION
"init=epsg:23700"
END
CLASSITEM "Tipus"
CLASS # Autópályák
EXPRESSION "AP"
NAME "Autopalya"
STYLE # alapvonal (ebből lesz a kontúr)
WIDTH 8
COLOR 127 127 127
END
STYLE # kitöltés
WIDTH 5
COLOR 250 150 127
END
STYLE # középvonal
WIDTH 1
COLOR 127 127 127
END
END # class Autópálya
CLASS # Főutak
NAME "Fout"
STYLE # alapvonal (ebből lesz a kontúr)
WIDTH 5
COLOR 127 127 127
END
STYLE # kitöltés
WIDTH 2
COLOR 255 255 127
END
END
END # Főutak
...
Az eredmény:
A MAP objektumban az IMAGETYPE beállításával határozhatjuk meg a készülő térkép fájlformátumát.
Az előre definiált GIF, PNG, stb. formátumokon kívül sokféle beállítási lehetőségünk van, ezek pontos leírása itt található.
Egy lehetséges kimeneti formátum definíció:
... OUTPUTFORMAT NAME png DRIVER AGG/PNG MIMETYPE "image/png" IMAGEMODE RGBA EXTENSION "png" END ...
Az osztályok tulajdonságainál megadhatjuk azt is, hogy milyen méretarány-korlátok között jelenjenek meg:
... CLASS ... MAXSCALEDENOM 200000 MINSCALEDENOM 50000 ... END ...
Ez a lehetőség különösen hasznos, ha a méretarány csökkenésével el akarjuk hagyni a kevésbé fontos elemeket, pl. a mellékutcákat.
SYMBOL objektummalAz eddigi stílusdefiníciókkal csak egységes kitöltésű felületek és egyszerűbb vonaltípusok határozhatók meg.
Pontszerű jelekhez és más esetekben a SYMBOL objektum használatára van szükség.
Erre két lehetőségünk van: vagy magában a MapFile-ban, a MAP objektumon belül, vagy egy külön fájlban, amit a SYMBOLSET fájlnév segítségével csatolunk a MapFile-hoz.
Ez utóbbi eset akkor előnyös, ha több térképhez is ugyanazokat a jeleket szeretnénk használni.
Példák:
... SYMBOL # pont jel NAME "pont" TYPE ellipse POINTS 1 1 END FILLED true END # symbol pont SYMBOL # útpajzs szimbólum NAME "utpajzs" TYPE vector POINTS -10 10 0 15 10 10 10 0 -10 0 END FILLED true LINECAP round END # symbol utpajzs ...
Az első jel egy egyszerű kör, például településjelnek. A második egy útpajzs.
Ha a pontszerű jelet csak akkor akarjuk kirajzolni, ha a hozzá tartozó név is megjeleníthető, akkor point helyett annotation típusú layert használjunk:
...
LAYER
NAME "Fovarosok"
TYPE annotation
DATA "world_cap.shp"
STATUS DEFAULT
PROJECTION
"init=epsg:4326" # WGS84 latlon
END
LABELITEM "Capital"
CLASS
NAME "default"
STYLE
SIZE 5
COLOR 255 0 0
OUTLINECOLOR 0 0 0
SYMBOL "pont"
END # symbol
LABEL
POSITION auto
END # label
END # class
END # layer fovarosok
...
Az eredmény valami ilyesmi:
LEGEND objektummalAlapszabály: a jelmagyarázatban minden olyan osztály megjelenik, aminek nevet adtunk a NAME tulajdonság beállításával.
FEATURE objektummalA FEATURE objektum segítségével térképi elemeket adhatunk egy réteghez.
Ezt főleg akkor használjuk, ha kevés (<10), fix helyzetű elemet kell elhelyeznünk. Ilyenkor nincs szükség egy külön adatfájlra.
...
LAYER
NAME "Arc"
TYPE polygon
STATUS DEFAULT
PROJECTION
"init=epsg:23700"
END
FEATURE
POINTS 700000 100000 600000 100000 550000 180000 600000 260000 700000 260000 750000 180000 700000 100000 END
END
FEATURE
POINTS 630000 200000 600000 200000 615000 221000 630000 200000 END
TEXT "bal"
END
FEATURE
POINTS 670000 200000 700000 200000 685000 221000 670000 200000 END
TEXT "jobb"
END
CLASS
STYLE
OUTLINECOLOR 0 0 255
END
LABEL END
END
END
...
Az eredmény:
Bővebben lásd a dokumentációban
Raszteres kép is lehet egy réteg alapanyaga. Ilyenkor a réteg típusa raster. A kép helyzetét a világban egy ún. world file tartalmazza, amely megadja, hogy egy pixelnyi vízszintes vagy függőleges elmozdulás milyen vektornak felel meg a veületi koordináta-rendszerben, ezenkívül a kép bal felső sarkénak koordinátáit.
A world file neve a kép nevével megegyező, kiterjesztése JPEG képeknél .jgw, PNG-nél .pgw, stb. Egy 0.1 fok pixelméretű, az egész földet négyzetes hengervetületben bemutatóraszteres kép esetén a world fájl szerkezete a következő:
0.1 0.0 0.0 -0.1 -179.95 89.95
Egy példa a raster layerre:
...
LAYER
NAME "Foldgomb"
METADATA
"wms_title" "Reimer földgömb 1870"
END
TYPE raster
PROJECTION
"init=epsg:4326"
END
DATA "globe_greenwich.jpg"
STATUS DEFAULT
END
...
ami valahogy így néz ki:
?mode=map paraméterrel hívjuk meg.
A többi paraméter, illetve a mapfile-ban lévő beállítások szerinti térképet kapjuk.
A formátuma sokféle lehet: a legtöbb esetben JPEG vagy PNG, de a telepítési beállítások függvényében még rengeteg raszteres és/vagy vektoros fájlformátum is előfordulhat.?mode=legend paraméter használatakor. Egy képet kapunk, mely a térképen előforduló osztályok jelmagyarázatát tartalmazza.?mode=legend üzemmódjának megfelelője?mode=tile paraméterezésével érhető el.Ha szabályosan működő WMS szervert szeretnénk megvalósítani MapServerrel, akkor a következőkre kell odafigyelnünk:
MAP és minden LAYER objektumban legyen beállítva a NAME, PROJECTION és egy METADATA objektum, mely tartalmazza a WMS szolgáltatás címét és egyéb információkatMinta MapFile
A fenti MapFile-t használó weboldal