Fi:Mapnik virtuaalikoneena
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:
- http://weait.com/content/build-your-own-openstreetmap-server
- http://weait.com/content/make-your-first-map
- Howto_real_time_tiles_rendering_with_mapnik_and_mod_python
- http://www.burningsilicon.net/blog/2009/09/messing-about-with-some-mapping/
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.