PostGISへの空間データの収容1

以前の記事で、オラクルデータベースに国勢調査の小地域データ(ほぼ小字界面に相当)を読み込んで利用しました。
今回は、PostGISを使って同じことをしてみましょう。

作業内容の確認と必要物件のダウンロード

まずは国勢調査の小地域のシェープファイルをダウンロードします。

国勢調査の小地域データのダウンロード

以前の記事でも取り扱ったことのある2015年版国勢調査の小地域(町丁・字等別)データを使用します。
ダウンロードは、こちらから行います。以下の画面が表示されますので、東京都全域を指定します。

2015年版国勢調査の小地域のダウンロード画面

データの仕様を以下に列挙します。

  • 丁目(小字)までの領域をがポリゴン化
  • 住所名や住所コードを付与
  • 2018年に公開された最新版
  • 選択したデータ
    • データ形式はシェープファイルを選択(KMLなどもあり)
    • データの範囲は東京全域を選択(島しょ部を含む)
    • 座標系は世界測地系の緯度経度を選択(平面直角もあり)

shp2pgsql-guiのダウンロードと起動

以前の記事でもご紹介しましたが、シェープファイルをPostGISへ導入するGUIツールshp2pgsqlを導入しましょう。
媒体は、以下のサイトからダウンロードします。(32ビット版はバージョンが古いため64ビット版の使用をお勧めします)
 64ビット版 http://download.osgeo.org/postgis/windows/pg11/
 32ビット版 http://download.osgeo.org/postgis/windows/pg96/
媒体は、zipファイルをダウンロードしてください。

ダウンロードしたzipファイルを開き“bin\postgissui”フォルダだけを任意の場所に解凍します。以上で導入は終了です。

変換作業

変換作業は以下の手順で行います。

  1. shp2pgsql-guiの起動
  2. PostGISへの接続
  3. シェープファイルの指定と登録の実行
  4. データの確認

1.shp2pgsql-guiの起動
先ほどダウンロードして解凍した”bin\postgissui”フォルダ内の”shp2pgsql-gui.exe”をダブルクリックして起動すると、下記画面が表示されます。

shp2pgsql-guiの起動画面

2.PostGISサーバーへの接続
”View Connection Details…”ボタンを押下すると、データベース接続先を指定する画面が表示されますので、接続情報を入力し”OK”ボタンを押下します。

PostGISへの接続指定

接続が成功すると画面下部の”Log Window”に、以下のようにPostGISへの接続が成功した旨のメッセージ(ログ)が表示されます。

接続成功のログ

3.シェープファイルの指定と登録の実行
接続に成功したら、ダウンロードしたシェープファイル(国勢調査の小地域)を読み込みます。”Add File”ボタンを押下するとインポート用のウィザード画面が表示されますので、PostGISへ登録するシェープファイルを指定します。
SRIDは”4612”(JGD2000 緯度経度)に指定してください。

読み込みシェープファイルの指定

”Import”ボタンを押下するとPostGISのテーブルへの取り込みが開始されます。
データ件数は6,010件、10分程度で取り込みは終了します。

動作確認

取り込みが完了したところで動作確認していきましょう。
今回は、PostgreSQLのコマンドラインツールpsqlにて確認を行います。
pgAdminを導入している場合、psqlは以下のディレクトリに存在しますので、パスと通しておくとよいでしょう。
 ($pgadmin4)\v4\runtime\psql.exe
   ※($pgadmin4)は、pgAdminインストールディレクトリ

まずは、psqlからPostGISへ接続し取り込んだデータベースオブジェクトを確認しましょう。
psqlにて“\d”コマンド(おそらくdescribe(説明)という意味)を発行します。。

postgis=#psql -d postgis -h sakura -p 5432 -U takamoto
Password for user takamoto:
psql (12.2, server 11.2 (Debian 11.2-1.pgdg90+1))
Type “help” for help.
postgis=# \d
List of relations
Schema | Name | Type | Owner
----+----------+----+-----
public | geography_columns  | view  | takamoto
public | geometry_columns  | view   | takamoto
public | kokusei       | table   | takamoto
public | kokusei_gid_seq   | sequence | takamoto
public | kueki        | view   | takamoto

先ほど読み込んだテーブル”kokusei”が確認できましたので、psqlから以下のコマンドを発行してカラムとデータ型を確認します。
 “\d テーブル名”

postgis=# \d kokusei
Table “public.kokusei”
 Column  |     Type    | Collation | Nullable |   Default
------+-----------+----+----+-----------------
gid    | integer        |    | not null | nextval(‘kokusei_gid_seq’::regclass)
key_code | character varying(11) |    |     |
pref    | character varying(2) |     |     |
city    | character varying(3) |     |     |
s_area   | character varying(6) |     |     |
pref_name | character varying(12)|     |     |
city_name | character varying(14)|     |     |
s_name  | character varying(96) |     |     |
kigo_e  | character varying(3) |     |     |
geom   | geometry(MultiPolygon,4612) | |     |

kokuseiテーブルについては、索引も確認しておきましょう。

postgis=# select tablename,indexname from pg_indexes where tablename like ‘kokusei%’;
 tablename | indexname
------+-----------
 kokusei | kokusei_pkey 
 kokusei | kokusei_geom_idx
(2 rows)

空間索引も作成されているようです。

特定場所の住所検索

次に、特定場所の住所を検索(逆ジオコーディング)してみましょう。
今回のデータでは、番地や号までは検索できませんが、町・丁目までの検索ができます。

postgis=# SELECT city_name||s_name FROM kokusei
      WHERE ST_Contains( geom,ST_GeomFromText(‘POINT(139.76 35.68)’, 4612));
    column
----------------------------------
千代田区丸の内1丁目
(1 row)

シェープファイルから読み込んだkokuseiテーブルのポリゴンが収容されているカラム(geom)に対して、WKT形式で点データをSRID=4612にて、ST_Containsにて範囲内検索を行っています。

特定住所の隣接住所の検索

次に、先ほどのSQLを副問い合わせにして周辺のポリゴンを検索します。
SQL的には、sdo_touch関数にて辺の接するレコードを取得します。

select city_name||s_name from kokusei k2
where ST_Touches(
(SELECT geom FROM kokusei
WHERE
ST_Contains(geom,ST_GeomFromText(‘POINT(139.767 35.68)’, 4612)))
,k2.geom);
   column
————————————-
 千代田区丸の内2丁目
 千代田区丸の内3丁目
 千代田区大手町1丁目
 千代田区大手町2丁目
 千代田区皇居外苑
 千代田区千代田
 中央区八重洲1丁目
 中央区八重洲2丁目
 (8 rows)

OpenJUMPのプラグインである”DBQuery”を使って上記SQLを発行し地図表示させると以下のようになります。

”丸の内1丁目”に接する面が選択されている

まとめ

今回は、シェープファイルをPostGISに取り込む方法と簡単な空間検索を説明しました。
空間関数の使い方もオラクルと大差ないことを理解してもらえたと思います。

以下の記事では、PythonからPostgreSQLへの接続方法や、QGISのPythonコンソールやVBAからPostGISの利用例を紹介しています。

また、以下の記事では今回取り扱った国勢調査の小地域データをオラクルデータベースへ取り込む方法を紹介しています。