データの格納と表示
農業・食品産業技術総合研究機構 近畿中国四国農業研究センター
寺元 郁博
はじめに
今回は、実際に GIS データベースにデータを叩き込んでみます。 また、格納されたデータを、デスクトップ GIS で表示してみます。 本例での前提は次の通りです。
- データベース名は pgis
- 格納するデータは、国土数値情報 (行政区域) のうち広島県
- テーブル名は admarea
- ジオメトリカラム名は the_geom (shp2pgsql のデフォルト)
ここで突然「ジオメトリカラム」という語を出してしまいましたが、ジオメトリ型のカラムという意味です。 本例では MULTIPOLYGON 型を使用します。 ジオメトリ型には、他にも POINT, LINESTRING, POLYGON 型などがあります。
空間データベースの作成
まずは、叩き込み先となる空間データベースを作成します。 データベース名は "pgis" とします。
% createdb pgis -E UTF-8 % psql pgis -f postgis.sql % psql pgis -f spatial_ref_sys.sql
国土数値情報(行政区域)を取得する
サンプルデータは日本ローカルの方がよろしいかと思いますので、日本のデータを取ってきましょう。
国土交通省国土計画局が無償配布している「国土数値情報」を開いてみて下さい。 「JPGIS準拠データ」と「国土数値情報統一フォーマット」に分かれていますが、「JPGIS準拠データ」にします。
次に「行政区域(面)」を選択して下さい。これは、日本全国の市区町村ポリゴンデータです。
次のページでは、前半は解説記事となっており、ページ中ほどに「ダウンロードするデータの選択」と出てきますので、とりあえず一県だけ選択して下さい。 そうすると、その県のファイル一覧が出ます。これらは年度ごとに分かれています。ここでは最新のものを選択して下さい。
例えば広島県だと、平成20年版が最新で、N03-090320_34.zip というファイルでした。 zip で提供されているので、unzip してあげると、xmlファイルが出てきます。 N03-090320_34.xml と KS-META-N03-090320_34.xml が現れます。 ここで、"090320"は、公開年月日を、"34"は都道府県コードを示しますので、ダウンロードした都道府県、年度によって値が異なります。 また、KS-META-*.xml は、メタデータですので、今回は無視して下さい。 N03-*.xml が、データ本体です。
JPGISからシェープファイルに変換する
ダウンロードしたデータは、JPGIS (XML) 形式で配布されていて、PostGIS では扱えません。 変換しようにも、PostGIS ではシェープファイルは shp2pgsql で PostGIS に叩き込めますが、JPGIS は変換できません。
そこで、国土数値情報のトップページに戻り、ページ後半に進んでみて下さい。 国土数値情報データ変換ツールのページにあるリンク「変換ツールはこちらからダウンロードできます。」をクリックして、データ変換ツールを入手して下さい。 また、同ページにはマニュアルも用意してくれていますので、参考にして下さい。
シェープファイルに変換した結果として、N03-090320_34_EC01.shp, N03-090320_34_EC01.dbf, N03-090320_34_EC01.shx の3ファイルが生成されます。 この3ファイルをまとめて、ひとつの「シェープファイル」をなしています。 若干説明しますと、*.shp は線やポリゴン等のデータが入っており、dbf は shp データと1対1に対応するデータテーブルで、DBaseIV 形式です。 また、*.shx は、dbf から shp を探索しやすくするためのインデックスです。 これでお気づきのことかと思いますが、今となっては、かなり古いものです。
シェープファイルからPostGISへ (コマンドライン)
シェープファイルからダンプ形式に変換する
シェープファイルに変換できたところで、ようやくshp2pgsqlの登場となります。
% shp2pgsql -s 4612 -D -i -I -W cp932 (shpファイル) (テーブル名) > (SQLファイル名)
標準出力に出てきますので、リダイレクトして下さい。
このコマンドで指定したオプションの意味は、次の通りです。
- -Dはダンプ形式にするためのものです(これが無い場合はINSERT文が並べられ、叩き込むのに時間がかかります)。
- -iは整数を32ビットにするためのものです(これが無い場合は16ビットにされます)。
- -Iは作成されるGEOMETRY型カラムに空間インデックスを貼るSQL(CREATE INDEX)を生成するためのものです。
- -W cp932 は、シェープファイルの文字コードを指定します。なおShiftJISでなくcp932とする方が無難です。
- -s 4612 は「おまじない」です。
テーブル名を admarea, shp ファイル名を N03-090320_34_EC01.shp, 出力SQLファイル名を N03-090320_34_EC01.sql とする場合には、次のようになります。(掲載の都合上、1行の処理を改行しています)
% shp2pgsql -s 4612 -D -i -I -W cp932 N03-090320_34_EC01.shp admarea \ > N03-090320_34_EC01.sql
SQLファイルの実行
ダンプ形式は、普通にpsqlから実行可能ですから、次のように実行することで、叩き込むことができます。
psql pgis -f N03-090320_34_EC01.sql
SQL の中身
作成した SQL ファイルを少し見てみましょう。
SET CLIENT_ENCODING TO UTF8; SET STANDARD_CONFORMING_STRINGS TO ON; BEGIN; CREATE TABLE "admarea" (gid serial PRIMARY KEY, "prn" varchar(6), "sun" varchar(1), "con" varchar(6), "cn2" varchar(10), "aac" varchar(5) ); SELECT AddGeometryColumn('','admarea','the_geom','4612','MULTIPOLYGON',2); COPY "admarea" ("prn","sun","con","cn2","aac","the_geom") FROM stdin; ...
最初にテーブルを生成しています。これは一般的なテーブル生成と同じです。 ジオメトリカラムは作成されていません。 代わりに AddGeometryColumn() 関数でジオメトリカラムが生成されます。
AddGeometryColumn()を使うのは、geometry_columns というテーブルと同期を取るためです。 geometry_columns は、PostgreSQL 自体が持つカラム情報では管理しきれない空間データ特有のカラム情報を管理するものです。 ジオメトリカラムは CREATE TABLE で作成せずに、AddGeometryColumn() で作成して下さい。
CREATE TABLEで、第1列に gid という serial 型カラムができていますが、これは、レコードを特定するために、フロントエンドからユニーク制限のついたカラムがよく求められるためです。
また、shp2pgsql によって生成されるSQLファイルでは、デフォルトでは、ジオメトリカラム名は "the_geom" になります。変更するには、shp2pgsql に -g オプションを付けて下さい。
シェープファイルからPostGISへ (pgAdmin III)
スタックビルダからインストールした際に、pgAdmin III から shp2pgsql を実行可能にした場合には、次のようなやり方で格納ができます。
- pgAdminの「プラグイン」メニューから「PostGIS Shapefile and DBF Loader」を選択します。
- 「PostGIS Shapefile and DBF Importer」というダイアログが現れます。「Shape File」部のボタンをクリックして、shpファイルを指定します。
- 「Configuration」部のSRIDを「4326」にします。理由は触れません。
- 「Options」ボタンをクリックします。
- 「DBF file character encoding」を「cp932」にします。
- 「Import」ボタンをクリックすると、格納を開始します。
Quantum GIS (QGIS) の入手
PostGIS から若干それて、QGIS (Quantum GIS) をインストールします。 QGIS は、PostGIS のフロントエンドとして動作するデスクトップ・アプリケーションです。 用意した GIS データを使って地図を描画することができます。
第1回で軽く触れましたが、PostGIS はバックエンドを担当して、地図は全く生成しません。 QGIS は一般的な GIS で地図表示をしてくれるうえ、PostGIS のテーブルを普通に扱うことができます。
バイナリは本家サイトから取得できます。 「Download」「Current Software」と進んで下さい。
Windows 用には、本家サイトからのダウンロードの他に、Cygwin ライクにインストールできる、OSGeo4W という仕組みがあります。
QGIS で表示してみる
インストールができたら、QGIS を実行して、空間テーブルの中身を見てみましょう。
QGISのメニューから「レイヤ」「PostGISレイヤの追加」を選択します。
ダイアログが出ますので「新規」をクリックします。
名称(任意)、ホスト、データベース、ポート、SSLモード、ユーザ名、パスワードを順次設定します。「テスト接続」をクリックして、接続できることを確認したら「OK」をクリックして終了します。
「接続」をクリックすると、現在作られているテーブル一覧が表示されます。表示したいテーブルを選択して、「追加」をクリックします。
広島県内の市区町村が表示されています。
おわりに
今回は、国土数値情報のダウンロード、シェープファイルへの変換、PostGIS への格納を行いました。また、格納したデータを図示してみました。
次回は、PostGIS らしく、クエリを実行してみます。