国土交通省国土計画局では、鉄道,地価公示,行政区域等の様々な地図データ(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 を実行すれば、インポート作業は完了します。
インポートされた内容の確認は、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)