PostGISは、PostgreSQLを拡張してジオメトリ演算を可能にするPostgreSQLの追加(アドオン)パッケージです.
2006/03/30 に最新版 1.1.2 がリリースされました。
そもそも
PostgreSQL単品で見た場合でも、ここまで出来ちゃうんだそうです。
PostGISのメリットはどこにあるんだろうと言うのをちょっと考えないといけないですな。
少なくとも、ESRI shapefileをSQL化してくれるツールは絶対に有用だが。
事前準備
PostgreSQLのインストール
まずは,PostgreSQLを[[日本PostgreSQLユーザ会>http://www.postgresql.jp/]]などからインストール
しましょう.2006/02/14に8.1.3がリリースされていたのでそれを使います.
cd postgresql-8.1.3/
./configure --prefix=$HOME/local/pgsql-8.1.3
make
make install
PostgreSQL8.0.0まではPostGISのためにソースが必要だったみたいですが,今は無くても良いみたいです.
とりあえず,ここでは安全倒しでソースからインストールします.
PostgreSQLの起動
cd $HOME/local/pgsql-8.1.3
./bin/initdb -D $HOME/local/pgdata
./bin/pg_ctl -D /home/naotaka/local/pgdata -l logfile start
上記で取り合えず起動できますが,詳しくはPostgreSQLのドキュメントを参照してください.
事前にライブラリをインストール
* libgeos-dev
* proj
PostGISのインストール
コンパイル&インストール
./configure --with-pgsql=$HOME/local/pgsql-8.1.3/bin/pg_config
ここで,特定の($PATHに通っていない)PostgreSQLを指定するためには,pg_configコマンドを--with-pgsqlで
指定します.ディレクトリではありません.
# わかりにくい仕様だ.
make
make test ← ここで,サーバが起動していないといけません
ひとつこけた.
PostgreSQL 8.1.3 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.3.5 (Debian 1:3.3.5-13)
Postgis 1.1.2 - 2006-04-06 05:47:03
GEOS: 2.1.1
PROJ: Rel. 4.4.9, 29 Oct 2004
Running tests
regress: Ok.
regress_index: Ok.
lwgeom_regress: Ok.
regress_lrs: Ok.
removepoint: Ok.
setpoint: Ok.
simplify: Ok.
snaptogrid: Ok.
affine: Ok.
regress_ogc: Failed (diff /tmp/regress_regress_ogc_diff_24704)
regress_bdpoly: Ok.
regress_proj: Ok.
Run tests: 12
Successful: 11
Failed: 1
make install
PostGIS用の設定
createlang plpgsql yourdatabase
psql -f lwpostgis.sql -d your_database
たとえば,
createdb test0
として,何かデータベースを作っておいて,それをPostGIS化には,
cd postGIS_src_directory/
createlang plpgsql test0
psql -f lwpostgis.sql -d test0
サンプルSQLを打ってみたけど,以下のエラーが出た.
psql:/home/naotaka/src/postgres/insert.sql:22: NOTICE: Invalid schema name - using current_schema()
とりあえず,ここまで
整理しながら,もう一度:
データベース作成
>createdb test2
CREATE DATABASE
>createlang plpgsql test2
>psql -f ~/src/postgres/postgis-1.1.2/lwpostgis.sql -d test2 > /dev/null
psql:/home/naotaka/src/postgres/postgis-1.1.2/lwpostgis.sql:45: NOTICE: type "histogram2d" is not yet defined
DETAIL: Creating a shell type definition.
psql:/home/naotaka/src/postgres/postgis-1.1.2/lwpostgis.sql:50: NOTICE: argument type histogram2d is only a shell
psql:/home/naotaka/src/postgres/postgis-1.1.2/lwpostgis.sql:75: NOTICE: type "spheroid" is not yet defined
DETAIL: Creating a shell type definition.
psql:/home/naotaka/src/postgres/postgis-1.1.2/lwpostgis.sql:80: NOTICE: argument type spheroid is only a shell
psql:/home/naotaka/src/postgres/postgis-1.1.2/lwpostgis.sql:104: NOTICE: type "geometry" is not yet defined
DETAIL: Creating a shell type definition.
psql:/home/naotaka/src/postgres/postgis-1.1.2/lwpostgis.sql:109: NOTICE: argument type geometry is only a shell
psql:/home/naotaka/src/postgres/postgis-1.1.2/lwpostgis.sql:122: NOTICE: return type geometry is only a shell
psql:/home/naotaka/src/postgres/postgis-1.1.2/lwpostgis.sql:127: NOTICE: argument type geometry is only a shell
psql:/home/naotaka/src/postgres/postgis-1.1.2/lwpostgis.sql:237: NOTICE: type "box3d" is not yet defined
DETAIL: Creating a shell type definition.
psql:/home/naotaka/src/postgres/postgis-1.1.2/lwpostgis.sql:242: NOTICE: argument type box3d is only a shell
psql:/home/naotaka/src/postgres/postgis-1.1.2/lwpostgis.sql:296: NOTICE: type "chip" is not yet defined
DETAIL: Creating a shell type definition.
psql:/home/naotaka/src/postgres/postgis-1.1.2/lwpostgis.sql:301: NOTICE: argument type chip is only a shell
psql:/home/naotaka/src/postgres/postgis-1.1.2/lwpostgis.sql:327: NOTICE: type "box2d" is not yet defined
DETAIL: Creating a shell type definition.
psql:/home/naotaka/src/postgres/postgis-1.1.2/lwpostgis.sql:332: NOTICE: argument type box2d is only a shell
psql:/home/naotaka/src/postgres/postgis-1.1.2/lwpostgis.sql:1330: NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "spatial_ref_sys_pkey" for table "spatial_ref_sys"
psql:/home/naotaka/src/postgres/postgis-1.1.2/lwpostgis.sql:1353: NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "geometry_columns_pk" for table "geometry_columns"
README.postgisにあるサンプルを実行:
test2=# SELECT AddGeometryColumn('db','geotest','geopoint',1,'POINT',2);
NOTICE: Invalid schema name - using current_schema()
CONTEXT: SQL statement "SELECT AddGeometryColumn('', $1 , $2 , $3 , $4 , $5 , $6 )"
PL/pgSQL function "addgeometrycolumn" line 4 at select into variables
addgeometrycolumn
----------------------------------------------------
public.geotest.geopoint SRID:1 TYPE:POINT DIMS:2
(1 row)
何かが失敗している.
test2=# \d geotest
Table "public.geotest"
Column | Type | Modifiers
----------+-----------------------+-----------
id | integer |
name | character varying(32) |
geopoint | geometry |
Check constraints:
"enforce_dims_geopoint" CHECK (ndims(geopoint) = 2)
"enforce_geotype_geopoint" CHECK (geometrytype(geopoint) = 'POINT'::text OR geopoint IS NULL)
"enforce_srid_geopoint" CHECK (srid(geopoint) = 1)
一応,カラムの追加は成功しているなぁ....
test2=# SELECT name,AsText(geopoint) FROM geotest;
name | astext
---------+---------------------
Olympia | POINT(-122.9 46.97)
Renton | POINT(-122.22 47.5)
(2 rows)
test2=# SELECT * FROM geotest;
id | name | geopoint
----+---------+----------------------------------------------------
1 | Olympia | 0101000020010000009A99999999B95EC05C8FC2F5287C4740
2 | Renton | 010100002001000000AE47E17A148E5EC00000000000C04740
(2 rows)
追加も,検索も出来た.まぁ,大丈夫???