1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Docker composeでPostGIS-pgAdmin 開発環境を作成してみた

Posted at

GIS初心者のKCSCです。
GIS研究によく使われるPostGIS及びpgAdminのdocker imageを(docker composeを使い)最速で作成することを試みて、そして感想です。

docker composeファイルの用意と実行

docker コンテナを作成するため、docker-compose.ymlファイルが必要です。
docker-compose.ymlは以下の通りです。

services:
  ser_postgis:
    image: postgis/postgis:latest
    container_name: con_postgis
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: osm_kyushu
    ports:
     - "5438:5432"
    volumes:
     - ./postgis_data:/var/lib/postgresql/data
     - ./:/work

  ser_pgadmin:
    image: dpage/pgadmin4:latest
    container_name: con_pgadmin
    ports:
     - "8088:80"
    volumes:
     - ./pgadmin_data:/var/lib/pgadmin
    environment:
     PGADMIN_DEFAULT_EMAIL: postgis@example.com
     PGADMIN_DEFAULT_PASSWORD: postgis_pw
    depends_on:
     - ser_postgis

注意が必要なところ:
image: docker サーバに請求するimageの名前となります。latestのところがバージョンで、ニーズに応じて調整できます。

image: postgis/postgis:latest

image: dpage/pgadmin4:latest

imageの名前として使われます。わかりやすい(入力しやすい)名前にしましよう。

container_name: con_postgis

container_name: con_pgadmin

portsの設定:左がホスト(パソコン)で使うport番号、右がコンテナ内部のportになります。左のホスト番号はエラー回避のため、通常には既定の番号と異なるportを使用します。

ports:
 - "5438:5432"

ports:
 - "8088:80"

volumes:左と右もホストとコンテナ内部のフォルダの対照です。

volumes:
     - ./postgis_data:/var/lib/postgresql/data
     - ./:/work

volumes:
     - ./pgadmin_data:/var/lib/pgadmin

pgAdminのメールはメールアドレスっぽくないバリューを入力すると、エラーに怒られる事件もあります!(多分正規表現で判断)

PGADMIN_DEFAULT_EMAIL: postgis@example.com

以上のyamlファイルを準備した後、docker composeで実行:

sudo docker-compose up

pgadminのPermission denied エラーが出た場合の処置:

con_pgadmin    | ERROR  : Failed to create the directory /var/lib/pgadmin/sessions:
con_pgadmin    |            [Errno 13] Permission denied: '/var/lib/pgadmin/sessions'
con_pgadmin    | HINT   : Create the directory /var/lib/pgadmin/sessions, ensure it is writeable by
con_pgadmin    |          'pgadmin', and try again, or, create a config_local.py file
con_pgadmin    |          and override the SESSION_DB_PATH setting per
con_pgadmin    |          https://www.pgadmin.org/docs/pgadmin4/8.12/config_py.html

以下の手順で実行したらOKです。

sudo chown -R 5050:5050 ./pgadmin_data

一旦 Ctrl+C、出来上がりを確認

sudo docker ps -a
CONTAINER ID   IMAGE                    COMMAND                  CREATED         STATUS                     PORTS     NAMES
a00000000001   dpage/pgadmin4:latest    "/entrypoint.sh"         3 hours ago     Exited (0) 3 hours ago               con_pgadmin
b00000000001   postgis/postgis:latest   "docker-entrypoint.s…"   3 hours ago     Exited (0) 3 hours ago               con_postgis

もう一度始動:

sudo docker start con_pgadmin && sudo docker start con_postgis

OpenStreetMap データを用意

https://download.geofabrik.de/asia/japan.html」
上記のリンクでosm データ(全国あるいは地方ごろ)をダウンロードします。今回は九州地方データにしました:

wget https://learnosm.org/files/default.style
wget https://download.geofabrik.de/asia/japan/kyushu-latest.osm.pbf

そして、postgisコンテナ内部に侵入!

sudo docker exec -it con_postgis /bin/bash
root@b00000000001:/#

コンテナ内部にもOSMデータファイルがあることを確認:

ls work
default.style  docker-compose.yml  kyushu-latest.osm.pbf pgadmin_data  postgis_data

osm2pgsqlパッケージをインストール:

root@b00000000001:/# apt update
root@b00000000001:/# apt install osm2pgsql

そして、コンテナ内部のデータベースにも確認:

root@b00000000001:/# psql -U postgres

psql (17.0 (Debian 17.0-1.pgdg110+1), server 16.4 (Debian 16.4-1.pgdg110+1))
Type "help" for help.

postgres=# \l
                                                        List of databases
       Name       |  Owner   | Encoding | Locale Provider |  Collate   |   Ctype    | Locale | ICU Rules |   Access privileges   
------------------+----------+----------+-----------------+------------+------------+--------+-----------+-----------------------
 osm_kyushu       | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           | 
 postgres         | postgres | UTF8     | libc            | en_US.utf8 | en_US.utf8 |        |           | 

osm_kyushuというデータベースがあればOKです。

osm_kyushuのpostgis拡張機能も確認:

postgres=# \c osm_kyushu
psql (17.0 (Debian 17.0-1.pgdg110+1), server 16.4 (Debian 16.4-1.pgdg110+1))
You are now connected to database "osm_kyushu" as user "postgres".
osm_kyushu=# create extension postgis;
ERROR:  extension "postgis" already exists
osm_kyushu=# \q

\qを実行すると、コンテナのshellに戻るはずので、いよいよデータのインポート作業:

root@b00000000001:/# osm2pgsql --create --database=osm_kyushu --slim --style=work/default.style -U postgres -H localhost work/kyushu-latest.osm.pbf

osm2pgsql version 1.4.1
Database version: 16.4 (Debian 16.4-1.pgdg110+1)
PostGIS version: 3.4
Node-cache: cache=800MB, maxblocks=12800*65536, allocation method=11
Setting up table 'planet_osm_point'
Setting up table 'planet_osm_line'
Setting up table 'planet_osm_polygon'
Setting up table 'planet_osm_roads'
...
node cache: stored: 31042999(100.00%), storage efficiency: 53.09% (dense blocks: 1222, sparse nodes: 24229488), hit rate: 100.00%
osm2pgsql took 557s (9m 17s) overall.

大体10分ぐらいかかったようです。(i7-8700 CPU 16.0 GiB RTX 2080)

出来上がりを確認

localhost:8088でpgAdmin をアクセス:

サーバーを追加:
image.png

image.png

Host nameはファイルのpostgisのservice名、 Portは右の内部Portにして、Maintence databaseはそのまま:
image.png

大丈夫であれば:
image.png

SQLコードで鹿児島付近の駅を抽出してみた:

SELECT "name", ST_Astext(ST_Transform(way, 4612)) FROM public.planet_osm_point WHERE (railway = 'stop' OR railway = 'station') AND

ST_Contains(
	ST_Transform(
      ST_GeomFromText('POLYGON((130.37 31.45, 130.37 31.79, 130.79 31.79, 130.79 31.45, 130.37 31.45))', 4612),
	  4612
	  ),
    ST_Transform(way, 4612)
  )

LIMIT 1000;

image.png

地図として表示することもできます:

image.png

参照:

ブロッグ作者の方に感謝申し上げます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?