このページの内容は、 FOSS4G と都市計画 12講 にまとめています。
GIS Lecture 2: PostGIS を使う。
OS | MacOSX 10.5 - 10.8 |
---|---|
PostgreSQL | 9.0 |
PostGIS | 1.5 |
2.1. PostGISの概要
PostrgreSQL は、本格的な RDBM サーバです。 QGIS に PostgreSQL を使用する利点をあげると、以下のようになります。
- 長いフィールド名 - Shapefile ではフィールド名の長さに制約がありますが、PostgreSQL ではかなり長いフィールド名を使うことができます。 ただし、最終的に Shapefile にする必要がある場合は要注意です。
- QGIS が比較的苦手とする、属性の操作が速い。
- PostgreSQL ユーザ名: 通常 postgres
- データベース名: 都市ごと、あるいは業務ごとにデータベースを作成するのが適当でしょう。例えば 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 のデータベースプラグインで行うようにしましょう。