ขั้นตอนการติดตั้ง openstreet map บน ubuntu server มีขั้นตอนดังต่อไปนี้
1). update server
|
sudo apt update sudo apt upgrade |
2). ติดตั้ง dependencies
|
sudo apt install libboost-all-dev git-core tar unzip wget bzip2 build-essential autoconf libtool libxml2-dev libgeos-dev libgeos++-dev libpq-dev libbz2-dev libproj-dev munin-node munin libprotobuf-c0-dev protobuf-c-compiler libfreetype6-dev libpng12-dev libtiff5-dev libicu-dev libgdal-dev libcairo-dev libcairomm-1.0-dev apache2 apache2-dev libagg-dev liblua5.2-dev ttf-unifont lua5.1 liblua5.1-dev libgeotiff-epsg |
3). ติดตั้ง postgres
|
sudo apt install postgresql postgresql-contrib postgis postgresql-9.5-postgis-2.2 |
จะสร้าง user ชื่อว่า postgres ในระหว่างการติดตั้ง ที่มีสิทธิในการเเข้าใช้ ฐานข้อมูล ถือว่าเป็น user root ของ postgres database การใช้งานฐานข้อมูล ในครั้งแรก ให้ทำการ login เป็น postgres ต่อมาจะสร้าง database ชื่อ osm และ database ชื่อ gis
|
$ sudo -u postgres -i postgres@mapserver:~$ createuser osm postgres@mapserver:~$ createdb -E UTF8 -O osm gis |
สร้าง hstore และ postgis extension
|
postgres@mapserver:~$ psql -c "CREATE EXTENSION hstore;" -d gis postgres@mapserver:~$ psql -c "CREATE EXTENSION postgis;" -d gis |
ออกจาก postgres user
|
postgres@mapserver:~$ exit |

4) ติดตั้ง osm2pgsql เป็น เครื่องเมื่อที่จะ บันทึก openstreep map สู่ ฐานข้อมูล postgres
|
$ sudo apt install make cmake g++ libboost-dev libboost-system-dev libboost-filesystem-dev libexpat1-dev zlib1g-dev libbz2-dev libpq-dev libgeos-dev libgeos++-dev libproj-dev lua5.2 liblua5.2-dev $ mkdir ~/src $ cd ~/src $ git clone git://github.com/openstreetmap/osm2pgsql.git $ cd osm2pgsql mkdir build && cd build cmake .. (ผลของการ build ใน build directory) $ make $ sudo make install $ osm2pgsql -v $ osm2pgsql version 0.95.0-dev (64 bit id space) |

5) ติดตั้ง Mapnik เป็นเครื่องมือ ที่ใช้สำหรับการ render ทำงานร่วมกับ mod_tile
|
$ sudo apt-get install autoconf apache2-dev libtool libxml2-dev libbz2-dev libgeos-dev libgeos++-dev libproj-dev gdal-bin libgdal1-dev libmapnik-dev mapnik-utils python-mapnik (ทดสอบ import mapnik) $ python Python 2.7.12 (default, Dec 4 2017, 14:50:18) [GCC 5.4.0 20160609] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import mapnik >>> quit() |
6) ติดตั้ง mod_tile
|
$ cd ~/src $ git clone -b switch2osm git://github.com/SomeoneElseOSM/mod_tile.git $ cd mod_tile $ ./autogen.sh $ ./configure $ make $ sudo make install (ติดตั้ง mod_tile ให้แก่ apache) $ sudo make install-mod_tile $ sudo chmod 644 /usr/lib/apache2/modules/mod_tile.so $ sudo ldconfig |
7). สร้าง unix user ชื่อ osm เพื่อเป็น user สำหรับการใช้งาน
|
$ sudo useradd -m -d /home/osm osm $ sudo passwd osm |
8) ติดตั้ง carto ด้วย node เพื่อใช้ compile carto project ให้ mapnik.xml
|
$ sudo apt install npm nodejs-legacy $ sudo npm install -g carto $ carto -v 1.0.0 |
9) Download openstreetmap-carto version ล่าสุด และ convert project.mml สู่ mapnik.xml
|
su - osm git clone git://github.com/gravitystorm/openstreetmap-carto.git cd openstreetmap-carto carto project.mml > mapnik.xml |
10) Download ข้อมูลแผนที่จาก http://download.geofabrik.de/ เลือก Asia > Thailand

|
$ mkdir data $ ls data openstreetmap-carto $ cd data $ wget http://download.geofabrik.de/asia/thailand-latest.osm.pbf |
11) บันทึกใน ฐานข้อมูล
|
osm2pgsql -d gis --create --slim -G --hstore --tag-transform-script \ ~/openstreetmap-carto/openstreetmap-carto.lua -C 2500 --number-processes 1 \ -S ~/openstreetmap-carto/openstreetmap-carto.style ~/data/thailand-latest.osm.pbf |
อธิบายคำสั่ง
-d gis
Database ที่ใช้ชื่อ gis
--create
Load data สู่ ฐานข้อมูล ที่ยังว่าง
--slim
ใช้ตาราง slim ตอน rendering
-G
--hstore
--tag-transform-script
-C 2500
พื้นที่หน่วยความจำที่ osm2pgsql ใช้ในการ import
--number-processes 1
ใช้ จำนวน CPU
verify
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
osm@mapserver:~$ psql -d gis psql (9.5.12) Type "help" for help. gis=> gis=> \d public | geography_columns | view | postgres public | geometry_columns | view | postgres public | planet_osm_line | table | osm public | planet_osm_nodes | table | osm public | planet_osm_point | table | osm public | planet_osm_polygon | table | osm public | planet_osm_rels | table | osm public | planet_osm_roads | table | osm public | planet_osm_ways | table | osm public | raster_columns | view | postgres public | raster_overviews | view | postgres public | spatial_ref_sys | table | postgres gis=> select count(*) from planet_osm_nodes; 16568865 gis=> select count(*) from planet_osm_line; 1091458 |

12). Download shapefile
|
cd ~/openstreetmap-carto/ scripts/get-shapefiles.py |
13). Download Fonts
|
(exit จาก osm user) $ exit $ sudo apt-get install fonts-noto-cjk fonts-noto-hinted fonts-noto-unhinted ttf-unifont |
14 ตั้งค่า
|
$ sudo vi /usr/local/etc/renderd.conf num_threads=4 XML=/home/osm/openstreetmap-carto/mapnik.xml RUNASUSER=osm $ sudo systemctl daemon-reload $ sudo systemctl start renderd $ sudo systemctl enable renderd |
15). ตั้งค่า apache
|
$ sudo mkdir /var/lib/mod_tile $ sudo chown osm /var/lib/mod_tile $ sudo mkdir /var/run/renderd $ sudo chown osm /var/run/renderd $ sudo vi /etc/apache2/conf-available/mod_tile.conf LoadModule tile_module /usr/lib/apache2/modules/mod_tile.so |
บันทึก file
16) เพิ่ม virtual host
|
sudo vi /etc/apache2/sites-available/000-default.conf |
เพิ่มในระหว่างบันทัดของ “ServerAdmin” และ “DocumentRoot”
|
LoadTileConfigFile /usr/local/etc/renderd.conf ModTileRenderdSocketName /var/run/renderd/renderd.sock # 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 |

17) restart server
|
sudo service apache2 reload sudo service apache2 reload |
18 start service renderd
|
su - osm renderd -f -c /usr/local/etc/renderd.conf |

19) กำหนดให้ renderd ทำงาน ใน backgroud mode
|
(exit ออกจาก osm อีกครั้ง) $ cat ~/src/mod_tile/debian/renderd.init $ sudo cp ~/src/mod_tile/debian/renderd.init /etc/init.d/renderd $ sudo chmod u+x /etc/init.d/renderd $ sudo cp ~/src/mod_tile/debian/renderd.service /lib/systemd/system/ $ sudo /etc/init.d/renderd start [ ok ] Starting renderd (via systemctl): renderd.service. $ sudo systemctl enable renderd |
20 ทดสอบร่วมกับ openlayer
|
$ cd /var/www/html $ sudo wget https://github.com/openlayers/openlayers/releases/download/v4.6.5/v4.6.5.zip $ sudo unzip v4.6.5.zip |
สร้าง file index.html
และแทนค่า your-ip
ด้วย ip ของ server
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
<!DOCTYPE html> <html> <head> <title>Accessible Map</title> <link rel="stylesheet" href="http://your-ip/v4.6.5/css/ol.css" type="text/css"> <script src="http://your-ip/v4.6.5/build/ol.js"></script> <style> a.skiplink { position: absolute; clip: rect(1px, 1px, 1px, 1px); padding: 0; border: 0; height: 1px; width: 1px; overflow: hidden; } a.skiplink:focus { clip: auto; height: auto; width: auto; background-color: #fff; padding: 0.3em; } #map:focus { outline: #4A74A8 solid 0.15em; } </style> </head> <body> <a class="skiplink" href="#map">Go to map</a> <div id="map" class="map" tabindex="0"></div> <button id="zoom-out">Zoom out</button> <button id="zoom-in">Zoom in</button> <script> var map = new ol.Map({ layers: [ new ol.layer.Tile({ source: new ol.source.OSM({ url: 'http://your-ip/osm_tiles/{z}/{x}/{y}.png' }) }) ], target: 'map', controls: ol.control.defaults({ attributionOptions: /** @type {olx.control.AttributionOptions} */ ({ collapsible: false }) }), view: new ol.View({ center: [244780.24508882355, 7386452.183179816], zoom:5 }) }); document.getElementById('zoom-out').onclick = function() { var view = map.getView(); var zoom = view.getZoom(); view.setZoom(zoom - 1); }; document.getElementById('zoom-in').onclick = function() { var view = map.getView(); var zoom = view.getZoom(); view.setZoom(zoom + 1); }; </script> </body> </html> |