end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

国土交通省にあるGISデータをPostGISへインポート

国土交通省国土計画局では、鉄道,地価公示,行政区域等の様々な地図データ(GISデータ)が公開されています。

http://nlftp.mlit.go.jp/ksj/index.html

ここではGISデータがxml形式で公開されていますが、今回は、このデータをPostGISへインポートする方法を紹介します。

PostGISのインストール方法等は、別の機会に紹介します。

GISデータの入手

今回は、都道府県名,市区町村名等を含む「行政区域データ」をPostGISに投入してみます。
次のurlから東京と神奈川のデータをダウンロードしました。

http://nlftp.mlit.go.jp/ksj/jpgis/datalist/KsjTmplt-N03.html

  • 東京(平成19年) : N03-071001_13.zip
  • 神奈川(平成19年) : N03-071001_14.zip

例えば、N03-071001_13.zip には、実際に利用するgisデータ(N03-071001_13.xml)の他にメタ情報(KS-META-N03-071001_13.xml)も含まれています。

KsjToolにより、xml→shape変換

xml→shape変換ツール( KsjTool )も国土計画局で公開されています。

http://nlftp.mlit.go.jp/ksj/jpgis/jpgis_tool.html

KsjToolで先程のN03-071001_13.xmlを変換すると、3個のファイルが作成されますが、これらをshapeファイルと言います。

ファイル名 内容
N03-071001_13_EC01.dbf 図形の座標が保存
N03-071001_13_EC01.shp 属性の情報が保存
N03-071001_13_EC01.shx shpの図形とdbfの属性の対応関係が保存

shp2pgsql により、shape→sql変換

PostGISに含まれているshp2pgsqlコマンドでshape→sql変換が可能ですが、N03-071001_13_EC01.(dbf|shp|shx) を gyosei テーブルにインポートする場合、次のように行います。

$ cd ~/tmp/GYOSEI_N03-071001_13
$ /usr/local/pgsql/bin/shp2pgsql N03-071001_13_EC01 gyosei > gyosei.sql
Shapefile type: Polygon
Postgis type: MULTIPOLYGON[2]
$ 

作成された gyosei.sql の内容を見ると、create table や insert into でgisデータがインポートされることが分かります。

※行政区域データはsjisである為、「SET client_encoding='SJIS';」を追加する必要があります。

BEGIN;
SET client_encoding='SJIS';
CREATE TABLE "gyosei" (gid serial PRIMARY KEY,
"prn" varchar(6),
"sun" varchar(1),
"con" varchar(8),
"cn2" varchar(10),
"aac" varchar(5));
SELECT AddGeometryColumn('','gyosei','the_geom','-1','MULTIPOLYGON',2);
INSERT INTO "gyosei" ("prn","sun","con","cn2","aac",the_geom) VALUES (
<略>

また、神奈川県のデータを同じgyoseiテーブルにインポートする場合、「CREATE TABLE」や「SELECT AddGeometryColumn」はコメントアウトにします。

BEGIN;
SET client_encoding='SJIS';
-- CREATE TABLE "gyosei" (gid serial PRIMARY KEY,
-- "prn" varchar(8),
-- "sun" varchar(1),
-- "con" varchar(8),
-- "cn2" varchar(10),
-- "aac" varchar(5));
-- SELECT AddGeometryColumn('','gyosei','the_geom','-1','MULTIPOLYGON',2);
INSERT INTO "gyosei" ("prn","sun","con","cn2","aac",the_geom) VALUES
<略>

psqlによりGISデータをインポート

gyosei.sql を指定して、psql を実行すれば、インポート作業は完了します。

$ /usr/local/pgsql/bin/psql -U postgres map < gyosei.sql

インポートされた内容の確認は、psqlで可能です。
次の例は、千代田区(aac=13101)に隣接する区を表示したものです。

select a.gid,a.prn,a.con,a.cn2,a.aac
from gyosei a, gyosei b 
where
  b.aac='13101' and
  st_touches(a.the_geom, b.the_geom);


 gid |  prn   |  con   | cn2 |  aac  
-----+--------+--------+-----+-------
  27 | 東京都 | 文京区 |     | 13105
  29 | 東京都 | 台東区 |     | 13106
  31 | 東京都 | 新宿区 |     | 13104
  42 | 東京都 | 中央区 |     | 13102
  47 | 東京都 | 港区   |     | 13103
(5 rows)