2006/04/06

install PostGIS

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)

追加も,検索も出来た.まぁ,大丈夫???