Help us understand the problem. What is going on with this article?

OpenStreetMapのタイルサーバを構築する (CentOS7)

More than 3 years have passed since last update.

ubntuのインストール情報は多いのですが、CentOSの情報が古く、
ちょっと手こずったのでこちらにまとめました。
特に今回、
https://www.space-i.com/post-blog/openstreetmap/
こちらからの情報に大いに救われております。
ありがとうございました。


追記 (2017.06.07)

Xeon E5-2630L v2 2.40GHz / 12コア
Mem 48G
HDD 7500prm (2T)

のマシンでPlanetOSMプロジェクトから取得した
Latest Weekly Planet XML Fileデータの変換にかかった時間は、

real 6459m38.346s
user 1126m46.868s
sys 73m54.920s

となりました。107時間ちょっとで取り込める感じです。
ちなみに、 osm2pgsqlの -mオプションで取り込むとメモリが足りなくて落ちますので、
--slimオプションで中間テーブルを作成するモードで取り込みました。

ディスクは最低3Tあった方がいいかと思います。


今回インストールするもの(ISOからインストールした直後のCentOS7を想定しています)

メモリが最低8G必要です。
本番稼働させるなら48G以上の方がいいのではないかと思います。

  1. PostgreSQL9.6
  2. PostGIS PGRouting
  3. osm2psql
  4. OpenStreetMap用のDB作成とOSMデータのインポート
  5. mapnik
  6. mapnik-stylesheets
  7. Apache
  8. Apache mod_tile

最初に入れておくもの、しておくこと

SELinuxをOFF
vi /etc/selinux/config

#SELINUX=enforcing
SELINUX=disabled
# 再起動する
reboot
getenforce
  Disabledになっていることを確認

yumのアップグレードや基本パッケージのインストール

yum -y upgrade
yum -y install epel-release
yum -y install wget git freetype-devel libxml2-devel bzip2-devel freetype-devel libtool-ltdl-devel libpng-devel libtiff-devel libjpeg-devel gcc-c++ bzip2 bzip2-devel libcurl-devel libpng-devel libtiff-devel libtool-ltdl-devel pycairo-devel cairomm-devel libjpeg-turbo-devel zip unzip libtool autoconf automake

vi /etc/yum.repos.d/CentOS-Base.repo
CentOS-Base.repo
#[base]の最後に行追加
exclude=postgresql*

#[updates]の最後に行追加
exclude=postgresql*

#[extras]の最後に行追加
exclude=postgresql*

1.PostgreSQL9.6のインストール

cd /usr/local/src

wget https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm

rpm -ivh pgdg-centos96-9.6-3.noarch.rpm

yum -y install postgresql96 postgresql96-contrib postgresql96-devel postgresql96-libs postgresql96-server 

/usr/pgsql-9.6/bin/postgresql96-setup initdb

systemctl start postgresql-9.6
systemctl enable postgresql-9.6

vi /var/lib/pgsql/9.6/data/pg_hba.conf 
pg_hba.conf
# peerをtrustに(開発用)
local   all             all                                     trust
host    all             all             127.0.0.1/32            trust
host    all             all             ::1/128                 trust

接続確認

systemctl restart postgresql-9.6
psql -Upostgres

2.PostGISとpgroutingのインストール

yum -y install postgis2_96 postgis2_96-client postgis2_96-devel postgis2_96-utils ogr_fdw96 pgrouting_96

3.osm2pgsqlのインストール

yum -y install cmake libpqxx libpqxx-devel boost boost-devel proj proj-devel proj-epsg lua lua-devel geos-devel protobuf-c protobuf-c-devel

cd /usr/local/src
git clone https://github.com/openstreetmap/osm2pgsql
cd osm2pgsql
mkdir build && cd build
cmake ..
make
make install
ldconfig

4.OpenStreetMap用のDB作成

su postgres
createdb template_postgis
psql -d template_postgis -c "UPDATE pg_database SET datistemplate=true WHERE datname='template_postgis'" 
psql -d template_postgis -f /usr/pgsql-9.6/share/contrib/postgis-2.3/postgis.sql
psql -d template_postgis -f /usr/pgsql-9.6/share/contrib/postgis-2.3/spatial_ref_sys.sql
psql -d template_postgis -f /usr/pgsql-9.6/share/contrib/postgis-2.3/postgis_comments.sql
psql -d template_postgis -f /usr/pgsql-9.6/share/contrib/postgis-2.3/rtpostgis.sql
psql -d template_postgis -f /usr/pgsql-9.6/share/contrib/postgis-2.3/raster_comments.sql
psql -d template_postgis -f /usr/pgsql-9.6/share/contrib/postgis-2.3/topology.sql
psql -d template_postgis -f /usr/pgsql-9.6/share/contrib/postgis-2.3/topology_comments.sql
createdb gis
psql -d gis -f /usr/pgsql-9.6/share/contrib/postgis-2.3/postgis.sql
psql -d gis -f /usr/pgsql-9.6/share/contrib/postgis-2.3/spatial_ref_sys.sql

OpenStreertMapの日本地図領域をダウンロードしてサーバに投入

cd ~
wget http://download.geofabrik.de/asia/japan/kanto-latest.osm.bz2
# cacheはMB単位です。実メモリの75%くらいまでは指定しても大丈夫だと思います。
osm2pgsql -m -d gis kanto-latest.osm.bz2 -U postgres --cache 6000

5.mapnikのインストール

yum -y install gdal-python gdal-devel icu libicu libicu-devel
yum -y install python-pip
pip install --upgrade pip

cd /usr/local/src

# v2.0系
wget https://github.com/downloads/mapnik/mapnik/mapnik-v2.0.2.tar.bz2
tar -jxvf mapnik-v2.0.2.tar.bz2

cd mapnik-v2.0.2
python scons/scons.py PG_CONFIG=/usr/pgsql-9.6/bin/pg_config
make install
ldconfig
ldconfig -v

ln -s /usr/local/lib64/libmapnik.so.2.0 /usr/lib64/libmapnik.so.2.0

cd /usr/local/src/mapnik-v2.0.2
git clone https://github.com/openstreetmap/mapnik-stylesheets.git
cd mapnik-stylesheets
wget http://tile.openstreetmap.org/world_boundaries-spherical.tgz
wget http://tile.openstreetmap.org/processed_p.tar.bz2
wget http://tile.openstreetmap.org/shoreline_300.tar.bz2
tar xzf world_boundaries-spherical.tgz
tar xjf processed_p.tar.bz2 -C world_boundaries
tar xjf shoreline_300.tar.bz2 -C world_boundaries
cd world_boundaries
wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_populated_places.zip
wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_boundary_lines_land.zip
unzip ne_10m_populated_places.zip
unzip ne_110m_admin_0_boundary_lines_land.zip

cd ../../mapnik-stylesheets
./generate_xml.py --host localhost --user postgres --dbname gis --symbols ./symbols/ --world_boundaries=./world_boundaries/ --accept-none

6.Apacheのインストール

yum -y install httpd httpd-devel

mod_tileのインストール

mkdir -p /var/run/renderd
mkdir -p /var/lib/mod_tile
chmod 777 /var/run/renderd
chmod 777 /var/lib/mod_tile

vi /etc/renderd.conf
renderd.conf
[renderd]
socketname=/var/run/renderd/renderd.sock
num_threads=8
tile_dir=/var/lib/mod_tile
stats_file=/var/run/renderd/renderd.stats

[mapnik]
plugins_dir=/usr/local/lib64/mapnik/input
font_dir=/usr/local/lib64/mapnik/fonts
font_dir_recurse=1

[default]
URI=/osm_tiles2/
XML=/usr/local/src/mapnik-stylesheets/osm.xml # mapnik-style内のosm.xmlを指定
HOST=localhost
cd /usr/local/src
git clone https://github.com/openstreetmap/mod_tile.git
cd mod_tile
./autogen.sh
./configure --with-apxs=/usr/bin/apxs
make
make install
make install-mod_tile
ldconfig

7.起動確認

vi /etc/httpd/conf/httpd.conf
# Include conf.modules.d/*.confの直下あたりに追記
LoadModule tile_module modules/mod_tile.so
LoadTileConfigFile /etc/renderd.conf
ModTileRenderdSocketName /var/run/renderd/renderd.sock
ModTileRequestTimeout 30
ModTileMissingRequestTimeout 30
cd /var/www/html
vi index.html
index.html
<html>
<head>
<title>OpenLayers Demo</title>
<style type="text/css">
html, body, #basicMap {
width: 100%;
height: 100%;
margin: 0;
}
</style>
<script src="http://www.openlayers.org/api/OpenLayers.js"></script>
<script>
function init() {
var options = {
projection: new OpenLayers.Projection("EPSG:900913"),
displayProjection: new OpenLayers.Projection("EPSG:4326"),
units: "m",
maxResolution: 156543.0339,
maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34,
20037508.34, 20037508.34),
numZoomLevels: 20,
controls: [
new OpenLayers.Control.Navigation(),
new OpenLayers.Control.PanZoomBar(),
new OpenLayers.Control.Permalink(),
new OpenLayers.Control.ScaleLine(),
new OpenLayers.Control.MousePosition(),
new OpenLayers.Control.KeyboardDefaults()

]
};
map = new OpenLayers.Map("basicMap",options);
var newL = new OpenLayers.Layer.OSM("Default", "/osm_tiles2/${z}/${x}/${y}.png", {numZoomLevels: 19});
map.addLayer(newL);
map.zoomIn();
}
</script>
</head>
<body onload="init();">
<div id="basicMap"></div>
</body>
</html>

systemctl disabled firewalld
systemctl stop firewalld
systemctl enable httpd
systemctl start httpd
/usr/local/bin/renderd -f > /var/log/renderd.log 2> /var/log/renderd.log &

ブラウザでアクセス

http://{openstreetmapをインストールしたサーバのアドレス}/

スクリーンショット 2017-05-24 14.22.43.png

うまくいくとこんな感じです。

再起動方法

systemctl restart httpd
ps ax | grep renderd
でrenderdのプロセスを調べてkillする。

一応ソケットも削除しておきます。
rm /var/run/renderd/*

/usr/local/bin/renderd -f > /var/log/renderd.log 2> /var/log/renderd.log &

あれ?ってなったところ。

SELinux切ってなくて、renderのソケットがPermission Deniedになっていた。

このあと予定していること

タイル画像のキャッシュ生成に関して記事を書く予定です。

こちらに記事を書きました。

Syn256
センサーとか機械学習とか、興味が湧いたらとりあえずプログラム書いてみて遊んでいます。 仕事では LAPP中心で扱っています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away