概要
大量のShapeファイルをPostGISを使って結合する手順です。DockerでPostGIS環境を作成してデータベースにShapeを格納した後、一つのShapeファイルに書き出します。
DockerによるPostGIS環境の構築
使用するPostGISコンテナーのdocker-compose.yml
version: '3'
services:
db:
image: postgis/postgis:9.6-2.5-alpine
ports:
- '5431:5432'
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres-password
volumes:
- pgdata:/var/lib/postgresql/data
- ./data:/var/tmp/data
volumes:
pgdata: {}
Shapeファイルをデータベースに格納する。
以下のようなスクリプトを作成し、フォルダ内の.shpファイルをPostgreSQLデータベースに格納しました。引数で結合させるShapeファイルの名称を与えて、findで取得した.shpファイルを処理しています。
最初のファイルの時に、-pオプションで格納するShapeのテーブルを作成しています。
shp2pgsql -p -s 4326 -W UTF-8 ${file} base_${var} > ./sqlbase/base_${var}_create.pgsql
作成したSQLファイル(.pgsql)をpsqlで実行してテーブル作成、その後Shapeファイルをテーブルに格納しています。shp2pgsqlの-DオプションでCOPYコマンドで格納します。INSERTよりも高速とのこと。
shp2pgsql -a -D -s 4326 -W UTF-8 ${file} base_${var} > ./sqlbase/base_${var}_data${count}.pgsql
var=$1
count=0
while read -d $'\0' file; do
echo $var $count
if [ $count = 0 ]; then
shp2pgsql -p -s 4326 -W UTF-8 ${file} base_${var} > ./sqlbase/base_${var}_create.pgsql
psql -U postgres -d shape -f ./sqlbase/base_${var}_create.pgsql
fi
shp2pgsql -a -D -s 4326 -W UTF-8 ${file} base_${var} > ./sqlbase/base_${var}_data${count}.pgsql
psql -U postgres -d shape -f ./sqlbase/base_${var}_data${count}.pgsql
count=`expr $count + 1`
done < <(find Basemap -name *$var.shp -mindepth 1 -maxdepth 5 -print0)
PostgreSQLからShapeを出力する
bash-5.0# pgsql2shp -u postgres -f ./basemap_join/base_xda.shp shape base_xda
Initializing...
Done (postgis major version: 2).
Output shape: PolyLine
Dumping: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX