0
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?

More than 1 year has passed since last update.

YAMAP エンジニアAdvent Calendar 2022

Day 15

都道府県のジオメトリをPostgreSQLで管理する

Last updated at Posted at 2022-12-14

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' # 東京

ちゃんと矩形が登録されていることがわかります

image.png

0
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
0
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?