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