end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

国土交通省にあるGISデータをPostGISへインポート(改訂版)

以前、同様の内容を記載していますが、先日、postgisosxへinstallしたついでにgisデータのインポート手順を改めて書き留めておきます。
http://d.hatena.ne.jp/end0tknr/20080830/1220079398

公開されているGISデータ

GISデータは様々な所から入手できますが、今回は、国土交通省 国土計画局が提供している海岸線データをpostgisへインポートします。

国土交通省 国土計画局
http://nlftp.mlit.go.jp/ksj/index.html
http://nlftp.mlit.go.jp/ksj/jpgis/jpgis_tool.html shape形式への変換ツール
国土交通省 国土地理院
http://fgd.gsi.go.jp/download/
産業技術総合研究所(活断層データベース)
http://riodb02.ibase.aist.go.jp/activefault/index.html
政府統計の総合窓口
http://www.e-stat.go.jp/SG1/estat/eStatTopPortal.do

xml→shape形式への変換

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

国土計画局ではxml形式でgisデータを公開していますが、shape形式への変換ツール(KsjTool)も提供しています。
KsjToolで先程の.xmlを変換すると、次の3個のファイルが作成されますが、これらのファイルをshape形式と言うようです。

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

※国土計画局では、「暫定処置として、KsjToolを提供」としているので、 KsjToolはダウンロードした上で、ローカル環境にバックアップした方が良いかもしれません。

shp2pgsql により、shape→sql変換

postgisgisデータをインポートするには、更にshp2pgsqlでsqlに変換する必要があります。

まず、shp2pgsql -p でcreate table 文を作成してください。

$ /usr/local/pgsql/bin/shp2pgsql -p \
  ~/tmp/kaigan_shp/C23-06_01_CP01 kaigan > ~/tmp/kaigan_sql/0.sql

create tableの内容

SET CLIENT_ENCODING TO UTF8;
SET STANDARD_CONFORMING_STRINGS TO ON;
BEGIN;
CREATE TABLE "kaigan" (gid serial PRIMARY KEY,
"aac" varchar(5),
"sln" varchar(1),
"asl" varchar(1),
"can" varchar(4),
"nca" varchar(26),
"aca" varchar(1),
"nac" varchar(10),
"dca" varchar(1),
"df1" varchar(1),
"df2" varchar(1),
"bbn" varchar(1),
"rim" varchar(5));
SELECT AddGeometryColumn('','kaigan','the_geom','-1','MULTILINESTRING',2);
COMMIT;

次にshp2pgsql -a でinsert 文を作成してください。

$ /usr/local/pgsql/bin/shp2pgsql -W cp932 -a \
    ~/tmp/kaigan_shp/C23-06_01_CP01 kaigan > ~/tmp/kaigan_sql/1.sql

insert intoの内容(抜粋)

SET CLIENT_ENCODING TO UTF8;
SET STANDARD_CONFORMING_STRINGS TO ON;
BEGIN;
INSERT INTO "kaigan"
 ("aac","sln","asl","can","nca","aca","nac","dca",
  "df1","df2","bbn","rim",the_geom)
VALUES
 ('8202',NULL,'6',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'false',
 '0105000000010000000102000000240100005EEDCD14EF9661402869C975A558...

国土計画局で提供しているgisデータはshift jisで提供されていますが、shp2pgsql -a の際、エンコーディング(-W cp932)を指定しない場合、次のようなエラーが発生します。

$ /usr/local/pgsql/bin/shp2pgsql -a \
  ~/tmp/kaigan_shp/C23-06_01_CP01 kaigan > ~/tmp/kaigan_sql/1.sql
Shapefile type: Arc
Postgis type: MULTILINESTRING[2]
Unable to convert field value "?P?K???`?@?P?K??" 
  to UTF-8: iconv reports "Illegal byte sequence"

gisデータのインポート実行

sql形式への変換まで完了すれば、後は次のようにpsqlコマンドでgisデータをインポートできます。

$ /usr/local/pgsql/bin/psql -U postgres kaigan < ~/tmp/kaigan_sql/0.sql
$ /usr/local/pgsql/bin/psql -U postgres kaigan < ~/tmp/kaigan_sql/1.sql
  :

mapserverでインポート結果の確認

gisデータのインポート結果は、mapserverで作成した画像ファイルで確認すると簡単だと思います。

MAP
    SIZE 800 800           #画像size
    EXTENT 128 33 150 44   #出力範囲の座標
    STATUS ON              #地図を表示するか
    UNITS DD               #地図の単位(DD は緯度経度)
    IMAGECOLOR 255 255 255 #背景色R G B
    IMAGETYPE PNG          #地図画像を保存する形式
    LAYER
         NAME "kaigan"
         CONNECTIONTYPE POSTGIS
         CONNECTION "user=postgres password='' dbname=kaigan host=localhost"
         DATA "the_geom FROM kaigan" #select文
         TYPE LINE
         STATUS ON
         CLASS
             COLOR 0 0 0
         END
    END
END

mapfileを上記の様に記述し、mapserverのshp2imgを実行すると、次のpngファイルが作成されます。

$ ~/local/mapserver-5.6.3/shp2img -m kaigan.map -o kaigan.png

実行結果