GISデータをLinux(Docker上)のPostGISにインポートする方法.
手元のWindows機でshpファイルをSQLに変換した後,Linux機にアップロードしてインポートするときの流れ.
流れ
今回は国土交通省のGISデータをインポートする.
shp2pgsqlをダウンロード
shp2pgsqlはshpファイルをSQLファイルに変換するやつ.
PostgreSQLのバージョンにあった番号が振られてるやつ以下から落としてきたら良さそう
https://download.osgeo.org/postgis/windows/
展開した後,コマンドプロンプトを開き,中のbin
ディレクトリに移動する.
shpをSQLに変換
.\shp2pgsql -W cp932 -D -I -s 4612 .\{shp_filename}.shp {table_name} > {hogehoge}.sql
-W
:文字コードの指定-D
:ダンプ形式で出力(インポート効率がいい)-I
:空間インデックスの作成-s
:座標系指定
データベースの作成
今回はpostgis/postgis:14-3.2イメージで試した.
(コンテナの中に入る)$ docker exec -it {container_name} sh
PostgreSQLに接続$ psql -U postgres
データベース作成postgres=# CREATE DATABASE {database_name}
データベース選択postgres=# \c n0221;
PostGIS有効化postgres=# CREATE EXTENSION postgis;
インポート
# psql -U postgres n0221 < /N02-21_GML/N02-21_RailroadSection.sql
終わり.インポートできたことを確認する.
詰まりどころ
PowerShellの文字コードのデフォルトがUTF-16LE
> chcp 65001
でUTF-8になる
PowerShellでリダイレクトすると文字化けする
コマンド実行結果をファイルにリダイレクトしたときのデフォルトの文字コードはUTF-16に設定されている.(ドウシテ)
UTF-8にする設定もあるようで試してみたけどうまくいかず.
PowerShellをやめてコマンドプロンプトで実行したら解決.
PostGISの有効化忘れ
有効化忘れ時インポートエラー文
1 | ERROR: function addgeometrycolumn(unknown, unknown, unknown, unknown, unknown, integer) does not exist |
PostGISを有効化する.
解決方法: コンテナ内で,psql -U postgres -d n0221 -c "CREATE EXTENSION postgis;"