Szerkesztés alatt! hibás linkek, stb.

A MapServer használata

Mi az a MapServer?

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 Mapfile

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:

Magyarázat

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 mapserv CGI paraméterezése

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:

Interaktív kliens-oldali megjelenítő használata

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.

Elemek osztályozása

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.

Lehetséges bemeneti adatformátumok

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

Névrajz

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:

A nevekről részletesebben

Diagram rétegek

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 elemek

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:

Kimeneti formátumok

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
...
  

Osztályok méretarányfüggő megjelenítése

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.

Jelek definiálása a SYMBOL objektummal

Az 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:

Bővebben a SYMBOL objektumról

A jelmagyarázat formázása a LEGEND objektummal

Alapszabály: a jelmagyarázatban minden olyan osztály megjelenik, aminek nevet adtunk a NAME tulajdonság beállításával.

Részletes dokumentáció itt.

Térképi elemek definiálása a FEATURE objektummal

A 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 alapanyag használata

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:

A MapServer kimeneti lehetőségei

Térkép
A legegyszerűbb eset. A MapServer CGI-t ?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.
Jelmagyarázat
?mode=legend paraméter használatakor. Egy képet kapunk, mely a térképen előforduló osztályok jelmagyarázatát tartalmazza.
WMS szolgáltatás
Az OGC szabványnak megfelelő webes térképszolgáltatás. A megfelelő működéséhez oda kell figyelni, hogy minden szükséges beállítás szerepeljen a mapfile-ban. Általában ezt használjuk, ha pl. OpenLayers segítségével jelenítjük meg a térképünket.
A lehetséges kérések:
WFS szolgáltatás
Az OGC szabványnak megfelelő vektoros adatszolgáltatás. Az adott térképen szereplő, a kérésnek megfelelő elemek geometriai, és attribútumadatait kapjuk meg, általában XML formátumban.
TMS
Ezt akkor használjuk, ha a Google Maps vagy hasonló térképszolgáltatások által használt szabvány szerinti térképmozaik-darabokra van szükség. A CGI ?mode=tile paraméterezésével érhető el.

WMS szerver beállításai

Ha szabályosan működő WMS szervert szeretnénk megvalósítani MapServerrel, akkor a következőkre kell odafigyelnünk:

Minta MapFile
A fenti MapFile-t használó weboldal

WFS szerver konfigurálása (még kidolgozandó!)

minta MapFile
Minta wfs kérés

Összetett vonaltípusok; szimbólumok (MapFile)

Nyers OSM adatok osztályozása

a használt MapFile
Az eredmény