かなり意欲的なタイトルですが、先に記載しておくと私自身、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くらいですか・・・。