Monday, September 16, 2013

技術|Postgisを利用して、MapServerで地図を書き出す (Mac OSX 10.8.4)

地理データの格納、加工、抽出などの処理にデータベースが便利です。そこで、PostgreSQLとPostgisを利用して、テストデータをデータベースに格納し、MapServerで地図を書き出してみます。

PostgreSQLやPostgisをMac OSXで利用する方法はいくつかあります。今回はPostgis本家が推奨するPostgre.appを使いました。


0.参考情報

 



1.格納するデータの準備


テストデータとして、政府の統計窓口から千代田区の境界データを入手します。

▼千代田区の境界&人口データをダウンロード


平成22年国勢調査(小地域)から「男女別人口総数及び世帯総数」を選択

地域選択で千代田区を選び、境界データ「世界測地系平面直角座標系・Shape形式」をダウンロード


2.Postgres.appのインストール


▼Postgres.appのダウンロードと起動


Postgres.appダウンロードし、アプリケーションフォルダにコピーします。アイコンをダブルクリックすれば、サーバーが起動します。

私の場合、なぜかダウンロードフォルダにもこのファイルをおいておかないと、一部コマンドが使えませんでした。

▼Pathの設定

ターミナルからbashにパスを通します。

username$ PATH="/Applications/Postgres.app/Contents/MacOS/bin:$PATH"

.bash_profileに登録したのですが、エラーが出てしまうのでひとまずこちらで作業してます。


3.データベースの準備


今回、「test_pg」という名前でデータベースを作り、データを格納していきます。

▼データベースへの接続

psql -h localhost

psqlでもOKです。

▼データベースの作成とpostgisの拡張設定

CREATE DATABASE test_pg;

CREATE EXTENSION postgis;

一度、psqlを終了します。


4.データのインポート


Shape形式のファイルをPostgreSQLに読み込むためには、テーブルを作り、そのテーブルにデータをインポートする作業が必要です。そこで、shp2pgsqlを利用します。

▼shp2pgsqlでテーブルを作るSQL文を生成、postgreSQLで実行

username$ shp2pgsql -p (格納先ディレクトリ)/h22ka13101 kyokai_chiyoda | psql test_pg

-p はテーブルを作成するための引数

kyokai_chiyodaは作成するテーブル名

パイプを利用して、データベースtest_pgに向けてテーブルを作るSQL文を実行

▼shp2pgsqlでINSERTのSQL文を生成、postgreSQLでchiyodaテーブルにデータを格納 

username$shp2pqsql -a -s 2451 -W cp932 (格納先ディレクトリ)/h22ka13101 kyokai_chiyoda | psql test_pg

-aはINSERTのための引数

-s 2451 は投影法を指定するためのSRIDです。今回のデータは平面直角座標で、東京近辺なので同座標の9系にあたる2451を指定

-W cp932は文字コードです。このデータはShift-JISですのでcp932

kyokai_chiyodaはデータをINSERTするテーブル


5.MapServerとの連動確認


MapServerで地図を生成してみます。

▼XY座標 両端の確認

username$ ogrinfo (格納場所ディレクトリ)/h22ka13101.shp -al | grep Extent
Extent: (-9363.292969, -36768.390625) - (-4566.155273, -32703.031250)

ogrinfoでShapeファイルの内容を覗き、grepでXY座標の両端を示すExtentの行だけ読み出します。

▼mapファイルの作成 (chiyoda.map)


MAP
 SIZE 800 800 #画像size
 EXTENT -9363 -36768 -4566 -32703      #出力範囲の座標
 IMAGECOLOR 255 255 255      #背景色R G B
 IMAGETYPE PNG      #地図画像を保存する形式
 LAYER
  NAME "kyokai"
  CONNECTIONTYPE POSTGIS
  CONNECTION "user=(username) password='' dbname=test_pg host=localhost"
  DATA "geom FROM kyokai_chiyoda"      #select文
  TYPE LINE
  STATUS ON
  CLASS
   COLOR 0 0 0
  END
 END
END

EXTENTにはogrinfoで読み出した情報を入力しています。範囲は任意に設定できます。

▼地図画像の作成

username$ shp2img -m (格納場所ディレクトリ)/chiyoda.map -o chiyoda.png

shp2imgを利用して、作成したmapファイルを呼び出します。このマップファイルに指示された条件で、PostgreSQLがtest_pgデータベースから千代田区の地図情報を読み出し、MapServerが地図を生成します。

▼完成画像 (chiyoda.png)


千代田区のマップが出力されました。

No comments: