サイトアイコン すけログ

PostGISサーバ構築とOSMのインポート

自作地図のためのPostGISサーバ構築の手順についてです。OSMとオープンデータを取り込んでオリジナル地図を作成するための環境を構築します。

はじめに

最近、GarminGPSやスマホアプリのMapsme向けカスタム地図を作っています。思ったよりも注目頂けたようで、このブログ始まって以来のコメントにご指摘や感想をもらいながら少しづつカスタムを進めてきました。

自作したGarminGPS用地図

その中で段々と凝った地図が作りたくなってきて、OSMデータだけでは実現出来ないことが出てきました。OSMの各要素には様々な情報が付与されていますが、その情報だけでは足りないことがあったのです。そこで、以前から気になっていたGIS環境というのを構築してみることにしました。

なお、GISについて詳細は以下のサイトが参考になるかと思います。

 

環境

以前Linuxファイルシステムのベンチマークに使ったサブPCにPostGISをインストールして、PostGIS兼地図ビルド用サーバPCとして運用することにしました。

久しぶりにケースを開けて掃除をしました。バックアップ用電池も切れていたので交換です。

データベースサーバの構築

Ubuntu 18.04.1 Serverのインストール

まず、サブPCにubuntu serverをインストールしました。このPCは古いマザーボード(Asus P5K-E)なのでUSBブートにかなり癖があります。昔に使っていた1GByteのUSBメモリでインストールイメージをbootして行いました。


$ sudo lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.1 LTS
Release: 18.04
Codename: bionic

ubuntu serverだとdesktopと違ってaptリポジトリがかなり貧相なことになっています。このままではインストール出来ないパッケージがあるので公式リポジトリを追加しました。

/etc/apt/sources.listに公式リポジトリを追加

次いでpostgresqlのリポジトリを追加

postgresqlリポジトリの鍵を登録して、リポジトリ一覧してパッケージを更新しておきます。


$ wget --quiet -O - http://apt.postgresql.org/pub/repos/apt/ACCC4CF8.asc | sudo apt-key add -

$ sudo apt update
$ sudo apt upgrade

sambaのインストール

作業するにあたってファイル共有を使うのでsambaをインストールしておきます。


$ sudo apt install samba
$ sudo pdbedit -a YourUserName

smb.confを編集して再起動します(このPCでは/dataにデータ用HDDをマウントしてあります)。

[homes]
comment = Home Directories
browseable = no
read only = no

[data]
comment = DATA Directory
path = /data
browseable = yes
read only = no
guest ok = no
create mask = 644
directory mask = 755

PostGISのインストール

aptで必要なパッケージをインストールします。


$ sudo apt install postgresql-10 postgresql-10-postgis-2.4 postgresql-10-postgis-scripts
Reading package lists... Done
Building dependency tree
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
postgresql-10-postgis-2.4 : Depends: libgdal20 (>= 2.0.1) but it is not installable
Depends: libgeos-c1v5 (>= 3.6.0) but it is not installable
Depends: liblwgeom-2.4-0 (>= 2.4.0~rc1) but it is not going to be installed
Depends: libproj12 (>= 4.9.0) but it is not installable
Depends: libprotobuf-c1 (>= 1.0.1) but it is not installable
E: Unable to correct problems, you have held broken packages.

PostgreSQLが立ち上がっていることを確認します。ついでに現在のデータベースの格納先を確認しました。私はデータベースは別のディスクに保存したいと考えているので後で変更します。


$ sudo -u postgres psql
psql (10.5 (Ubuntu 10.5-1.pgdg18.04+1))
Type "help" for help.

postgres=# show data_directory ;
data_directory
-----------------------------
/var/lib/postgresql/10/main
(1 row)

postgres=# \q

PostgreSQLのデータ格納先ディレクトリを変更する

postgresqlのデータベースファイル格納先を以下のパスに変更します。


$ sudo systemctl stop postgresql
$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Tue 2018-09-18 06:12:58 UTC; 27s ago
Main PID: 1459 (code=exited, status=0/SUCCESS)

Sep 18 05:57:46 p5k-server systemd[1]: Starting PostgreSQL RDBMS...
Sep 18 05:57:46 p5k-server systemd[1]: Started PostgreSQL RDBMS.
Sep 18 06:12:58 p5k-server systemd[1]: Stopped PostgreSQL RDBMS.

停止してればOKです。rsyncで既存データベースを丸ごとコピーします。


$ sudo rsync -av /var/lib/postgresql /data
$ ls /data
lost+found postgresql

コピーが終わったら元ファイルをリネームしておきます。


$ sudo mv /var/lib/postgresql/10/main /var/lib/postgresql/10/main.bak

続いて設定ファイルの項目を編集します。

/etc/postgresql/10/main/postgresql.confを編集


その後、PostgreSQLを再起動します。

$ sudo systemctl start postgresql
$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Tue 2018-09-18 06:24:53 UTC; 9s ago
Process: 3378 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 3378 (code=exited, status=0/SUCCESS)

Sep 18 06:24:53 p5k-server systemd[1]: Starting PostgreSQL RDBMS...
Sep 18 06:24:53 p5k-server systemd[1]: Started PostgreSQL RDBMS.

再起動したら格納先が変更されていることを確認します。


$ sudo -u postgres psql
psql (10.5 (Ubuntu 10.5-1.pgdg18.04+1))
Type "help" for help.

postgres=# show data_directory ;
data_directory
--------------------------
/data/postgresql/10/main
(1 row)

postgres=#

問題なければもとのデータを削除します。


$ sudo rm -Rf /var/lib/postgresql/10/main.bak

PostgreSQLへの外部アクセス設定

次にpostgresqlに外部から接続出来るように設定します。
以下のファイルの該当箇所をそれぞれ編集します。ここではローカル環境で限定して使うということで外部から無条件で接続出来るようにしています。

/etc/postgresql/10/main/postgresql.confを編集

/etc/postgresql/10/main/pb_hba.confを編集

上記の設定を行ったらサービスを再起動します。

データベースの作成

新しくデータベースを作成する

OSMデータを格納するデータベースを作成します。

ユーザの作成


$ sudo -u postgres createuser gisuser

データベースの作成


$ sudo -u postgres createdb --encoding=UTF8 --owner=gisuser gis

データベースのPostGISを有効にする


$ sudo -u postgres psql --dbname=gis -c "CREATE EXTENSION postgis;"
CREATE EXTENSION
$ sudo -u postgres psql --dbname=gis -c "CREATE EXTENSION postgis_topology;"
CREATE EXTENSION

OSMデータをインポートする

osm2pgsqlコマンドを使用してOSMデータをインポートします。ubuntu18.04の場合は以下のようにしてインストール出来ます。


$ sudo apt install osm2pgsql

ここではGeofabrikから最新の日本周辺OSMデータを取得して、osm2pgsqlでデータベースにインポートします。なお、メモリの関係で”-s”オプションをつけてslimモードで実行しました。


$ wget https://download.geofabrik.de/asia/japan-latest.osm.pbf

$ sudo -u gisuser osm2pgsql -s -c -d gis -U gisuser ./japan-latest.osm.pbf
osm2pgsql version 0.94.0 (64 bit id space)

Using built-in tag processing pipeline
Using projection SRS 3857 (Spherical Mercator)
Setting up table: planet_osm_point
Setting up table: planet_osm_line
Setting up table: planet_osm_polygon
...
Stopped table: planet_osm_ways in 5861s
node cache: stored: 61745564(39.86%), storage efficiency: 58.89% (dense blocks: 4855, sparse nodes: 32542721), hit rate: 38.16%

Osm2pgsql took 14693s overall

日本全体で約4時間かかりました。作業中のCPU使用率を見ているとほとんどがI/O待ちのようです。HDDへのアクセスがボトルネックですね。

インポートしたデータを見てみると、、、


$ sudo -u gisuser psql -d gis
psql (10.5 (Ubuntu 10.5-1.pgdg18.04+1))
Type "help" for help.

gis=> \d
List of relations
Schema | Name | Type | Owner
--------+--------------------+-------+----------
public | geography_columns | view | postgres
public | geometry_columns | view | postgres
public | planet_osm_line | table | gisuser
public | planet_osm_nodes | table | gisuser
public | planet_osm_point | table | gisuser
public | planet_osm_polygon | table | gisuser
public | planet_osm_rels | table | gisuser
public | planet_osm_roads | table | gisuser
public | planet_osm_ways | table | gisuser
public | raster_columns | view | postgres
public | raster_overviews | view | postgres
public | spatial_ref_sys | table | postgres
(12 rows)

gis=> select name from planet_osm_line where bicycle='yes' and name<>'' limit 10;
name
------------------------------
ゲート通り(空港通り)
ゲート通り(空港通り)
国道329号
国道329号
国道329号
国道329号
国道329号
国道329号
渡海浜入り口(ピース浜入り口)
三太郎トンネル
(10 rows)

それっぽいデータが入っているようです。

外部からデータベースに接続する

次に私がいつも使っているメインPCから構築したデータベースに接続してデータを引っ張ってこられるか確認します。ここではQGISを使用しました。

QGISでPostGISサーバと接続してOSM要素を描画したところ。無事に動作しているようです。

所感

ひとまずデータベースサーバの構築が完了しました。あとは地図に必要な要素をインポートしてどう処理していくか、というところです。そのあたりも後日にまとめたいと思います。

参考

この記事は以下の内容を参考に記載させていただきました。

モバイルバージョンを終了