コンテンツへスキップ

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

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

はじめに

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

Garmin自作地図
自作したGarminGPS用地図

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

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

 

環境

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

  • ハードウェア構成
    • CPU:core2duo
    • Memory:8GByte
    • ストレージ
      • システムHDD(500GByte)
      • HDD(1TByte)
      • HDD(2TByte)
  • OS/ソフトウェア構成
    • OS:ubuntu18.04(64bit)
    • PostgreSQL 10.5
    • 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に公式リポジトリを追加

  • deb http://archive.ubuntu.com/ubuntu bionic main restricted universe multiverse
  • deb http://archive.ubuntu.com/ubuntu bionic-security main restricted universe multiverse
  • deb http://archive.ubuntu.com/ubuntu bionic-updates main restricted universe multiverse

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

  • deb http://apt.postgresql.org/pub/repos/apt bionic-pgdg main

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のデータベースファイル格納先を以下のパスに変更します。

  • /data/postgresql/10/main

$ 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を編集

  • data_directory = '/data/postgresql/10/main' # use data in another directory

その後、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を編集

  • listen_addresses = '*'

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

  • host all all 0.0.0.0/0 trust

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

データベースの作成

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

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

  • DBユーザ:gisuser
  • DB名:gis
  • エンコード:UTF8

ユーザの作成


$ 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とOSM
QGISでPostGISサーバと接続してOSM要素を描画したところ。無事に動作しているようです。

所感

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

参考

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

公開日 カテゴリー PC, 地図

sukeについて

自転車で日本一周旅行に出ようとー思い立ったエンジニア。 ガジェット類やセミナーに目がない。 将来は田舎でほっこりとしたいですねー

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください