Sivut

OpenStreetMap suomeksi

Karttojen liittäminen verkkosivuille

On monta erilaista tapaa liittää karttoja omalle verkkosivullesi. Yksinkertaisin ja helpoin tapa on käyttää JavaScript-kirjastoa, jota kutsutaan OpenLayersiksi, ja joka tarjoaa vieritettävän kartan, jonka voit liittää omalle sivullesi. Tämä on samanlainen prosessi kuin aiemmin kirjassa kuvattu tapa käyttää "Export"-välilehteä http://osm.org/-sivuilla. Tässä luvussa menemme pidemmälle kuvailemalla, kuinka voit pystyttää oman palvelimesi käyttäen OpenStreetMap-tietoa. Voit myös tehdä tämän, jos olet kiinnostunut korostamaan tiettyä OpenStreetMap-tiedon tyyppiä, kuten polkupyörä- tai kinttupolkuja, tai jos et pidä muiden karttatyylien elementeistä.

Järjestelmävaatimukset

Omien karttojen tarjoaminen on aika intensiivinen tehtävä. Järjestelmävaatimukset vaihtelevat riippuen kiinnostuksesi kohteena olevasta alueesta ja odottamastasi liikennemäärästä. Yleisesti ottaen varastotilaa vaaditaan 10-20GB, muistia vaaditaan 4GB ja prosessorin täytyy olla moderni kahden ytimen prosessori, jos alueena on kaupungin kokoinen alue. Koko planeetta vaatii 300GB tai enemmän nopeaa varastotilaa, 24GB muistia ja neljän ytimen prosessorin.

Mitä ovat laatat?

Tässä tapauksessa verkkokartta tehdään joukosta rinnakkaisia neliön muotoisia kuvia, joista jokainen on 256 pikseliä suuntaansa, ja jotka kattavat tietyn maantieteellisen alueen maapallolla. OpenLayers-kirjasto, jota käytämme tässä esimerkissä, asettaa nämä laatat ruudukkoon, jotta saadaan vedettävä kartta mistä tahansa maapallon osasta.

OpenLayersin käyttö

OpenLayers on JavaScript-kirjasto karttojen näyttämiseen verkkosivullasi. Se on hyvin tehokas ja sen avulla voit lisätä karttoihisi kehittyneitä ominaisuuksia, kuten nappeja, ylimääräisiä kerroksia, ponnahdusikkunoita ja viivoja. Tässä esimerkissä sitä käytetään vain näyttämään renderöimäsi kartta, mutta oppiaksesi lisää muiden ominaisuuksien käytöstä voit käydä osoitteessa http://openlayers.org/.

Tarvittavat työkalut

Käytämme joukkoa työkaluja luodaksemme ja esittääksemme kartan laatat:

Apache tarjoilee etualalla olevan palvelimen, joka käsittelee verkkoselaimeltasi tulevat pyynnöt ja siirtää pyynnöt mod_tile-moduulille. Apache-palvelinta vidaan myös käyttää tarjoamaan karttasivusi staattista verkkosisältöä, kuten HTML, JavaScript tai CSS.

Kun Apache käsittelee pyynnön verkon käyttäjältä, se siirtää pyynnön mod_tile -moduulin käsiteltäväksi. Mod_tile tarkistaa, onko laatta jo luotu vai täytyykö se päivittää, koska sitä ei löydy välimuistista. Jos laatta on jo saatavilla, mod_tile lähettää sen asiakkaalle. Jos laatta pitää piirtää, mod_tile lisää sen piirtopyyntöjonoon (render request queue), jossa laatta piirretään kun sen vuoro tulee. Tämän jälkeen laatta lähetetään asiakkaalle.

OpenStreetMap käytää Mapnik-nimistä työkalua laattojen piirtämiseen. Se hakee pyyntöjä jonosta niin nopeasti kuin mahdollista ja piirtää laatat eri lähteistä saatujen tyyliohjeiden mukaisesti. Piirretty laatta välitetään sen jälkeen asiakkaalle ja Mapnik siirtyy työjonossaan seuraavaan laattaan.

Piirtämiseen eli renderöintiin tarvittava OpenStreetMap-data on tallennettu PostgreSQL-tietokantaan joka on luotu osm2pgsql-työkalulla. Nämä kaksi osaa yhdessä mahdollistavat tehokkaan pääsyn OpenStreetMapin paikkatietoihin. PostgreSQL-tietokanta on mahdollista pitää ajantasalla käyttäen diff-tiedostoja joita luodaan 60 sekunnin välein OpenStreetMapin pääpalvelimella.

Oman laattapalvelimen asentaminen

Oman laattapalvelimen asentaminen on pitkä prosessi, joka on selitetty parhaiten Richard Weaitin verkkosivuilla: http://weait.com/content/build-your-own-openstreetmap-server.

Ohjelmistot

Aloita lataamalla oman tietokoneesi prosessoriarkkitehtuurille sopiva versio Ubuntu 10.4 Lucid Lynx -käyttöjärjestelmästä. Asennusvaiheessa valitse LAMP- ja SSH-palvelimet. Kun asennus on valmis, konetta voi käyttää ilman näyttöä ja näppäimistöä. Ota siis SSH-yhteys uuteen palvelimeesi, niin aloitetaan! Aivan ensimmäiseksi päivitä käyttöjärjestelmä:

sudo apt-get update
sudo apt-get upgrade

 Lataa laattapalvelimen asennuksessa tarvittavat olennaisimmat työkalut:

sudo apt-get install subversion autoconf screen munin-node munin htop

 Luo vielä muutama uusi hakemisto helpottaaksesi asennusprosessin kulkua:

cd ~
mkdir src bin planet

Lataa uusin OpenStreetMap-data 

Lataa jokin osa OpenStreetMap-dataa osoitteesta http://planet.openstreetmap.org/. Koska koko planeetan data vie tiivistettynäkin vähintään 18 gigatavua, sivulta löytyy myös linkkejä pienempiin maa- tai osavaltiokohtaisiin kokonaisuuksiin. Kannattaa valita PBF-tiedostomuoto jos se on saatavilla, sillä se on pienempi ja näin ollen helpommin käsiteltävissä. Tässä esimerkissä lataamme koko planeetan tiedot seuraavilla komennoilla:

cd planet
wget http://planet.openstreetmap.org/planet-latest.osm.bz2

Asenna ja konfiguroi PostgreSQL-tietokanta 

Seuraavaksi asennamme PostgreSQL-tietokannan. Aloita asentamalla tietokanta ja siihen tarvittavat laajennukset:

sudo apt-get install postgresql-8.4-postgis postgresql-contrib-8.4 postgresql-server-dev-8.4 build-essential libxml2-dev libtool libgeos-dev libpq-dev libbz2-dev proj

PostgreSQL 8.4:n oletusasetuksia on säädettävä sopimaan datamäärälle, joka siihen ollaan lisäämässä. Muokkaa siis tiedostoa /etc/postgresql/8.4/main/postgresql.conf ja tee siihen seuraavat säädöt:

shared_buffers = 128MB
checkpoint_segments = 20
maintenance_work_mem = 256MB
autovacuum = off

Näitä muutoksia varten joudumme muokkaamaan myös kernelin konfiguraatiota. Tee ja tallenna tarvittava muutos seuraavilla komennoilla:

sudo sysctl -w kernel.shmmax=268435456
sudo sysctl -p /etc/sysctl.conf

Käynnistä PostgreSQL nyt uudestaan jotta muutokset tulevat voimaan:

sudo /etc/init.d/postgresql-8.4 restart

Tietokannan tulisi käynnistyä ongelmitta ja sinun tulisi nähdä seuraava viesti:

 * Restarting PostgreSQL 8.4 database server
   ...done.

Luo tietokanta nimeltä gis. Jotkin työkalut olettavat, että tietokanta on nimetty juuri näin. Korvaa teksti KÄYTTÄJÄNIMI haluamallasi käyttäjänimellä kahdessa kohdassa. Tämä käyttäjä on se, joka sitten piirtää kartat Mapnikin avulla.

sudo -u postgres -i
createuser KÄYTTÄJÄNIMI # answer yes for superuser
createdb -E UTF8 -O KÄYTTÄJÄNIMI gis
createlang plpgsql gis
exit

Asenna PostGIS-laajennus:

psql -f /usr/share/postgresql/8.4/contrib/postgis-1.5/postgis.sql -d gis

Tämän komennon pitäisi tuottaa monta riviä jotka loppuvat näin:

...
CREATE FUNCTION
COMMIT
...
DROP FUNCTION

Anna uudelle käyttäjällesi riittävät oikeudet PostGIS-laajennuksen dataan. Korvaa taas KÄYTTÄNIMI käyttäjän nimellä:

echo "ALTER TABLE geometry_columns OWNER TO KÄYTTÄJÄNIMI; ALTER TABLE spatial_ref_sys OWNER TO KÄYTTÄJÄNIMI;" | psql -d gis

Lataa OpenStreetMap-data tietokantaan

Nyt asennamme työkalun, joka muuntaa OSM-datan PostgreSQL:n ymmärtämään muotoon. Lataa työkalun lähdekoodin viimeisin versio ja käännä se:

cd ~/bin
svn co http://svn.openstreetmap.org/applications/utils/export/osm2pgsql/
cd osm2pgsql
./autogen.sh
./configure
make

Kun käännös on valmis, asenna tietokannan spatiaalinen referenssi:

psql -f ~/bin/osm2pgsql/900913.sql -d gis

Muunnostyökalun asennuksen ja tietokannan valmistelun jälkeen voit nyt täyttää tietokannan aiemmin lataamallasi OpenStreetMap-datalla. Tämä vaihe on hyvin raskas tietokoneen levy-I/O:lle ja saattaa viedä noin 30 tuntia tietokoneen suorituskyvystä ja ladatun datan määrästä riippuen.

cd ~/bin/osm2pgsql
./osm2pgsql -S default.style --slim -d gis -C 2048 ~/planet/planet-latest.osm.bz2

Katsotaanpa, miten datan työntäminen tietokantaan edistyy. osm2pgsql:n tulosteen ensimmäinen osa saattaa näyttää huolestuttavalta, mutta kuuluu sen normaaliin toimintaan:

Using projection SRS 900913 (Spherical Mercator)
Setting up table: planet_osm_point
NOTICE:  table "planet_osm_point" does not exist, skipping
NOTICE:  table "planet_osm_point_tmp" does not exist, skipping
Setting up table: planet_osm_line
NOTICE:  table "planet_osm_line" does not exist, skipping
NOTICE:  table "planet_osm_line_tmp" does not exist, skipping
Setting up table: planet_osm_polygon
NOTICE:  table "planet_osm_polygon" does not exist, skipping
NOTICE:  table "planet_osm_polygon_tmp" does not exist, skipping
Setting up table: planet_osm_roads
NOTICE:  table "planet_osm_roads" does not exist, skipping
NOTICE:  table "planet_osm_roads_tmp" does not exist, skipping
Mid: pgsql, scale=100, cache=4096MB, maxblocks=524289*8192
Setting up table: planet_osm_nodes
NOTICE:  table "planet_osm_nodes" does not exist, skipping
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "planet_osm_nodes_pkey" for table "planet_osm_nodes"
Setting up table: planet_osm_ways
NOTICE:  table "planet_osm_ways" does not exist, skipping
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "planet_osm_ways_pkey" for table "planet_osm_ways"
Setting up table: planet_osm_rels
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "planet_osm_rels_pkey" for table "planet_osm_rels"

Älä välitä NOTICE-riveistä, ne kuuluvat asiaan. Seuraavaksi osm2pgsql alkaa lukea tiivistettyä planeettatiedostoa:

Reading in file: /home/user/planet/planet-latest.osm.bz2

osm2pgsql:n lukiessa tiedostoa se antaa väliaikatietoja. Näytöllä olevat numerot päivittyvät muutaman sekunnin välein. Tämä vaihe kestaa pitkään, palvelimesta riippuen tunneista päiviin.

Processing: Node(10140k) Way(0k) Relation(0k)

Tietokannan täyttämisen edetessä Node-luku päivittyy pari kertaa sekunnissa kunnes kaikki Nodet on käsitelty. Tämän jälkeen Way-luku alkaa päivittyä muutaman sekunnin välein, ja lopuksi Relation-luku noin kerran minuutissa. Lukujen päivittyessä älä keskeytä prosessia ellet halua aloittaa aivan alusta asti uudelleen.

Processing: Node(593072k) Way(45376k) Relation(87k)
Exception caught processing way id=110802
Exception caught processing way id=110803
Processing: Node(593072k) Way(45376k) Relation(474k)

Poikkeukset (Exception) johtuvat pienistä virheistä planeettatiedostossa, mutta niistä ei ole haittaa, vaan prosessi etenee silti normaalisti.

Seuraava vaihe osm2pgsql-prosessissa saattaa myös kestää tunneista päiviin, palvelimesta riippuen. Vaihe alkaa näin:

Node stats: total(593072533), max(696096737)
Way stats: total(45376969), max(55410575)
Relation stats: total(484528), max(555276)

Going over pending ways
processing way (752k)

"Processing way" -luvun pitäisi päivittyä suunnilleen kerran sekunnissa.

Going over pending relations

node cache: stored: 515463899(86.91%), storage efficiency: 96.01%, hit rate: 85.97%
Committing transaction for planet_osm_roads
Committing transaction for planet_osm_line
Committing transaction for planet_osm_polygon
Sorting data and creating indexes for planet_osm_line
Sorting data and creating indexes for planet_osm_roads
Sorting data and creating indexes for planet_osm_polygon
Committing transaction for planet_osm_point
Sorting data and creating indexes for planet_osm_point
Stopping table: planet_osm_nodes
Stopping table: planet_osm_ways
Stopping table: planet_osm_rels
Building index on table: planet_osm_rels
Stopped table: planet_osm_nodes
Building index on table: planet_osm_ways
Stopped table: planet_osm_rels
Completed planet_osm_point
Completed planet_osm_roads
Completed planet_osm_polygon
Completed planet_osm_line
Stopped table: planet_osm_ways

Data on nyt viety onnistuneesti tietokantaan!

Asenna Mapnik-kirjasto 

Next, we need to install the Mapnik library. Mapnik is used to render the OpenStreetMap data into the tiles used for an OpenLayers web map. To start, we'll install the dependencies for the Mapnik library followed by downloading and compiling the source:

sudo apt-get install libltdl3-dev libpng12-dev libtiff4-dev libicu-dev libboost-python1.40-dev python-cairo-dev python-nose libboost1.40-dev libboost-filesystem1.40-dev libboost-iostreams1.40-dev libboost-regex1.40-dev libboost-thread1.40-dev libboost-program-options1.40-dev libboost-python1.40-dev libfreetype6-dev libcairo2-dev libcairomm-1.0-dev libgeotiff-dev libtiff4 libtiff4-dev libtiffxx0c2 libsigc++-dev libsigc++0c2 libsigx-2.0-2 libsigx-2.0-dev libgdal1-dev python-gdal imagemagick ttf-dejavu

Build the Mapnik library from source:

cd ~/src
svn co http://svn.mapnik.org/tags/release-0.7.1/ mapnik
cd mapnik
python scons/scons.py configure INPUT_PLUGINS=all OPTIMIZATION=3 SYSTEM_FONTS=/usr/share/fonts/truetype/
python scons/scons.py
sudo python scons/scons.py install
sudo ldconfig

Verify that Mapnik has been installed correctly:

python
>>> import mapnik
>>> 

If python replies with the second chevron prompt >>> and without errors, then Mapnik library was found by Python. Congratulations!

Install Mapnik tools 

Next, we need to install the OpenStreetMap Mapnik tools, which include the default style file and tools to help Mapnik render OpenStreetMap data:

cd ~/bin
svn co http://svn.openstreetmap.org/applications/rendering/mapnik

Mapnik uses prepared files to generate coastlines and ocean areas for small scale maps since it is faster than reading the entire database for this information.

cd ~/bin/mapnik
mkdir world_boundaries
wget http://tile.openstreetmap.org/world_boundaries-spherical.tgz
tar xvzf world_boundaries-spherical.tgz
wget http://tile.openstreetmap.org/processed_p.tar.bz2
tar xvjf processed_p.tar.bz2 -C world_boundaries
wget http://tile.openstreetmap.org/shoreline_300.tar.bz2
tar xjf shoreline_300.tar.bz2 -C world_boundaries
wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/10m-populated-places.zip
unzip 10m-populated-places.zip -d world_boundaries
wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/110m-admin-0-boundary-lines.zip
unzip 110m-admin-0-boundary-lines.zip -d world_boundaries

The database is loaded and the tools are installed. Let's test everything together. Remember to replace username with your username.

cd ~/bin/mapnik
./generate_xml.py --dbname gis --user username --accept-none
./generate_image.py

View image.png to confirm that you have rendered a map of England. Congratulations!

Install and configure Apache web server and mod_tile

Now that we've created an image using your map data, we need to set up the tile serving software to handle tile requests using Apache. To do this, we'll install the Apache web server and use the mod_tile extension to handle the tile rendering system.

Begin by installing tools necessary to build mod_tile:

sudo aptitude install apache2 apache2-threaded-dev apache2-mpm-prefork apache2-utils libagg-dev

Compile the mod_tile source code:

cd ~/src
svn co http://svn.openstreetmap.org/applications/utils/mod_tile
cd mod_tile
make
sudo make install

Change the the mod_tile settings by editing the /etc/renderd.conf and change the following lines like so (remember to change username to your user's name):

plugins_dir=/usr/local/lib/mapnik/input
font_dir=/usr/lib/mapnik/fonts
XML=/home/username/bin/mapnik/osm.xml
HOST=localhost

Create the files required for the mod_tile system to run (remember to change username to your user's name):

sudo mkdir /var/run/renderd
sudo chown username /var/run/renderd

Next, we need to tell the Apache web server about our new mod_tile installation by creating the file/etc/apache2/conf.d/mod_tile and adding one line:

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

Also, Apache's default website configuration file needs to be modified to include mod_tile settings. Modify the file/etc/apache2/sites-available/default to include the following lines immediately after the admin e-mail address line:

LoadTileConfigFile /etc/renderd.conf
ModTileRenderdSocketName /tmp/osm-renderd
# Timeout before giving up for a tile to be rendered
ModTileRequestTimeout 0
# Timeout before giving up for a tile to be rendered that is otherwise missing
ModTileMissingRequestTimeout 30

You'll then need to start the mod_tile rendering application. Note that it will not output anything upon successful start.

cd ~/src/mod_tile
./renderd

Congratulations! You now have a server capable of generating tiles using your own copy of the OpenStreetMap data. Visithttp://localhost/osm_tiles2/0/0/0.png to verify that you have a working map tile generated.

Booki-palvelimen kanssa viestinnassa on ongelmia. En ole varma missä ongelma on.

Sinun pitäisi päivittää tämä sivu.