このページの内容は、 FOSS4G と都市計画 12講 にまとめています。

GIS Lecture 2: PostGIS を使う。

OSMacOSX 10.5 - 10.8
PostgreSQL9.0
PostGIS1.5

2.1. PostGISの概要

PostrgreSQL は、本格的な RDBM サーバです。 QGIS に PostgreSQL を使用する利点をあげると、以下のようになります。

  • 長いフィールド名 - Shapefile ではフィールド名の長さに制約がありますが、PostgreSQL ではかなり長いフィールド名を使うことができます。 ただし、最終的に Shapefile にする必要がある場合は要注意です。
  • QGIS が比較的苦手とする、属性の操作が速い。
  1. PostgreSQL ユーザ名: 通常 postgres
  2. データベース名: 都市ごと、あるいは業務ごとにデータベースを作成するのが適当でしょう。例えば kyoto

2.2. PostGIS のインストールと初期設定

初期設定でエラーが出た場合、だいたいがユーザ権限に関わるものです。 フォルダのアクセス権減などを確認してください。

1. 'postgres' というユーザ名のユーザを作成する。

2. データフォルダを作成する。ここでは、/Volumes/Data/pgdata とします。 あらかじめ、postgres から読めるようパーミッションを設定してください。 例えば、

$ mkdir -p /Volumes/Data/pgdata
$ chmod 777 /Volumes/Data/pgdata
$ sudo -u postgres initdb -D /Volumes/Data/pgdata

すると、以下のようなメッセージが表示されます。

The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locales
  COLLATE:  C
  CTYPE:    UTF-8
  MESSAGES: C
  MONETARY: C
  NUMERIC:  C
  TIME:     C
The default database encoding has accordingly been set to UTF8.
initdb: could not find suitable text search configuration for locale UTF-8
The default text search configuration will be set to "simple".

fixing permissions on existing directory /Volumes/Data/pgdata ... ok
creating subdirectories ... ok
selecting default max_connections ... 50
selecting default shared_buffers ... 5600kB
creating configuration files ... ok
creating template1 database in /Volumes/Data/pgdata/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
loading PL/pgSQL server-side language ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the -A option the
next time you run initdb.

Success. You can now start the database server using:

    postgres -D /Volumes/Data/pgdata
or
    pg_ctl -D /Volumes/Data/pgdata -l logfile start

メッセージに、サーバの起動方法があります。

$ sudo -u postgres postgres -D /Volumes/Data/pgdata

Fink では、よりメモリ管理の優れた以下の別の方法を進めています。 ただし、この場合は postgres を管理者にしておく必要があります。

$ sudo -u postgres pgsql.sh start

また、以下のようにすると、Macを立ち上げたときに自動的に PostgreSQL サーバを起動させます。

$ sudo daemonic enable postgresql90

PostgreSQL サーバを立ち上げたら、まずデータベースを作成します。

$ createdb -U postgres kyoto

次に、今作成したデータベース kyoto に、PostGIS をインストールします。

$ sudo -u postgres psql \
 		-f /sw/share/doc/postgis90/contrib/postgis-1.5/postgis.sql \
 		-d kyoto
$ sudo -u postgres psql \
 		-f /sw/share/doc/postgis90/contrib/postgis-1.5/spatial_ref_sys.sql \
 		-d kyoto

なお、PostGIS のバージョンアップをする場合は、

$ sudo -u postgres /sw/opt/postgresql-9.0/bin/psql \
 		-f /sw/share/doc/postgis90/contrib/postgis-1.5/postgis_upgrade_XX_to_15.sql \
 		-d kyoto
Password:
SET
BEGIN
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE TYPE
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION

...

DROP FUNCTION
DROP FUNCTION
$ 

このようなメッセージが出ていれば、正常に PostGIS が作成されました。

次に、既存の Shapefile を PostGIS に読み込みましょう。

shp2pgsql -g the_geom -i -S -W CP932 -s 4612 h12ka26101.shp census >h12ka26101.sql
  • -g the_geom - ジオメトリ(図形)データを、the_geom というフィールドに出力します。 ジオメトリデータを格納するフィールド名はなんでもよいのですが、別テーブルに指定されます。
  • -S - デフォルトでは、MULTIPOLYGON として出力されます。 実際はただの POLYGON なので、POLYGON として出力するためのオプションです。
  • -i - Use int4 type for all integer dbf fields.
  • -W CP932 - Shift-JIS 形式だと伝えるためです。
  • -s 4612 - SRID が 4612 であることを伝えます。 SRID については、測地系をご覧ください。
  • h12ka26101.shp - 入力 Shapefile です。
  • census - PostgreSQL内でのテーブル名です。
  • >h12ka26101.sql - h12ka26101.sql というファイルに保存します。
$ psql -U postgres -d kyoto -f h12ka26101.sql
  • -U postgres - PostgreSQL ユーザ postgres で実行します。
  • -d kyoto - データベース kyoto に対して実行します。
  • -f h12ka26101.sql - h12ka26101.sql の内容を実行します。

2.3. PostgreSQL 操作

まず、 PostgreSQL にログインします。

$ psql -d kyoto -U postgres

どのようなデータがあるか見てみましょう。

kyoto=# \d
                List of relations
 Schema |       Name        |   Type   |  Owner   
--------+-------------------+----------+----------
 public | geography_columns | view     | postgres
 public | geometry_columns  | table    | postgres
 public | spatial_ref_sys   | table    | postgres
 public | census            | table    | postgres
 public | census_gid_seq    | sequence | postgres
(5 rows)

PostgreSQL 固有のコマンドに、以下のようなものがあります。
\d - テーブル一覧を表示します。
\d テーブル名 - テーブルの情報を表示します。

kyoto=# SELECT moji FROM census;

2.4. Geoprocessing

CREATE TABLE newtable AS SELECT * FROM (SELECT oldtable.*, (ST_Dump(ST_Intersection(clipper.the_geom, oldtable.the_geom))).geom As the_geom FROM clipper INNER JOIN roadlinks_notclipped ON ST_Intersects(clipper.the_geom, oldtable.the_geom)) As oldtable_clipped ;

2.5. pgRouting

$PSQL -f $DIR_COMMON/workspace/dist/sql/postgis.sql -d $DATABASE $PSQL -f $DIR_COMMON/workspace/dist/sql/spatial_ref_sys.sql -d $DATABASE $PSQL -f $DIR_COMMON/workspace/dist/sql/routing_core.sql -d $DATABASE $PSQL -f $DIR_COMMON/workspace/dist/sql/routing_core_wrappers.sql -d $DATABASE $PSQL -f $DIR_COMMON/workspace/dist/sql/routing_topology.sql -d $DATABASE $PSQL -f $DIR_COMMON/workspace/dist/sql/matching.sql -d $DATABASE $PSQL -f $DIR_COMMON/workspace/dist/sql/routing_tsp.sql -d $DATABASE $PSQL -f $DIR_COMMON/workspace/dist/sql/routing_tsp_wrappers.sql -d $DATABASE

注意点

PostgreSQL テーブルは、QGIS で操作することができます。 しかし、QGIS フィールドを追加すると、\d コマンドでは確認できるものの、そのフィールド名を含んだSQL文を実行するとエラーが返ってきます。 フィールドの追加は PostgreSQL や、QGIS のデータベースプラグインで行うようにしましょう。