2年以上前のことですが、同僚のバックエンドエンジニアでめちゃくちゃ頼りになる @arkirchner san が
国土交通省が提供しているデータを PostgreSQL に登録する検証をしていたのを思い出したので自分もやってみました。
テーブル構成
現実的には以下のような2つのテーブル(prefectures と prefecture_shapes)で構成されると想定し、この記事やソースコードでは prefecture_shapes テーブルだけを作成します。
国土交通省のジオメトリデータは非常にサイズが大きいので prefectures のカラムとして作成しない方がよいでしょう。
ソースコード
Dockerfile
FROM postgres:15-alpine
ENV POSTGRES_DB db
ENV POSTGRES_USER app
ENV POSTGRES_PASSWORD password
ENV POSTGIS_VERSION 3.3.2
# 主に PostGIS の build に必要なライブラリたちをインストールする
RUN apk --update add wget make unzip binutils gcc cmake g++ perl-data-dump \
libxml2-dev geos-dev proj-dev protobuf-c-dev gdal-dev clang llvm
RUN wget --no-check-certificate https://download.osgeo.org/postgis/source/postgis-$POSTGIS_VERSION.tar.gz \
&& tar xvzf postgis-$POSTGIS_VERSION.tar.gz
# PostGIS をインストールする
RUN cd postgis-$POSTGIS_VERSION \
&& ./configure \
&& make \
&& make install \
&& cd ../.. \
&& rm -Rf postgis-$PGROUTING_VERSION \
&& rm postgis-$POSTGIS_VERSION.tar.gz
RUN mkdir -p docker-entrypoint-initdb.d/
# 都道府県の形状データのインポートはコンテナ起動時に以下でコピーされたスクリプトで行う
COPY docker-entrypoint-initdb.d/init.sh docker-entrypoint-initdb.d/
docker-entrypoint-initdb.d/init.sh
# postgis エクステンションを作成する
psql -U $POSTGRES_USER -d $POSTGRES_DB -c "CREATE EXTENSION postgis"
# 作業ディレクトリを作成する
mkdir /tmp/work
pushd /tmp/work
# 都道府県の形状データを国土交通省からしゅとくする
wget https://nlftp.mlit.go.jp/ksj/gml/data/N03/N03-2017/N03-170101_GML.zip
unzip N03-170101_GML.zip
# テーブル名を temp_prefectures として 形状データをデータベースにインポートする
shp2pgsql -I -W latin1 -s 4326 *.shp temp_prefectures | psql -U $POSTGRES_USER -d $POSTGRES_DB
psql -U $POSTGRES_USER -d $POSTGRES_DB << EOF
-- prefecture_shapes テーブルを作成する
CREATE TABLE prefecture_shapes (code char(2) NOT NULL, geom geometry(MultiPolygon, 4326) NOT NULL);
-- temp_prefectures を 都道府県コードごとに ST_Union して prefecture_shapes テーブルにインポートするする
INSERT INTO prefecture_shapes (code, geom)
SELECT code, geom FROM (
SELECT ST_Multi(ST_Union(geom)) AS geom, LEFT(n03_007, 2) AS code
FROM temp_prefectures
WHERE n03_007 IS NOT NULL
GROUP BY LEFT(n03_007, 2)
) prefecture_shapes;
-- temp_prefectures を DROP する
DROP TABLE temp_prefectures;
EOF
popd
# 作業ディレクトリを削除する
rm -rf /tmp/work
クエリしてみる
SELECT code, geom FROM prefecture_shapes code = '13' # 東京
ちゃんと矩形が登録されていることがわかります