„Mapnik” változatai közötti eltérés

A Turistautak.hu wikiből
(Képek előállítása)
a (Szükséges csomagok)
 
(2 szerkesztő 24 közbeeső változata nincs mutatva)
1. sor: 1. sor:
 
<center>'''Rasztertérképek készítése a Turistautak.hu adatbázisából Mapnik eszközkészlettel'''</center>
 
<center>'''Rasztertérképek készítése a Turistautak.hu adatbázisából Mapnik eszközkészlettel'''</center>
  
Ezen dokumentáció még fejlesztés alatt áll. Célja, hogy a megszerzett tapasztalatokat megosszam a Turistautak.hu közösségével és reprodukálhatóvá tegyem azt a folyamatot ameddig eljutottam. (--[[Szerkesztő:bpeti68|bpeti68]] 2008. november 17., 17:59 (UTC))
+
Ezen dokumentáció még fejlesztés alatt áll. Célja, hogy a megszerzett tapasztalatokat megosszam a Turistautak.hu közösségével és reprodukálhatóvá tegyem az előállítás folyamatát. (--[[Szerkesztő:bpeti68|bpeti68]])
  
Egy mintatérkép [http://peterbus.extra.hu/tuhu/ itt] megtekinthető. Mivel az ftp elérése meglehetősen kaotikus és
+
A térkép [http://turaterkep.hostcity.hu/ itt megtekinthető].
több mint 60 000 képkockát kell feltölteni az egész országrész lefedéséhez, így csak akkor frissítem, ha lényeges
+
 
változásokat sikerül elérnem a megjelenésben.
+
===Használt operációs rendszer===
 +
Ubuntu8.10
 +
 
 +
A lenti csomagok nagyrésze MS Windows alá is megtalálható, de van köztük 1-2 aminek csak a forrása érhető el, így a fordítással magunknak kell bajlódni.
  
===Használt oprendszer===
 
  Ubuntu8.10
 
  A lenti csomagok nagyrésze MS Windows alá is megtalálható, de
 
  van köztük 1-2 aminek csak a forrása érhető el, így a fordítással magunknak kell bajlódni.
 
 
 
 
===Szükséges csomagok===
 
===Szükséges csomagok===
  mapnik-utils
+
* mapnik-utils (Licensz: LGPL)
  python-mapnik
+
* python-mapnik
  mapnik-plugins
+
* mapnik-plugins
  libmapnik0.5
+
* libmapnik0.5 (Licensz: LGPL)
  python2.5
+
* gdal-bin (Licensz: Free and open source software)
  postgreSQL
+
* python2.5 (Licensz: [http://www.python.org/download/releases/2.5.2/license/ Python licence])
  python-pygresql
+
* postgreSQL (Licensz: BSD)
  postGIS
+
* postgresql-8.3-postgis
  osm2pgsql
+
* python-pygresql
  libgdal1-dev -ez csak a domborzatárnyékolás előállításához kell
+
* osm2pgsql (Licensz: GNU GPL)
 +
'''Domborzatárnyékoláshoz'''
 +
* libgdal1-dev
 +
* geotiff-bin (Forrás: [http://trac.osgeo.org/geotiff/ GeoTiff])
 +
* libgeotiff1.2 (Ha a listgeo reklamálja libgeotiff.so hiányát, akkor hozzunk létre egy ilyen nevű szimbolikus linket a libgeotiff.so.1.2.4 -re, jobbára a /usr/lib könyvtárban)
  
Továbbá szükséges még [http://geocaching.hu/users.geo?id=20713 szmi] kolléga [http://turistautak.hu/tracks.php?id=10984 tuhu2osm.c] programjának [http://peterbus.extra.hu/tuhu/tuhu2osm.c módosított változata]
+
Egyéb: http://svn.openstreetmap.org/applications/rendering/mapnik/generate_tiles.py
Ennek fordítása: gcc tuhu2osm.c -o tuhu2osm
+
 
 +
Továbbá szükséges még [http://geocaching.hu/users.geo?id=20713 szmi] kolléga [http://turistautak.hu/tracks.php?id=10984 tuhu2osm.c] programjának [http://turaterkep.hostcity.hu/tuhu2osm_2.c módosított változata]. (Licensz: GNU GPLv2)<br />
 +
Ennek fordítása: gcc tuhu2osm_2.c -o tuhu2osm
 +
 
 +
===Postgres és PostGIS beállítása ===
 +
Az alábbiak csak Ubuntus környezetre vonatkoznak:
 +
 
 +
Egyéb rendszerekre itt az eredeti leírás: http://wiki.openstreetmap.org/wiki/Mapnik/PostGIS
 +
 
 +
Hogy a továbbiakban egyszerűbb legyen a dolgunk, hozzunk létre egy adatbázis felhasználót olyan névvel és jelszóval, mint a sajátunk.
 +
* Legyünk előbb postgres: $ sudo -u postgres -i
 +
* Lépjunk be a postgresbe: $ psql
 +
* Hozzuk létre a felhasználót:
 +
<pre>postgres=#  CREATE USER <loginnevem> [egyéb opciók] CREATEDB LOGIN PASSWORD '<jelszavam>';</pre>
 +
* majd lépjünk ki: \q
 +
* Hozzuk létre a "gis" adatbázist:
 +
<pre>
 +
$ createdb -E UTF8 -O loginnevem gis
 +
$ createlang plpgsql gis
 +
</pre>
 +
* Aktiváljuk a PostGIS-t az adatbázison:
 +
<pre>
 +
$ psql -d gis -f /usr/share/postgresql-8.3-postgis/lwpostgis.sql
 +
</pre>
 +
* Majd tegyük az újonnan létrejött táblákat is a magunkévá (ne feledjük, ekkor még mint postgres vagyunk belépve "postgres@peter-desktop:~$"):
 +
<pre>
 +
$ echo "ALTER TABLE geometry_columns OWNER TO loginnevem; ALTER TABLE spatial_ref_sys OWNER TO loginnevem;"  | psql -d gis
 +
 
 +
</pre>
 +
* $ exit, és már kész is.
  
 
===Mapnik környezet és térképleíró beállítása===
 
===Mapnik környezet és térképleíró beállítása===
TODO:
+
'''TODO'''
- POI-k konvertálása hiányzik a tuhu2osm scripből.
+
* <del>POI-k konvertálása hiányzik a tuhu2osm scripből.</del>
- OSM.XML "térkép stílus leíró" rejtelmeinek feltárása.
+
**Megoldva, bár egyelőre kétségeim vannak, hogy egy "dagonya" típusú POI-t milyen bitképpel szimbolizáljak.
- turistajelzések megjelenítése a térképen.
+
* OSM.XML "térkép leíró" rejtelmeinek feltárása.
 +
* <del>turistajelzések megjelenítése a térképen.</del> Megoldva.
 +
** Jelek megjelenítése, ha több is halad egy úton párhuzamosan.
  
===Domborzat színezés és árnyékolás===
+
===Turistajelzések megjelenítése===
TODO:
+
[[Image:mapnik_tur_jel.png|thumb|128px|right|Turistajelek megjelenése]]
- geoTiff-ek összefűzése/darabolása
+
Első lépésként a ''polyline''-ok ''label''-jében található jelzéseknek kellett helyet találnom a postGIS adatbázisban. Ezt az eredeti tuhu2osm a Ref mezőbe tette, de így esetleg felülíródott az út referencia száma (ami előzőleg az Utnév paraméterből került oda) ha volt neki. Így én a tourism mezőt választottam. A módosított tuhu2osm már ezt tartalmazza.
- átlátszóság beállítása
+
A Mapnik szimbólumokat tartalmazó könyvtárába (/symbols) el kell helyeznünk a turistajelzések képeit PNG formátumban, majd a térképleíró XML fájlba a megfelelő stílusleíró szakaszban hivatkozni rájuk egy szabállyal. Ez praktikusan a "roads-text" szabály. Tovább bonyolítja a helyzetet, hogy egy úton több jelzés is haladhat, így nem tudjuk milyen sorrendben és hol helyezkedik el a mezőben a keresett karakter, ezért regular-expression alkalmazásával keresem. Erre szolgál a &lt;Filter&gt; elem.
 +
Ha az adott út tourism mezője tartalmaz K+ karaktersort, akkor a &lt;PointSymbolizer&gt; elemmel kirajzoltatjuk a megfelelő képecskét.
 +
Előzőleg a &lt;MaxScaleDenominator&gt; elemmel megadhatjuk, hogy milyen nagyítási szinten rajzolódjanak ki a jelzések.
 +
Az általam használt térképleíró letölthető [http://peterbus.extra.hu/tuhu/tuhu-template.xml innen]. Használatához először módosítani kell a set-mapnik-env script-ben a MAPNIK_MAP_FILE környezeti változó értékét osm.xml-ről tuhu.xml-re, majd a customize-mapnik-map paranccsal a template-ből legyártatjuk a saját rendszerünknek megfelelő tuhu.xml-t.
 +
 
 +
Példa a K+ jel keresésére és megjelenítésére:
 +
 
 +
<pre>
 +
<Style name="roads-text">
 +
...
 +
  <Rule>
 +
    <MaxScaleDenominator>100000</MaxScaleDenominator>
 +
    <Filter> [tourism].match('[K][\+]|[K][\+][ ]|[ ][K][\+][ ]|[ ][K][\+]') </Filter>
 +
    <PointSymbolizer file="%SYMBOLS_DIR%/kk.png" type="png" width="14" height="12" allow_overlap="false"/>
 +
  </Rule>
 +
</Style>
 +
</pre>
  
 
===Képek előállítása===
 
===Képek előállítása===
 +
A Mapnik háromféle adatforrásból képes kimenetet előállítani:
 +
# PostGIS (SQL) adatbázis
 +
# Shapefileok
 +
# Raszterek (Tif)
 +
 +
A harmadik (raszter) adatforrással lényegében csak egyetlen dolgot tud tenni, egy az egyben leképezi a kimenetre.
 +
Az első és a második variáció alkalmas igazán térkép előállítására. Az elsőnél további előny a tetszőleges SQL lekérdezés eredményeként fellépő sebességnövekedés.
 +
 +
====A térkép előállításának mechanizmusa nagy vonalakban====
 +
<table>
 +
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>TUHU.XML<br>térképstílus leíró</td><td>&rarr;</td><td align="center">&darr;</td><td>&larr;</td><td>POI-k bitképei (PNG)</td></tr>
 +
<tr><td><b>tuhu.mp</b></td><td>&rarr;</td><td>tuhu2osm</td><td>&rarr;</td><td>tuhu.osm (XML)</td><td>&rarr;</td><td>PostgresSQL</td><td>&rarr;</td><td>Mapnik</td><td>&rarr;</td><td><b>PNG/PDF/SVG</b></td></tr>
 +
<tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>SRTM</td><td>&rarr;</td><td>GeoTif</td><td>&rarr;</td><td align="center">&uarr;</td><td>&nbsp;</td><td>&nbsp;</td></tr>
 +
</table>
 +
 
# Töltsd le a régiók mp állományait zip-elve. Ehhez értelemszerűen rendelkezned kell a megfelelő jogosultságokkal.
 
# Töltsd le a régiók mp állományait zip-elve. Ehhez értelemszerűen rendelkezned kell a megfelelő jogosultságokkal.
 
# Csomagold ki és fűzd össze őket egyetlen mp-vé.
 
# Csomagold ki és fűzd össze őket egyetlen mp-vé.
# Konvertáld át UTF-8 formátumba.
+
# <s><del>Konvertáld át UTF-8 formátumba.</del></s> (Ezt megteszi a tuhu2osm)
 
# Engedd rá a tuhu2osm programra: (tuhu2osm tuhu.mp data.osm)
 
# Engedd rá a tuhu2osm programra: (tuhu2osm tuhu.mp data.osm)
 
# Importáld be a Postgres adatbázisba (osm2pgsql -m data.osm)
 
# Importáld be a Postgres adatbázisba (osm2pgsql -m data.osm)
49. sor: 113. sor:
 
A 2-5 lépésekhez használhatod [http://peterbus.extra.hu/tuhu/unzip_all ezt] a shell scriptet.
 
A 2-5 lépésekhez használhatod [http://peterbus.extra.hu/tuhu/unzip_all ezt] a shell scriptet.
 
A 7. lépés előtte a generate_tiles.py scriptben beállítandók a kívánt zoom szintek és a generálandó terület koordinátái, mivel a frissen telepített mapnik alapértelmezésben a teljes földgolyót le akarja gyártani.
 
A 7. lépés előtte a generate_tiles.py scriptben beállítandók a kívánt zoom szintek és a generálandó terület koordinátái, mivel a frissen telepített mapnik alapértelmezésben a teljes földgolyót le akarja gyártani.
 +
 +
===A renderelő mechanizmus teljesítménye===
 +
Jelenleg egy középkategóriás gépen futtatom.
 +
Alaplap: ASUS P4P800-VM/S alaplap
 +
Processzor: Hyperthread-es 2800MHz-es Northwood mag, 800FSB
 +
Memória: 512MB
 +
 +
Ezzel a konfigurációval, magassági szintvonalak nélkül a teljes országot 7-15 -ös zoomszinten kb.13 óra alatt készíti el.
 +
Szintvonalakkal ez felment duplájára.
 +
Nyilván, ha egyszer be van állítva és egyszer már legenerálta a teljes országot, a változott kisebb régiókkal sokkal hamarabb végez.
 +
Jelenleg készítem azt a scriptet, amit paraméterezve indítva csak az adott régiót befoglaló négyzet kockáit generálja le.
  
 
===Felhasznált dokumentációk===
 
===Felhasznált dokumentációk===
 
   [http://trac.mapnik.org/ Mapnik telepítése, használata]
 
   [http://trac.mapnik.org/ Mapnik telepítése, használata]
  
===Domborzat színezés, árnyékolás===
+
===Kontúr vonalak, domborzat színezés és árnyékolás===
 +
Domborzatárnyékoláshoz le kell töltenünk az SRTM adatokat a következő helyről:
 +
ftp://e0srp01u.ecs.nasa.gov/srtm/version2/SRTM3/Eurasia/
 +
Az adatok zipelve, 1x1 fokos szegmensekre osztva tartalmazzák a golyóbis magasságadatait.
 +
Minket tehát a következő állományok érdekelnek:
 +
ftp://e0srp01u.ecs.nasa.gov/srtm/version2/SRTM3/Eurasia/N45E016.hgt.zip
 +
...
 +
ftp://e0srp01u.ecs.nasa.gov/srtm/version2/SRTM3/Eurasia/N48E023.hgt.zip
 +
 
 +
Szükségünk lesz még az [http://mpa.itc.it/rs/srtm/srtm_generate_hdr.sh srtm_generate_hdr.sh] scriptre.
 +
Ha lent vannak az adatok, bontsuk ki őket a következő scripttel:
 +
<pre>
 +
#!/bin/bash
 +
 
 +
PREP_TABLE="1"
 +
for X in *.hgt.zip; do
 +
    yes | ./srtm_generate_hdr.sh $X
 +
    rm -f "${X%%.zip}"
 +
   
 +
    # Import 10m contours
 +
    rm -f "${X%%.hgt.zip}.shp" "${X%%.hgt.zip}.shx" "${X%%.hgt.zip}.dbf"
 +
    gdal_contour -i 10 -snodata 32767 -a height "${X%%.hgt.zip}.tif" "${X%%.hgt.zip}.shp"
 +
    [ "$PREP_TABLE" ] && shp2pgsql -p -I -g way "${X%%.hgt.zip}" contours | psql -q gis
 +
    shp2pgsql -a -g way "${X%%.hgt.zip}" contours | psql -q gis
 +
   
 +
    rm -f "${X%%.hgt.zip}.shp" "${X%%.hgt.zip}.shx" "${X%%.hgt.zip}.dbf"
 +
    rm -f "${X%%.hgt.zip}.bil"
 +
    rm -f "${X%%.hgt.zip}.hdr"
 +
    rm -f "${X%%.hgt.zip}.prj"
 +
#    rm -f "${X%%.hgt.zip}.tif"
 +
    unset PREP_TABLE
 +
done
 +
</pre>
 +
 
 +
A fenti script eredetileg betolta PostGIS adatbázisunkba a magasságvonalak rajzolásához szükséges adatokat, majd kitörölte a generált shape fájlokat. Az utolsó ''rm -f "${X%%.hgt.zip}.tif"'' parancs kiiktatásával azonban a tif-eket megőrizzük. Ezekre lesz szükségünk az árnyékolás és domborzatszínezés elkészítéséhez.
 +
 
 +
Következő lépésben összefűzzük a geotiffeket:
 +
<pre>
 +
gdal_merge.py -v -o <srtm.tif> -ul_lr <west> <north> <east> <south> <tif-directory>/*.tif
 +
</pre>
 +
'''Update:''' A teljes országot lefedő tif olyan nagy lett, hogy a Mapnik nem volt képes a memóriába tölteni. A megoldás az lett, hogy az országot 7 oszlopra bontottam az egész számú hosszúsági fokok mentén (E16-E17, E17-E18, ... E22-E23). Az így keletkezett 7 raszterrel már megbirkózott a program.
 +
 
 +
Majd egy kis korrekció amit [http://wiki.openstreetmap.org/index.php/HikingBikingMaps#Hill_Shading innen] puskáztam.
 +
Aki érti, hogy itt mi történik, az ne fogja vissza magát:
 +
<pre>
 +
gdal_translate -of GTiff -co "TILED=YES" -a_srs "+proj=latlong" <srtm.tif> <srtm_adapted.tif>
 +
</pre>
 +
Aztán a tiff Mercator projekcióra húzása:
 +
<pre>
 +
gdalwarp -of GTiff -co "TILED=YES" -srcnodata 32767 -dstnodata 32767 -t_srs "+proj=merc +ellps=sphere +R=6378137 +a=6378137 +units=m" -rcs -order 3 -tr 30 30 -multi <srtm_adapted.tif> <srtm_warped.tif>
 +
</pre>
 +
 
 +
Ezután jöhet a színezés, árnyékolás.
 +
Az alábbi scriptet mentsük el mint mkrelief.sh:
 +
<pre>
 +
#!/bin/sh
 +
 
 +
INFILE=$1
 +
OUTFILE=${2:-hillrelief.tif}
 +
PID=$$
 +
hillshade $INFILE .s_$PID.tif -s 370400 -z 20
 +
color-relief $INFILE scale.txt .c_$PID.tif
 +
listgeo .s_$PID.tif > .info_$PID.dat
 +
composite -blend 50 .c_$PID.tif .s_$PID.tif .geo_$PID.tif
 +
geotifcp -g .info_$PID.dat .geo_$PID.tif $OUTFILE
 +
rm -f .s_$PID.tif .c_$PID.tif .geo_$PID.gif .geo_$PID.tif .info_$PID.dat
 +
</pre>
 +
A fentiekből hillshade, color-relief és scale.txt [http://perrygeo.googlecode.com/svn/trunk/demtools/ innen] van.
 +
A listgeo és geotifcp a geotiff csomagból. (Forrást lásd fent.)
 +
A composite és convert az ImageMagic csomag részei.
 +
Használata:
 +
<pre>
 +
$ mkrelief.sh <srtm_warped.tif> <srtm_shaded.tif>
 +
</pre>
 +
 
 +
Ez el fog szöszölni pár órát.
 +
 
 +
Az eredmény valami ilyesmi lesz (kicsinyített részlet):
 +
 
 +
[[Kép:dunakanyar_hillshade.png|256 px]]
 +
 
 +
Ezt lehet majd betolni az úthálózat alá külön, kikapcsolható rétegként.
 +
 
 +
'''TODO'''
 +
* OpenLayers réteg elkészítése a kezelésükhöz
 +
 
 
Forrás:  
 
Forrás:  
 
   [http://www.perrygeo.net/wordpress/?p=7 GDAL-based DEM utilities]
 
   [http://www.perrygeo.net/wordpress/?p=7 GDAL-based DEM utilities]
 
   [https://lists.berlios.de/pipermail/mapnik-users/2008-August/001110.html [Mapnik-users] Shaded Relief]
 
   [https://lists.berlios.de/pipermail/mapnik-users/2008-August/001110.html [Mapnik-users] Shaded Relief]
   DEMTOOLS fordítása Ubuntu8.10 alatt:
+
   [http://wiki.openstreetmap.org/index.php/HikingBikingMaps OSM HikingBikingMaps]
  g++ `gdal-config --cflags` hillshade.cpp -o hillshade `gdal-config --libs`
+
 
  g++ `gdal-config --cflags` color-relief.cpp -o color-relief.cpp `gdal-config --libs`
+
DEMTOOLS fordítása Ubuntu8.10 alatt:
  g++ `gdal-config --cflags` aspect.cpp -o aspect `gdal-config --libs`
+
g++ `gdal-config --cflags` hillshade.cpp -o hillshade `gdal-config --libs`
  g++ `gdal-config --cflags` slope.cpp -o slope `gdal-config --libs`
+
g++ `gdal-config --cflags` color-relief.cpp -o color-relief.cpp `gdal-config --libs`
 +
g++ `gdal-config --cflags` aspect.cpp -o aspect `gdal-config --libs`
 +
g++ `gdal-config --cflags` slope.cpp -o slope `gdal-config --libs`
 +
 
 +
[[Kategória:Szerkesztési segítség]]

A lap jelenlegi, 2009. november 11., 12:20-kori változata

Rasztertérképek készítése a Turistautak.hu adatbázisából Mapnik eszközkészlettel

Ezen dokumentáció még fejlesztés alatt áll. Célja, hogy a megszerzett tapasztalatokat megosszam a Turistautak.hu közösségével és reprodukálhatóvá tegyem az előállítás folyamatát. (--bpeti68)

A térkép itt megtekinthető.

Tartalomjegyzék

Használt operációs rendszer

Ubuntu8.10

A lenti csomagok nagyrésze MS Windows alá is megtalálható, de van köztük 1-2 aminek csak a forrása érhető el, így a fordítással magunknak kell bajlódni.

Szükséges csomagok

  • mapnik-utils (Licensz: LGPL)
  • python-mapnik
  • mapnik-plugins
  • libmapnik0.5 (Licensz: LGPL)
  • gdal-bin (Licensz: Free and open source software)
  • python2.5 (Licensz: Python licence)
  • postgreSQL (Licensz: BSD)
  • postgresql-8.3-postgis
  • python-pygresql
  • osm2pgsql (Licensz: GNU GPL)

Domborzatárnyékoláshoz

  • libgdal1-dev
  • geotiff-bin (Forrás: GeoTiff)
  • libgeotiff1.2 (Ha a listgeo reklamálja libgeotiff.so hiányát, akkor hozzunk létre egy ilyen nevű szimbolikus linket a libgeotiff.so.1.2.4 -re, jobbára a /usr/lib könyvtárban)

Egyéb: http://svn.openstreetmap.org/applications/rendering/mapnik/generate_tiles.py

Továbbá szükséges még szmi kolléga tuhu2osm.c programjának módosított változata. (Licensz: GNU GPLv2)
Ennek fordítása: gcc tuhu2osm_2.c -o tuhu2osm

Postgres és PostGIS beállítása

Az alábbiak csak Ubuntus környezetre vonatkoznak:

Egyéb rendszerekre itt az eredeti leírás: http://wiki.openstreetmap.org/wiki/Mapnik/PostGIS

Hogy a továbbiakban egyszerűbb legyen a dolgunk, hozzunk létre egy adatbázis felhasználót olyan névvel és jelszóval, mint a sajátunk.

  • Legyünk előbb postgres: $ sudo -u postgres -i
  • Lépjunk be a postgresbe: $ psql
  • Hozzuk létre a felhasználót:
postgres=#  CREATE USER <loginnevem> [egyéb opciók] CREATEDB LOGIN PASSWORD '<jelszavam>';
  • majd lépjünk ki: \q
  • Hozzuk létre a "gis" adatbázist:
$ createdb -E UTF8 -O loginnevem gis
$ createlang plpgsql gis
  • Aktiváljuk a PostGIS-t az adatbázison:
$ psql -d gis -f /usr/share/postgresql-8.3-postgis/lwpostgis.sql
  • Majd tegyük az újonnan létrejött táblákat is a magunkévá (ne feledjük, ekkor még mint postgres vagyunk belépve "postgres@peter-desktop:~$"):
$ echo "ALTER TABLE geometry_columns OWNER TO loginnevem; ALTER TABLE spatial_ref_sys OWNER TO loginnevem;"  | psql -d gis

  • $ exit, és már kész is.

Mapnik környezet és térképleíró beállítása

TODO

  • POI-k konvertálása hiányzik a tuhu2osm scripből.
    • Megoldva, bár egyelőre kétségeim vannak, hogy egy "dagonya" típusú POI-t milyen bitképpel szimbolizáljak.
  • OSM.XML "térkép leíró" rejtelmeinek feltárása.
  • turistajelzések megjelenítése a térképen. Megoldva.
    • Jelek megjelenítése, ha több is halad egy úton párhuzamosan.

Turistajelzések megjelenítése

Turistajelek megjelenése

Első lépésként a polyline-ok label-jében található jelzéseknek kellett helyet találnom a postGIS adatbázisban. Ezt az eredeti tuhu2osm a Ref mezőbe tette, de így esetleg felülíródott az út referencia száma (ami előzőleg az Utnév paraméterből került oda) ha volt neki. Így én a tourism mezőt választottam. A módosított tuhu2osm már ezt tartalmazza. A Mapnik szimbólumokat tartalmazó könyvtárába (/symbols) el kell helyeznünk a turistajelzések képeit PNG formátumban, majd a térképleíró XML fájlba a megfelelő stílusleíró szakaszban hivatkozni rájuk egy szabállyal. Ez praktikusan a "roads-text" szabály. Tovább bonyolítja a helyzetet, hogy egy úton több jelzés is haladhat, így nem tudjuk milyen sorrendben és hol helyezkedik el a mezőben a keresett karakter, ezért regular-expression alkalmazásával keresem. Erre szolgál a <Filter> elem. Ha az adott út tourism mezője tartalmaz K+ karaktersort, akkor a <PointSymbolizer> elemmel kirajzoltatjuk a megfelelő képecskét. Előzőleg a <MaxScaleDenominator> elemmel megadhatjuk, hogy milyen nagyítási szinten rajzolódjanak ki a jelzések. Az általam használt térképleíró letölthető innen. Használatához először módosítani kell a set-mapnik-env script-ben a MAPNIK_MAP_FILE környezeti változó értékét osm.xml-ről tuhu.xml-re, majd a customize-mapnik-map paranccsal a template-ből legyártatjuk a saját rendszerünknek megfelelő tuhu.xml-t.

Példa a K+ jel keresésére és megjelenítésére:

<Style name="roads-text">
 ...
  <Rule>
    <MaxScaleDenominator>100000</MaxScaleDenominator>
    <Filter> [tourism].match('[K][\+]|[K][\+][ ]|[ ][K][\+][ ]|[ ][K][\+]') </Filter>
    <PointSymbolizer file="%SYMBOLS_DIR%/kk.png" type="png" width="14" height="12" allow_overlap="false"/>
  </Rule>
</Style>

Képek előállítása

A Mapnik háromféle adatforrásból képes kimenetet előállítani:

  1. PostGIS (SQL) adatbázis
  2. Shapefileok
  3. Raszterek (Tif)

A harmadik (raszter) adatforrással lényegében csak egyetlen dolgot tud tenni, egy az egyben leképezi a kimenetre. Az első és a második variáció alkalmas igazán térkép előállítására. Az elsőnél további előny a tetszőleges SQL lekérdezés eredményeként fellépő sebességnövekedés.

A térkép előállításának mechanizmusa nagy vonalakban

      TUHU.XML
térképstílus leíró
POI-k bitképei (PNG)
tuhu.mptuhu2osmtuhu.osm (XML)PostgresSQLMapnikPNG/PDF/SVG
    SRTMGeoTif  
  1. Töltsd le a régiók mp állományait zip-elve. Ehhez értelemszerűen rendelkezned kell a megfelelő jogosultságokkal.
  2. Csomagold ki és fűzd össze őket egyetlen mp-vé.
  3. Konvertáld át UTF-8 formátumba. (Ezt megteszi a tuhu2osm)
  4. Engedd rá a tuhu2osm programra: (tuhu2osm tuhu.mp data.osm)
  5. Importáld be a Postgres adatbázisba (osm2pgsql -m data.osm)
  6. Szerkeszd a set-mapnik-env file-t. Állítsd be az összes MAPNIK_* környezeti változót, hogy illeszkedjen a könyvtárrendszeredhez illetve adatbázis kapcsolatodhoz, majd futtasd a ./customize-mapnik-map >$MAPNIK_MAP_FILE parancsot. Ez létrehozza a rendszerednek megfelelő beállítású OSM.XML térképleíró állományt.
  7. Indítsd el a képkockák generálását (a mapnik könyvtárában kiadott ./set-mapnik-env ./generate_tiles.py paranccsal), vagy ha egyetlen képre akarod a térképet kirajzoltatni akkor a generate_image.py -t.

A 2-5 lépésekhez használhatod ezt a shell scriptet. A 7. lépés előtte a generate_tiles.py scriptben beállítandók a kívánt zoom szintek és a generálandó terület koordinátái, mivel a frissen telepített mapnik alapértelmezésben a teljes földgolyót le akarja gyártani.

A renderelő mechanizmus teljesítménye

Jelenleg egy középkategóriás gépen futtatom. Alaplap: ASUS P4P800-VM/S alaplap Processzor: Hyperthread-es 2800MHz-es Northwood mag, 800FSB Memória: 512MB

Ezzel a konfigurációval, magassági szintvonalak nélkül a teljes országot 7-15 -ös zoomszinten kb.13 óra alatt készíti el. Szintvonalakkal ez felment duplájára. Nyilván, ha egyszer be van állítva és egyszer már legenerálta a teljes országot, a változott kisebb régiókkal sokkal hamarabb végez. Jelenleg készítem azt a scriptet, amit paraméterezve indítva csak az adott régiót befoglaló négyzet kockáit generálja le.

Felhasznált dokumentációk

 Mapnik telepítése, használata

Kontúr vonalak, domborzat színezés és árnyékolás

Domborzatárnyékoláshoz le kell töltenünk az SRTM adatokat a következő helyről: ftp://e0srp01u.ecs.nasa.gov/srtm/version2/SRTM3/Eurasia/ Az adatok zipelve, 1x1 fokos szegmensekre osztva tartalmazzák a golyóbis magasságadatait. Minket tehát a következő állományok érdekelnek: ftp://e0srp01u.ecs.nasa.gov/srtm/version2/SRTM3/Eurasia/N45E016.hgt.zip ... ftp://e0srp01u.ecs.nasa.gov/srtm/version2/SRTM3/Eurasia/N48E023.hgt.zip

Szükségünk lesz még az srtm_generate_hdr.sh scriptre. Ha lent vannak az adatok, bontsuk ki őket a következő scripttel:

#!/bin/bash

PREP_TABLE="1"
for X in *.hgt.zip; do
    yes | ./srtm_generate_hdr.sh $X
    rm -f "${X%%.zip}"
	    
    # Import 10m contours
    rm -f "${X%%.hgt.zip}.shp" "${X%%.hgt.zip}.shx" "${X%%.hgt.zip}.dbf"
    gdal_contour -i 10 -snodata 32767 -a height "${X%%.hgt.zip}.tif" "${X%%.hgt.zip}.shp"
    [ "$PREP_TABLE" ] && shp2pgsql -p -I -g way "${X%%.hgt.zip}" contours | psql -q gis
    shp2pgsql -a -g way "${X%%.hgt.zip}" contours | psql -q gis
				    
    rm -f "${X%%.hgt.zip}.shp" "${X%%.hgt.zip}.shx" "${X%%.hgt.zip}.dbf"
    rm -f "${X%%.hgt.zip}.bil"
    rm -f "${X%%.hgt.zip}.hdr"
    rm -f "${X%%.hgt.zip}.prj"
#    rm -f "${X%%.hgt.zip}.tif"
    unset PREP_TABLE
done

A fenti script eredetileg betolta PostGIS adatbázisunkba a magasságvonalak rajzolásához szükséges adatokat, majd kitörölte a generált shape fájlokat. Az utolsó rm -f "${X%%.hgt.zip}.tif" parancs kiiktatásával azonban a tif-eket megőrizzük. Ezekre lesz szükségünk az árnyékolás és domborzatszínezés elkészítéséhez.

Következő lépésben összefűzzük a geotiffeket:

gdal_merge.py -v -o <srtm.tif> -ul_lr <west> <north> <east> <south> <tif-directory>/*.tif

Update: A teljes országot lefedő tif olyan nagy lett, hogy a Mapnik nem volt képes a memóriába tölteni. A megoldás az lett, hogy az országot 7 oszlopra bontottam az egész számú hosszúsági fokok mentén (E16-E17, E17-E18, ... E22-E23). Az így keletkezett 7 raszterrel már megbirkózott a program.

Majd egy kis korrekció amit innen puskáztam. Aki érti, hogy itt mi történik, az ne fogja vissza magát:

gdal_translate -of GTiff -co "TILED=YES" -a_srs "+proj=latlong" <srtm.tif> <srtm_adapted.tif>

Aztán a tiff Mercator projekcióra húzása:

gdalwarp -of GTiff -co "TILED=YES" -srcnodata 32767 -dstnodata 32767 -t_srs "+proj=merc +ellps=sphere +R=6378137 +a=6378137 +units=m" -rcs -order 3 -tr 30 30 -multi <srtm_adapted.tif> <srtm_warped.tif>

Ezután jöhet a színezés, árnyékolás. Az alábbi scriptet mentsük el mint mkrelief.sh:

#!/bin/sh

INFILE=$1
OUTFILE=${2:-hillrelief.tif}
PID=$$
hillshade $INFILE .s_$PID.tif -s 370400 -z 20
color-relief $INFILE scale.txt .c_$PID.tif
listgeo .s_$PID.tif > .info_$PID.dat
composite -blend 50 .c_$PID.tif .s_$PID.tif .geo_$PID.tif
geotifcp -g .info_$PID.dat .geo_$PID.tif $OUTFILE
rm -f .s_$PID.tif .c_$PID.tif .geo_$PID.gif .geo_$PID.tif .info_$PID.dat

A fentiekből hillshade, color-relief és scale.txt innen van. A listgeo és geotifcp a geotiff csomagból. (Forrást lásd fent.) A composite és convert az ImageMagic csomag részei. Használata:

$ mkrelief.sh <srtm_warped.tif> <srtm_shaded.tif>

Ez el fog szöszölni pár órát.

Az eredmény valami ilyesmi lesz (kicsinyített részlet):

dunakanyar hillshade.png

Ezt lehet majd betolni az úthálózat alá külön, kikapcsolható rétegként.

TODO

  • OpenLayers réteg elkészítése a kezelésükhöz

Forrás:

 GDAL-based DEM utilities
 [Mapnik-users Shaded Relief]
 OSM HikingBikingMaps

DEMTOOLS fordítása Ubuntu8.10 alatt:

g++ `gdal-config --cflags` hillshade.cpp -o hillshade `gdal-config --libs`
g++ `gdal-config --cflags` color-relief.cpp -o color-relief.cpp `gdal-config --libs`
g++ `gdal-config --cflags` aspect.cpp -o aspect `gdal-config --libs`
g++ `gdal-config --cflags` slope.cpp -o slope `gdal-config --libs`