DATE : 2007/08/28 (Tue)
LINESTRING オブジェクト(GEOMETRYCOLLECTION の場合は最初の LINESTRING オブジェクト)から最後の点を抽出する ST_EndPoint 関数(EndPoint 関数)を PostGIS 1.3.1 で使用すると、関数が異常終了します(1.2.1 では問題ありません)。例えば、psql 上で ST_EndPoint 関数を使用した SQL 文を実行すると、次のようなエラーが出て PostgreSQL サーバとの接続が切れてしまいます。
サーバとの接続が想定外にクローズされました おそらく要求の処理前または処理中にサーバが異常終了 したことを意味しています。 サーバへの接続が切れました。リセットしています: 失敗。
ユーザ向けのメーリングリストを調べてみると、これはバグのようです。すでにソースコードは修正されたようです。
しかし、ソースコードは修正されたものの、新しいバージョン(1.3.2)は8月28日現在、まだリリースされていません。単純な機能の関数なので、修正されたソースコードを基に関数を定義し直してみました。
CREATE OR REPLACE FUNCTION ST_EndPoint( geom geometry ) RETURNS geometry AS $$ BEGIN -- LINESTRING の最後の点を返す RETURN ST_PointN( geom, ST_NumPoints( geom ) ); END; $$ LANGUAGE 'plpgsql' IMMUTABLE STRICT; CREATE OR REPLACE FUNCTION EndPoint( geom geometry ) RETURNS geometry AS $$ BEGIN RETURN ST_EndPoint( geom ); END; $$ LANGUAGE 'plpgsql' IMMUTABLE STRICT;
問題のソースコードは C で書かれているので実行時間は劣りますが、機能は同じだと思います。
(;^ω^)1.3.2のリリースまでは、これを代わりに使うことにします。
参考文献
- [postgis-users] Problem with st_endpoint in postgis 1.3.1 for windows
- [postgis-users] Problem with st_endpoint in postgis 1.3.1 for windows(返信)
- /trunk/lwgeom/lwgeom_ogc.cC で書かれた ST_EndPoint 関数(LWGEOM_endpoint_linestring 関数)
2007-12-12 追記
2007年12月1日にリリースされた PostGIS 1.3.2 では、この問題は解決しています。
DATE : 2007/08/24 (Fri)
MULTILINE や MULTILINESTRING など、複数の幾何(geometry)オブジェクトが含まれるオブジェクト(GEOMETRYCOLLECTION)から各幾何オブジェクトを取り出すには、ST_Dump 関数を使用します。
GEOMETRYCOLLECTION からは、そこに含まれる幾何オブジェクトが1つずつ返され、GEOMETRYCOLLECTION 以外(POINT、LINESTRING など)からはそのオブジェクトがそのまま返されます。
ST_Dump 関数から返されるのは、geometry_dump 型のデータで、これは GEOMETRYCOLLECTION 内のインデックス(path、整数配列型)と幾何オブジェクト(geom、geometry 型)でできた複合型です。GEOMETRYCOLLECTION 以外の場合は、path は空の配列になります。
複合型なので、幾何オブジェクトのみを取り出すには、次のように列を指定します。
( <geometry_dump 型を返す列> ).geom
なお、次のような表記もできるようです。
geom( <geometry_dump 型を返す列> )
road テーブル内の MULTILINESTRING を LINESTRING に分解して取り出す SQL は次の通りです。geometry 型のデータは、the_geom 列に格納されているとします。
SELECT ( ST_Dump( the_geom ) ).geom FROM road
なお、PostGIS 1.3 未満では、ST_Dump 関数ではなく、 Dump 関数を使用します。
参考文献
DATE : 2007/06/16 (Sat)
Windows 版 PostgreSQL の場合、データベースファイルを移動した際などは、PostgreSQL サーバのサービスを登録し直す必要があります。本記事では、その際に気をつけることなどをメモしてあります。
なお、本記事の操作を行うには管理者権限が必要となります。
サービスの削除
まず、すでに登録されている PostgreSQL サービスを削除する必要があります。削除するには、次のコマンドを実行します。「<...>」の部分は該当する名前などに置き換えてください。
pg_ctl unregister -N <削除するシステムサービス名>
「システムサービス名」とは、サービスの一覧に表示されている名前です。
なお、サービスの稼動中にこのコマンドを実行した場合、サービスが停止するまで一覧から削除されません。
サービスの登録
サービスを登録するには、次のコマンドを実行します。ここでは、データベースファイルを移動した状況を仮定しています。以下のコマンドは、実際には1行です。
pg_ctl register -N <登録するシステムサービス名> -U <サーバを起動するアカウント名> -P <サーバを起動するアカウントのパスワード> -D <データベースファイルへのパス>
PostgreSQL では、セキュリティ上の観点から、PostgreSQL サーバは PostgreSQL 専用のアカウントでの実行を推奨しています。そのため、サーバを起動するためのアカウントをここで指定します。
しかし、ここでアカウントを指定してしまうと、入力時にアカウントのパスワードが画面上に表示されてしまいます。また、オプションを間違えて指定した場合、パスワードなどがサービスのプロパティから丸見えになってしまいます。PostgreSQL 専用のアカウントでなくてもサーバは起動できるため、なかなか気付けません。それが嫌な場合は、この時点ではアカウントを指定せず、あとでサービスの一覧からアカウントを指定するようにします。
サービスの起動
あとは、PostgreSQL サービスを起動するだけです。登録を終えた直後であれば、以下のように、コマンドプロンプトから起動しても良いかもしれません。
net start <PostgreSQL のシステムサービス名>
参考文献
DATE : 2006/11/13 (Mon)
PostgreSQL ではセキュリティ上の観点から、PostgreSQLサーバアプリケーションを管理者アカウントから実行できないようになっています。サーバアプリケーションの中にはデータベースクラスタを初期化する initdb が含まれており、初期化するには非管理者アカウントが必要になります。
しかし、Windows 版 PostgreSQL のインストーラはインストール時に PostgreSQL 用のアカウントを作っています。ログオン画面には表示されませんが、コマンドプロンプトから次のコマンドを入力すると、確かに作られていることが分かります。(「>」はプロンプトを表します)
> NET USER
すると、このアカウントで initdb を実行すればデータベースクラスタを初期化できそうです。
インストール時に作成したアカウント(ここでは「postgres」という名前とします)で initdb を実行するには、方法が2通りあります。
- コマンドプロンプトのショートカットを右クリック→「別ユーザとして実行(A)...」で postgres としてのコマンドプロンプトを開く
- コマンドプロンプトで、次のように RUNAS コマンドを実行して postgres としてのコマンドプロンプトを開く(直接 initdb を実行することもできます)
> RUNAS /user:postgres cmd
ただし、上のように開いたコマンドプロンプトでは、PostgreSQL へのパスは通っていません。そのため、まずパスを設定するか、PostgreSQL の bin フォルダをカレントフォルダにしなければなりません。
以上で別アカウントで initdb を使用できるようになりました。
なお、データベースクラスタを構築するフォルダがすでにある場合はあらかじめ消しておき、initdb に作らせるようにします。そうしないと、フォルダに権限がないという理由で initdb の実行が失敗してしまいます。
参考文献
関連記事
(;^ω^)この記事の中でも似たようなことを書いているのですが、PostgreSQL をインストールするたびにこの部分でハマってしまうので、あえて再び取り上げました
DATE : 2006/08/15 (Tue)
GIS 分野に手を出すことになりそうなので、PostgreSQL で地理情報を扱うためのモジュール、PostGIS をインストールしてみました。
ここでは、Windows XP 版でのインストール方法、PostGIS そのもののインストールから、データベース上で PostGIS を扱えるようになるまでをメモします。
インストール方法
PostGIS をインストールするには、以下の方法があります。
- PostgreSQL インストーラから
PostgreSQL のインストーラから、PostGIS モジュールの追加を選択できます。Windows 版では MSI 形式のインストーラが提供されているので、PostgreSQL のインストール後でも追加できます。
ただし、PostgreSQL インストーラには古いバージョンの PostGIS が付属しています(例えば、現在の PostGIS の最新バージョンは1.1.3ですが、PostgreSQL 8.4 に付属する PostGIS は1.0.5です)。
- PostGIS インストーラから
- PostGIS の公式サイトには、最新版の PostGIS インストーラが配布されています。このインストーラからインストールする場合、PostgreSQL 付属の PostGIS は未インストール状態か、もしくはアンインストールしておかなければなりません。
ただ、参考文献によると、Windows XP SP2 上の PostgreSQL 8.1.4 と PostGIS 1.1.3 はインストール中にエラーが発生するなど、相性が良くないそうです。
データベースで地理情報を扱えるようにする
まず、PL/pgSQL 言語をデータベースで扱えるようにします。(「>」はプロンプトです)
> createlang plpgsql <データベース名>
なお、すでにインストールされている場合もあります。
次に、PostGIS オブジェクトや関数をデータベースにインストールします。具体的には、インストールしたいデータベースに対して lwpostgis.sql を実行します。
> psql -f lwpostgis.sql -d <データベース名>
lwpostgis.sql などのファイルは、「<PostgreSQL のホームディレクトリ>\share\contrib」にあります。
実行後、最後にコミットされればインストール成功です。ロールバックされた場合は、インストールが失敗しています。
ちなみに、文字エンコーディングの問題でインストールが失敗した場合は、データベースにログインした後、psql で扱う文字エンコーディングを変更して実行します(psql のコマンドラインオプションで設定する方法もあります)。(「#」は、psql のプロンプトです)
# \encoding SQL_ASCII
# \i lwpostgis.sql
最後に、座標系が定義されたデータを登録します。
> psql -f spatial_ref_sys.sql -d <データベース名>
これも実行後、最後にコミットされればインストール成功です。
これまでの作業が終われば、データベース上で地理情報を扱う準備は終わりです。