PostgreSQL+PostGIS+osm2pgsql+OpenStreetMap(OSM)で自前の地図データベースを構築

スポンサーリンク

かなり意欲的なタイトルですが、先に記載しておくと私自身、PostgreSQLもPostGISも全く知見がありません。(汗

地図についても多少仕事で関わったことがありますが、専門知識もまったくありません。

しかし、個人でOSMを使った地図サーバーを構築する記事を目にしたため、自分も挑戦しようと思った次第です。(世界の地図データを自分の家の中に置けるなんて、素敵な感じって理由)

なので、どちらかと言うと自己満足備忘録に近いものになるかと思います。

ほとんどのOSM地図サーバーの構築記事は、Linuxでの説明が多いので、今回は、Windowsを利用することにします。(Linuxよくわかんないし、Windowsでインストールするサイト見つけたし。)

スポンサーリンク

まずは、地図サーバーにするPCのハードウェアとソフトウェア環境になりますが、扱うデータ容量が莫大なので、メモリとストレージは大きいものが推奨されています。(メモリは、タイル地図を利用するときにたくさん使うみたいです。)

OS:Windows 10 Pro 64bit
CPU:Core i3-2120T 2.6Ghz TDP 35w
メモリ:8G
ストレージ:SSD 60GB(OS用)+ SSD 480GB(データ用)
ソフト:PostgreSQL 10.5、PostGIS 2.5.0、osm2pgsql 0.96.0

地図データ自体が大きいので、ストレージは大きめにしました。(HDDじゃない理由は、データベースから地図データを読み出すことが多そうなので、高速なSSDを選びました。)

もちろん、日本の地図だけなんてケチ臭いことを言わずに世界の地図データ480Gじゃ足りな過ぎてアジア地域限定で取り込みます。

早速ですが、地図データを保存する地図データベースを構築していきます。

と言ってもすでに良いチュートリアルサイトがあるので、そのサイトを参考にさせてもらいました!

LearnOSM
https://learnosm.org/ja/osm-data/setting-up-postgresql/

基本的に上記のサイトの手順通りですので、私がつまずいたところを記載してあります。

また、LearnOSMでは、PostgreSQL 9系ですが、私は、10.5を使用しています。(pgAdminも4)※最近出たばかりの11でも手順は同じだと思います。

まずは、PostgreSQLを以下のサイトからダウンロードします。(最初、間違えてBigSQL版をインストールしてしまい、失敗しました。)

https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

PostgreSQL(pgAdmin含む)、PostGIS、osm2pgsqlのインストールは、LearnOSMさんの手順通りで大丈夫です。(もしかしたら、osm2pgsql実行時にdllが無いよとエラーが出た場合は、VCの再配布パッケージをインストールすれば大丈夫です。)

次にOSMのデータを登録するデータベースの作成部分ですが、データベースを作成したのち、LearnOSMにも記載がありますが、以下の手順で作成したデータベースにpostgisのExtenstionを作成する必要があります。(今回は「osm」の名前でデータベースを作成しています。)

最初、見落としてosm2pgsqlでエラーになってしまいました。

作成したデータベース(ここでは「osm」)を右クリックして「Query Tool」を選択すると右側にQuery実行画面が表示されます。

Query実行画面

CREATE EXTENSION postgis;

を張り付けて、メニューバーから実行すると(No Limitのプルダウン横のイナズママークボタンをクリック)、Extensionが追加されます。

あとは、スタイルファイルと取り込みたい地図データをgeofabricなどからダウンロードし、osm2pgsqlコマンドでダウンロードしたファイルを指定して投入します。

地図データは、いろんなサイトでいろんなエリアの形で配布されいますので、お好みのデータをご利用いただければと思います。

osm2pgsql -c -d osm -U postgres –slim -H localhost -S d:\osm\default.style D:\osm\asia-latest.osm.pbf

今回は、アジアエリア(asia-latest.osm.pbf)の地図データ(ダウンロードサイズで、6.3GB)にしました。

本当は世界全部の地図データを投入したかったですが、用意した480Gのストレージでは、全然足りませんでした。。。1Tは必要そう。

無事実行されると、取り込みを開始します。

完了まで数時間はかかなと思います。

D:\>osm2pgsql -c -d osm -U postgres –slim -H localhost -S d:\osm\default.style D:\osm\asia-latest.osm.pbf
osm2pgsql version 0.96.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
Setting up table: planet_osm_roads
Allocating memory for sparse node cache
Node-cache: cache=800MB, maxblocks=12800*65536, allocation method=9
Mid: pgsql, cache=800
Setting up table: planet_osm_nodes
Setting up table: planet_osm_ways
Setting up table: planet_osm_rels
Reading in file: D:\osm\asia-latest.osm.pbf
Using PBF parser.
Processing: Node(931043k 111.0k/s) Way(116123k 6.86k/s) Relation(810240 107.99/s)  parse time: 32823s
Node stats: total(931043071), max(6030704568) in 8387s
Way stats: total(116123219), max(640136649) in 16932s
Relation stats: total(810704), max(8878424) in 7504s
Committing transaction for planet_osm_point
Committing transaction for planet_osm_line
Committing transaction for planet_osm_polygon
Committing transaction for planet_osm_roads
Setting up table: planet_osm_nodes
Setting up table: planet_osm_ways
Setting up table: planet_osm_rels
Using built-in tag processing pipeline
Setting up table: planet_osm_nodes
Setting up table: planet_osm_ways
Setting up table: planet_osm_rels
Using built-in tag processing pipeline
Setting up table: planet_osm_nodes
Setting up table: planet_osm_ways
Setting up table: planet_osm_rels
Using built-in tag processing pipeline
Setting up table: planet_osm_nodes
Setting up table: planet_osm_ways
Setting up table: planet_osm_rels
Using built-in tag processing pipeline
Going over pending ways…
84938197 ways are pending
Using 4 helper-processes
Finished processing 84938197 ways in 26804 s
84938197 Pending ways took 26804s at a rate of 3168.86/s
Committing transaction for planet_osm_point
Committing transaction for planet_osm_line
Committing transaction for planet_osm_polygon
Committing transaction for planet_osm_roads
Committing transaction for planet_osm_point
Committing transaction for planet_osm_line
Committing transaction for planet_osm_polygon
Committing transaction for planet_osm_roads
Committing transaction for planet_osm_point
Committing transaction for planet_osm_line
Committing transaction for planet_osm_polygon
Committing transaction for planet_osm_roads
Committing transaction for planet_osm_point
Committing transaction for planet_osm_line
Committing transaction for planet_osm_polygon
Committing transaction for planet_osm_roads
Going over pending relations…
0 relations are pending
Using 4 helper-processes
Finished processing 0 relations in 0 s
Committing transaction for planet_osm_point
WARNING:  螳溯。御クュ縺ョ繝医Λ繝ウ繧カ繧ッ繧キ繝ァ繝ウ縺後≠繧翫∪縺帙s
Committing transaction for planet_osm_line
WARNING:  螳溯。御クュ縺ョ繝医Λ繝ウ繧カ繧ッ繧キ繝ァ繝ウ縺後≠繧翫∪縺帙s
Committing transaction for planet_osm_polygon
WARNING:  螳溯。御クュ縺ョ繝医Λ繝ウ繧カ繧ッ繧キ繝ァ繝ウ縺後≠繧翫∪縺帙s
Committing transaction for planet_osm_roads
WARNING:  螳溯。御クュ縺ョ繝医Λ繝ウ繧カ繧ッ繧キ繝ァ繝ウ縺後≠繧翫∪縺帙s
Committing transaction for planet_osm_point
WARNING:  螳溯。御クュ縺ョ繝医Λ繝ウ繧カ繧ッ繧キ繝ァ繝ウ縺後≠繧翫∪縺帙s
Committing transaction for planet_osm_line
WARNING:  螳溯。御クュ縺ョ繝医Λ繝ウ繧カ繧ッ繧キ繝ァ繝ウ縺後≠繧翫∪縺帙s
Committing transaction for planet_osm_polygon
WARNING:  螳溯。御クュ縺ョ繝医Λ繝ウ繧カ繧ッ繧キ繝ァ繝ウ縺後≠繧翫∪縺帙s
Committing transaction for planet_osm_roads
WARNING:  螳溯。御クュ縺ョ繝医Λ繝ウ繧カ繧ッ繧キ繝ァ繝ウ縺後≠繧翫∪縺帙s
Committing transaction for planet_osm_point
WARNING:  螳溯。御クュ縺ョ繝医Λ繝ウ繧カ繧ッ繧キ繝ァ繝ウ縺後≠繧翫∪縺帙s
Committing transaction for planet_osm_line
WARNING:  螳溯。御クュ縺ョ繝医Λ繝ウ繧カ繧ッ繧キ繝ァ繝ウ縺後≠繧翫∪縺帙s
Committing transaction for planet_osm_polygon
WARNING:  螳溯。御クュ縺ョ繝医Λ繝ウ繧カ繧ッ繧キ繝ァ繝ウ縺後≠繧翫∪縺帙s
Committing transaction for planet_osm_roads
WARNING:  螳溯。御クュ縺ョ繝医Λ繝ウ繧カ繧ッ繧キ繝ァ繝ウ縺後≠繧翫∪縺帙s
Committing transaction for planet_osm_point
WARNING:  螳溯。御クュ縺ョ繝医Λ繝ウ繧カ繧ッ繧キ繝ァ繝ウ縺後≠繧翫∪縺帙s
Committing transaction for planet_osm_line
WARNING:  螳溯。御クュ縺ョ繝医Λ繝ウ繧カ繧ッ繧キ繝ァ繝ウ縺後≠繧翫∪縺帙s
Committing transaction for planet_osm_polygon
WARNING:  螳溯。御クュ縺ョ繝医Λ繝ウ繧カ繧ッ繧キ繝ァ繝ウ縺後≠繧翫∪縺帙s
Committing transaction for planet_osm_roads
WARNING:  螳溯。御クュ縺ョ繝医Λ繝ウ繧カ繧ッ繧キ繝ァ繝ウ縺後≠繧翫∪縺帙s
Sorting data and creating indexes for planet_osm_point
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
node cache: stored: 52428801(5.63%), storage efficiency: 50.00% (dense blocks: 0, sparse nodes: 52428801), hit rate: 6.22%
NOTICE:  Self-intersection at or near point 7148486.4317922518 7047035.3777957428
NOTICE:  Self-intersection at or near point 4729261.1576032471 7937547.0538152577
Copying planet_osm_roads to cluster by geometry finished
Creating geometry index on planet_osm_roads
Copying planet_osm_point to cluster by geometry finished
Creating geometry index on planet_osm_point
Creating osm_id index on planet_osm_roads
Creating indexes on planet_osm_roads finished
All indexes on planet_osm_roads created in 3290s
Completed planet_osm_roads
Stopping table: planet_osm_nodes
Stopped table: planet_osm_nodes in 0s
Stopping table: planet_osm_ways
Building index on table: planet_osm_ways
Creating osm_id index on planet_osm_point
Creating indexes on planet_osm_point finished
All indexes on planet_osm_point created in 3870s
Completed planet_osm_point
Stopping table: planet_osm_rels
Building index on table: planet_osm_rels
Stopped table: planet_osm_rels in 123s
Copying planet_osm_line to cluster by geometry finished
Creating geometry index on planet_osm_line
Creating osm_id index on planet_osm_line
Creating indexes on planet_osm_line finished
All indexes on planet_osm_line created in 7063s
Completed planet_osm_line
NOTICE:  Self-intersection at or near point 11985875.572086383 4115611.18050856
Stopped table: planet_osm_ways in 18825s
Copying planet_osm_polygon to cluster by geometry finished
Creating geometry index on planet_osm_polygon
Creating osm_id index on planet_osm_polygon
Creating indexes on planet_osm_polygon finished
All indexes on planet_osm_polygon created in 36894s
Completed planet_osm_polygon
Osm2pgsql took 125270s overall

少し警告が出ましたが、無事完了しました。

想像していた以上に時間がかかり、35時間弱です。。ストレージは、約180GB弱消費したみたいです。

全世界だと約7倍のデータ量になるので、完了するのに11日弱かかる計算になります。(半月・・・。)

データは、1.3TBくらいですか・・・。

スポンサーリンク