Fi:Mapnik virtuaalikoneena

From OpenStreetMap Wiki
Jump to: navigation, search

Miksi

Erilaisia ohjeita on, mutta ei lyötynyt vaiheittaista listaa mitä pitää tehdä jotta saa ajettua omalla koneella kaikkea tarvittavaa. Ehkei ole sopivaa Linuxia asennettuna; copy-paste ei välttämättä toimi suoraan virtuaalikoneeseen, siksi kaikki mahdollinen haetaan wget:llä ja tehdään pienet muutokset itse. Ehkä käyttäjää ei tippaakaan kiinnosta opiskella mitä paketteja tai konfigurointitiedostoja pitäisi muokata ja miksi.

Esivalmistelut

Tarvitset: VMWare Player

Pohjatyö

Näiden pohjalta:

Vaiheet

Lataa viimeiseltä sivulta linkitetty

http://maps.burningsilicon.net/resources/ubuntu-server-Mapnik.7z (reilu 1GB)

Avaa paketti, avaa virtuaalikone vmwareen. Vaihda virtuaalikoneen asetuksista muistin koko suuremmaksi, ladatussa tiedostossa vain 512 MB - vaikka silläkin pärjää alkuun. Näppäimistöasettelu on englantilainen, enkä ruvennut selvittämään miten se vaihdetaan. Tärkeimmät eroavaisuudet:

'/' löytyy '-' -napista
'-' löytyy '+' -napista,
'~' löytyy vaihto+'½' -napista,
'$' on vaihto + '4',
'_' on vaihto + '+',
':' on vaihto + 'ö'.
Myöhemmin selvisi näppäimistöasettelun vaihto näinkin helpoksi:
sudo apt-get install console-data
Asennus käynnistää asetusohjelman: valitse "select from/by arch" (tai mikä olikaan ensimmäinen vaihtoehto), sitten Finnish. Anna vielä komento:
loadkeys fi-latin1


kirjaudu: notroot / thoughtpolice

Itse vaihdoin tähän heti salasanan.

passwd

Perusohjelmat

Seurasin alkuperäisiä ohjeita suoraan:

sudo apt-get install sun-java6-jdk

Sitten annetaan päivitellä kaikenlaista. Itselläni verkkoyhteydet toimivat suoraan.

sudo apt-get update
sudo apt-get upgrade

Tämä latasikin vielä sun-java6-jre:n. Jatketaan muiden ohjeista:

sudo apt-get install subversion autoconf screen munin-node munin htop
cd
wget http://gweb.bretth.com/osmosis-latest.tgz
tar xvfz osmosis-latest.tgz
chmod a+x osmosis-0.36/bin/osmosis


Tätä kirjoittaessa tuolta tuli osmosiksen versio 0.36. Uudempia on jo, mutta tätä ei ole vielä tarvittu.

osm2pgsql

apt-get install osm2pgsql

antaa todella vanhan version, jonka päälle kopioidaan alla käännettävä uudempi. Vanha ei voi toimia, on vuodelta 2007.

Ohjeet käytti svn export -komentoa, mutta tuossa se antoi aina virhettä ". is not working copy" tms. Seuraava toimi:

cd
svnadmin create svn
svn co http://svn.openstreetmap.org/applications/utils/export/osm2pgsql/
./autogen.sh
./configure
make
sudo cp osm2pgsql /usr/bin
cd
cd osm2pgsql
sudo mkdir /usr/local/share/osm2pgsql
sudo cp default.style /usr/local/share/osm2pgsql

Haetaan osm-data

Lataa finland.osm.bz2, esim. voit valita alla viimeisen rivin sen mukaan kummasta lähteestä saat tuoreemman tiedoston: [1] vai [2]

cd
mkdir planet
cd planet
wget http://downloads.cloudmade.com/europe/finland/finland.osm.bz2 -O finland.osm.bz2
wget http://download.geofabrik.de/osm/europe/finland.osm.bz2 -O finland.osm.bz2

Data tietokantaan

Edes slim-modessa vienti tietokantaan ei onnistunut, luultavasti virtuaalikoneen muistimäärän takia (vain 512 siinä tilassa missä ladattiin). Helsingin kantakaupunki meni, kun uusimmat osm2pgsql:t tukevat datan leikkaamista suoraan. Vaikka viitatuissa ohjeissa väitetään, että tietokannan nimi olisi "gis", se onkin "osm".

cd
time osm2pgsql -s --bbox 24.8,60.1,25,60.2 -d osm ~/planet/finland.osm.bz2

Core i3-330 + 4 GB muistia -koneella edellinen komento vei kymmenisen minuuttia. Jos haluat vähän isomman alueen Helsingin ympäriltä, esim. --bbox 24.6,60.0,25.3,60.5 on sopiva - samalla koneella 40 minuuttia.

Apache2

Apache2 saattoi olla jo, mutta ajoin seuraavan:

apt-get install apache2

Testataan mapnik

Tämän vaiheen voinee ohittaa, jos siirtyy suoraan selailtavan kartan käyttöön - ja kaikki toimii.

cd ~/mapnik
cp generate_tiles.py z0_generate_tiles.py
pico z0_generate_tiles.py

Kuten sivulla http://weait.com/content/make-your-first-map , etsi rivi (lähempänä loppua)

# Change the following for different bounding boxes and zoom levels

ja pari riviä sen alapuolella muutat 5 -> 0, ts. rivi on

render_tiles(bbox, mapfile, tile_dir, 0, 5, "World")

Lisää kaikkien seuraavien "render_tiles" -rivien alkuun "#" -merkki.

paina ctrl+o ja enter, paina ctrl+x

source set-mapnik-env
./customize-mapnik-map >$MAPNIK_MAP_FILE
./z0_generate_tiles.py

Hakemistossa mapnik/tiles/0/0/ pitäisi nyt olla kuva 0.png, koko noin 8562 tavua. Jos kuvassa on pieni maailmankartta, mapnik on osannut käyttää oikeita vesialueita kuvaavia shapefile:jä.

ls -l tiles/0/0/

X:ää ei serverissä vissiin ole, ja fbi:n asennus ei auttanut kuvan katsomiseen. Kopioidaan kuva apache:n jakamaan hakemistoon.

sudo cp tiles/0/0/0.png /var/www

Koska osoite "localhost" ei yhdistänyt virtuaalikoneeseen:

ifconfig

katsotaan kohta inet addr ja palataan oikean koneen puolelle. selaimen osoiteriville nnn.nnn.nnn.nnn/0.png ja toivottavasti nähdään pieni maailmankartta-kuva.

Testataan vielä kantaan viedyn alueen piirtäminen.

cp z0_generate_tiles.py hki.py
pico hki.py

Aiemmin muokatun rivin alla olevia rivejä muokataan:

 MinZoom = 12
 MaxZoom = 14
 bbox = (24.8, 60.1, 25, 60.2)

Seuraavalta riviltä "render_tiles( queue, bbox, ..." pois parametri "queue, " - ei mitään hajua miksi se on siinä mukana. ctrl+x, y, enter.

source set-mapnik-env
./customize-mapnik-map >$MAPNIK_MAP_FILE
./hki.py

Kolmen zoomitason kuvien piirto tuolta alueelta kesti just päältä minuutin.

cd /var/www
sudo cp -r ~/mapnik/tiles .

Nyt selaimeen esim. http://192.168.152.128/13/4663/2371.png (virtuaalikoneen ip voi olla eri) ja ruudulle pitäisi ilmestyä Helsingin keskusta.

Openlayers

Pohjana

cd /var/www
sudo wget http://pastebin.dy.fi/yX -O map.html
sudo pico map.html

Vaihda riville

var vmLayer = new OpenLayers.Layer.OSM("Oma VM", "http://192.168.152.128/tiles/${z}/${x}/${y}.png", {numZoomLevels: 15});

oma osoitteesi. Rivin lopun numZoomLevels on suurin zoom + 1, lasku alkaa nollasta.

mod_tile ja renderd

Ai miksei tirex? Asennusyritys pysähtyi jonkin vaaditun toisen paketin versioon; virtuaalikoneessa olevaan ubuntu server 8.04:ään oli tarjolla vain versio 6, kun versio 7 tai myöhempi vaadittiin.

cd
sudo apt-get install libagg-dev
svn co http://svn.openstreetmap.org/applications/utils/mod_tile
cd mod_tile
pico render_config.h

riveillä

#define MAPNIK_PLUGINS
#define FONT_DIR 

korvataan "lib64" -> "lib". Tarvitaanko tätä muutosta edes, en tiedä. Taas ulos editorista: ctrl+x, y, enter

Käännetään mod_tile ja renderd

Mod_tilen kääntäminen vaatii apache2:n kehityspakettia ja ylempänä haettua libagg-dev:iä:

sudo apt-get install apache2-threaded-dev
make
sudo make install

Sivuhuomautus, voi ohittaa ja palata myöhemmin: Jos haluat tehdä karttatason jossa on läpinäkyvyyttä "alle jääviin" tasoihin, kannattaa ennen näitä komentoja muokata gen_tile.cpp käyttämään 24-bittisiä png-tiedostoja, eikä hieman pienempiä 256-värisiä. Vaihda riveille 435 ja 474 "png256" -> "png"

Kerrotaan apachelle mod_tilen käyttö

sudo cp mod_tile.conf /etc/apache2/conf.d/
pico /etc/renderd.conf

Toinen rivi: varmista ettei rivin alussa ole puolipistettä;

socketname=/var/run/renderd/renderd/renderd.sock

Rivit plugins_dir, font_dir: "lib64" -> "lib" Rivi URI: muotoon

URI=/tiles/

Rivi XML: muotoon

XML=~/mapnik/osm-local.xml
HOST={oma ip:si}

Taas ulos editorista: ctrl+x, y, enter

sudo pico /etc/apache2/conf.d/mod_tile.conf

Rivit LoadModule ja DocumentRoot muotoihin

LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so
DocumentRoot /var/www

Taas ulos editorista: ctrl+x, y, enter

Mod_tile käyttää tietyn tiedoston muokkauspäivää jotenkin viimeisimmän osm-tietokantaimportin päivän arviointiin; luodaan sellainen tiedosto nyt:

sudo mkdir /var/lib/mod_tile
sudo pico /var/lib/mod_tile/planet-import-complete

Taas ulos editorista: ctrl+x, y, enter

pico ~/mapnik/set-mapnik-env

rivin loppu vaihtuu:

export MAPNIK_TILE_DIR=/var/www/tiles

Taas ulos editorista: ctrl+x, y, enter

sudo pico /etc/apache2/conf.d/mod_tile.conf

Riville 4

LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so

Rivi 9:

ServerName localhost

Seuraava rivi kommentiksi, ellei virtuaalikoneelle ole ohjattu jotain "ulkopuolista" liikennettä. Ehkä. Ulos ja tallennus, ctrl+x, y, enter.

Käynnistetään renderd ja uudelleenkäynnistetään apache.

cd ~/mod_tile
renderd -f &
sudo apache2ctl restart

Valitsin -f on "foreground", jolloin renderd suoltaa konsoliin saamansa piirtokäskyt ja virheet.

Kopioidaan "oikean" koneen selaimeen osoitteeksi esim.

http://192.168.152.128/tiles/16/37308/18961.png

Kuvan piirrossa voi mennä muutamia sekunteja, mutta ei pitäisi tulla ilmoitusta "File not found". Jos kuva näkyy, voidaan palata "/map.html" -sivulle ja ihastella uutta karttaa ja miettiä omaa piirtotyyliä.

Datan päivitys

Päivitys tyhjästä

Viikottaisen uuden planet.osm-tiedoston (tai siitä leikatun valmiin Suomi-osan) vieminen kantaa sujuu samalla osm2pgsql-komennolla. Jos muuta ei komentorivillä kerrota, osm2pgsql luo tarvittavat taulut kokonaan uusiksi.

Tätä tapaa tarvitaan, jos haluat lisätä piirtotietokantaasi uusia avaimia.

cd
rm planet/finland.osm.bz2
wget http://downloads.cloudmade.com/europe/finland/finland.osm.bz2 -O planet/finland.osm.bz2
osm2pgsql -s --bbox 24.6,60.0,25.3,60.5 -d osm planet/finland.osm.bz2
sudo touch /var/lib/mod_tile/planet-import-complete

Viimeinen rivi siirtää mainitun tiedoston päiväyksen nykyhetkeen, jolloin renderd:n pitäisi ymmärtää että karttakuvat pitäisi piirtää uusiksi seuraavalla latauskerralla. Koska kuvan piirrossa kestää hetken, saat ensimmäisellä kartan (uudelleen)latauskerralla vielä aiemman kuvan. Odota pari sekuntia ja lataa karttasi vielä uudestaan.

Yllämainitulla koneella tuo suuremman alueen kantaanvienti vei karvan alle 40 minuuttia.

Tuotavien avaimien lisääminen

Kopioi tiedosto ~/osm2pgsql/default.style vaikka nimelle oma.style, ja lisää tiedostoon rivit haluamiasi avaimia varten. Korvaa yllä osm2pgsql-komentorivi seuraavalla

osm2pgsql -s -S osm2pgsql/oma.style --bbox 24.6,60.0,25.3,60.5 -d osm planet/finland.osm.bz2

Päivitys tiheämmin

Jos tyyli ei muutu, tietokantaa voi päivittää päivittäin, tunnin välein tai joka minuutti julkaistavista edellisen vastaavanpituisen ajanjakson muutokset sisältävistä tiedostoista. Osmosis hoitaa tämän; prosessi on kuvattu englanniksi ja tässä sovellettuna:

export WORKDIR_OSM=$HOME/.osmosis
mkdir $WORKDIR_OSM
~/osmosis-0.36/bin/osmosis --read-replication-interval-init workingDirectory=$WORKDIR_OSM

Varmistetaan että voidaan päivittää planet-import-complete -aputiedoston päiväys ilman salasanan syöttelyä, joten

chown notroot /var/lib/mod_tile/planet-import-complete

Oletuksena osmosis hakee päivityksiä minuutti-muutoksista ja enintään tunnin kerrallaan. Voit muokata tiedostoa

pico $WORKDIR_OSM/configuration.txt

ja vaihtaa urliin sanan minute tilalle hour jos muutoksia puuttuu pidemmältä ajalta tai jos haluat päivittää jatkossa harvemmin. Viimeisellä rivillä (maxInterval=3600) kerrotaan kerralla enintään haettavan ajanjakson pituus sekunteina.

Jotta tiedetään mistä hetkestä eteenpäin muutostiedostoja tarvitsee ladata, tarkista lataamasi planet.osm -tai finland.osm -tiedoston luomisaika - sisältö voi olla päivän, pari viikkoakin vanhaa. Jos latasit planet.osm-tiedoston, päiväys on latausta edeltävä keskiviikko. Aiemmin ladatun finland.osm.bz2 -tiedoston sisällölle päiväys löytyy sivulta http://downloads.cloudmade.com/europe/finland/

Vähennä vielä pari tuntia. Sivun http://toolserver.org/~mazder/replicate-sequences/ lomakkeelta saat luotavan state.txt -tiedoston oikean sisällön. Helpoimmin saat oikean tiedoston saman sivun palvelurajapinnan kautta näin (vaihda äsken laskemasi päiväys oikeaan kohtaan, esimerkissä karttatiedoston päiväys oli 6. syyskuuta):

wget http://toolserver.org/~mazder/replicate-sequences/?2010-09-05T22:00:00Z -O $WORKDIR_OSM/state.txt

Seuraavaksi: ensin haetaan ajanhetken jälkeiset muutokset, seuraavaksi lisätään ne tietokantaan ja lopuksi kerrotaan renderd:lle että data on entistä tuoreempaa:

osmosis-0.36/bin/osmosis --read-replication-interval workingDirectory=$WORKDIR_OSM --simplify-change  --write-xml-change changes.osc.gz
osm2pgsql --append -s -d osm changes.osc.gz
touch /var/lib/mod_tile/planet-import-complete

Lisää osm2pgsql rivin loppuun vielä muut parametrit joita käytit tietokannan luonnissa, esim. "-S oma.style" - muutoin siinä haluttuja tageja ei tiedetä viedä kantaan!

Näitä rivejä voi toistaa aina kun haluaa päivittää datan, tai laittaa cronilla päivityksen tapahtumaan vaikka kerran minuutissa. Jos päivitys on jäänyt jälkeen nykyhetkestä, osmosis hakee aina tunnin verran muutoksia; esimerkkikoneella näiden kantaanvienti kestää keskimäärin 4-5 minuuttia. Näin päivitys ottaa nykyhetken kiinni jos komentoa vain ajetaan useammin kuin kerran tunnissa. Liian suuren maxInterval-asetuksen käyttö voi saada osm2pgsql:n kaatumaan muistin vähyyteen, joten voin suositella ajamaan muutoksia tunnin kerrallaan. Optimi riippuu pitkälti välimuistiin kerralla mahtuvasta määrästä - välimuistin käydessä pieneksi tarvittava aika kasvaa hyötyjä nopeammin; 1½ tunnin muutokset menevät kirjoitushetkellä (syksy 2010) oletusasetuksilla nätisti, lähes samassa ajassa kuin tunnin.

Jos unohdat yltä "--append", osm2pgsql luo tietokannan tyhjästä ja saat kantaasi pelkästään muutokset.

Oman tyylin muokkaus

tulossa

Tehdään uusi taso:

cd ~/mapnik
cp osm.xml buildings.xml
sudo pico /etc/renderd.conf

Lisätään loppuun

[buildings]
URI=/building/
XML=/home/notroot/mapnik/buildings.xml
HOST= oma ip:si

Muokataan vielä map.html:ää:

Pysäytetään ja käynnistetään sekä renderd että apache2 uudestaan jotta tyylin tileihin viittaavat urlit käsitellään.

./renderd -f &
sudo apache2ctl restart

Jos muutat jatkossa pelkkää tyylitiedostoa, pelkän renderd:n uudelleenkäynnistys riittää.

Kohdattuja ongelmatilanteita

osm2pgsql ja muisti loppui

Osm2pgsql kaatui muistin loppuessa, kaatoi renderd:n ja jotain muutakin kun kone ei reagoinut enää toista kirjautumisruutua pidemmälle. Renderd jätti socket:in sulkematta, ja käynnistys antoi virheilmoituksen "socket bind failed", joten uudelleenkäynnistyksen jälkeen piti tehdä näin:

cd ~/mod_tile
sudo mkdir /var/run/renderd 
sudo chown -hH notroot /var/run/renderd 
renderd -f

Myöhemmin kävi ilmi että tämä tarvitaan aina virtuaalikoneen käynnistyksen jälkeen.

Virtuaalilevy täynnä

8 gigan levyraja tulee äkkiä vastaan tietokantasi kasvaessa; esim tietokannan saavuttaessa 4 gigatavun koon. Sammuta virtuaalikone. Ainakin uusin Vmware player:kin antaa muuttaa sammutetun koneen (maksimi)levykokoa - Valitse oikea image - Settings - Hard disk - utilities - syötä reilusti suurempi luku ja ok. Huomioi: joudut seuraavaksi tekemään vielä uuden suuremman osion tietokantaa varten äsken luotuun "uuteen" tilaan, joten kasvata levyä vähintään 6-8 gigatavulla. Osion kokoa ei voi muuttaa ilman erillistä gparted-live-cd-imagea, koska root ja swap ovat käytössä jos kirjaudut virtuaalikoneeseen. Joten kirjaudu ja

sudo cfdisk /dev/sda

Luo tyhjään tilaan uusi osio, vaikka tyyppiä logical. Tallenna, poistu ('q') ja käynnistä virtuaalikone uudestaan.

sudo shutdown now

Kirjaudu uudestaan ja tarkista että uusi tila on /dev/sda6:

sudo parted /dev/sda
print
q

Kun on, tee sinne tiedostojärjestelmä (varausyksikön koko 4 kilotavua ei nyt ole niin häiritsevää, koska postgresql ei tee läjittäin pikkutiedostoja.

sudo mke2fs /dev/sda6
sudo mkdir /hdtemp
sudo mount /dev/sda6 /hdtemp

Nyt voimme kopioida tietokantakansion uudelle osiolle:

cd /var/lib/postgresql/8.3
sudo su
cd main/base
cp -p -r . /hdtemp

Tässä sitten kestää mitä nyt neljän gigan kopiointi levyn sisällä viekin. Tiedä sitten, pitäisikö postgres-palvelut pysäyttää seuraavan ajaksi, mutta jos kantaa ei käytetä mihinkään sillä aikaa, niin tämä onnistui ilmankin (ollaan yhä su):

rm -r main/base/*
umount /dev/sda6
mount /dev/sda6 /var/lib/postgresql/8.3/main/base
exit

Nyt postgres näkee samat datatiedostot samassa paikassa kuin ennenkin. Jatkossa Jos et suosittua webbipalvelua tee, niin piirretyt karttapalaset mahtuvat paljon pidempään vapaaksi jääneeseen 4-5 gigatavuun, ja niitä voi tarvittaessa poistella vaikka ajastetusti suuremmilta zoom-tasoilta.

Lisätään osio vielä fstab:iin jotta se tulee seuraavalla kerralla heti käynnistyksessä.

sudo pico /etc/fstab

Lisää rivi

/dev/sda6  /var/lib/postgresql/8.3/main/base  auto  defaults  0  0

Tallenna ja poistu. Katso vielä edellisen väliotsikon alta miten renderd käynnistetään virtuaalikoneen uudelleenkäynnistyksen jälkeen.