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 MapServer 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" 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 "data" # 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 (mercator.elte.hu) ezt legegyszerűben úgy érhetjük el, ha a következő URL-t megnyitjuk egy böngészőben:
http://mercator.elte.hu/cgi-bin/mapserv?map=/home/oktatok/saman/public_html/hu/okt/mapserver/p1.map&mode=map,
aminek eredménye a következő kép lesz:
A http://mercator.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/oktatok/saman/public_html/hu/okt/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://mercator.elte.hu/cgi-bin/mapserv?map=/home/oktatok/saman/public_html/hu/okt/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.
A MapServer 6.0-ás verziójától kezdve a WMS szolgáltatáshoz mindenképpen be kell szúrnunk a Mapfile-ba a következőt (a MAP objektumban):
WEB # a WMS miatt kell METADATA "wms_enable_request" "*" END END
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" 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 "data" # 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://mercator.elte.hu/cgi-bin/mapserv?map=/home/oktatok/saman/public_html/hu/okt/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
objektumban definiálni kell az adott osztályhoz tartozó betűtípust és egyebeket.
... LABELITEM "Nev" ... CLASS ... LABEL TYPE bitmap SIZE medium COLOR 0 0 0 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 "Főutak" 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ó.
Sajnálatos hibája az AGG renderernek, hogy használatakor a bitmap labeleknél az ékezetes karakterek hibásan jelennek meg. Emiatt a bitmap fontokat csak a GD rendeerrel javasolt használni, az AGG esetében inkább truetype betűtípusokat alkalmazzunk.
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:
Megúszhatjuk a szimbólumok definiálását, ha kész jeleink vannak raszteres képként, ilyenkor a STYLE elemben lévő SYMBOL-nál elég megadni a kép (relatív vagy abszolút) URL-jét. Itt megadhatunk egy mezőnevet is [szögletes zárójelek között], ha az adott mező tartalmazza az elemhez tartozó jel url-jét.
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
... 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 ...
?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=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