[Bubble://ちずろぐ/別館/]

別館 ではGISに関する情報を掲載しています。

[Bubble://ちずろぐ/別館/KaMap/]

MapserverのAJAX版UI,ka-Mapのデモです。

[Bubble://旧日記/]

旧本館。更新していません。

カテゴリー「PostGIS」の記事

2008年11月13日 (木)

PostgreSQL8.3を使っている人は

リンク: Paul Ramsey: PostgreSQL 8.3.5 - Important Upgrade.

リンク: PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: Release 8.3.5.

 PostgreSQL8.3を使っている人は8.3.5へアップグレードした方がよいようです。
 GiSTインデックスの処理にバグがあり,データを削除したときに関係のないデータを"dead"にしてしまい,検索に引っかからなくなる可能性があるとのこと。関係のないデータが削除されてしまうことはないようです。
 PostGISはGiSTインデックスを使用するので,重要な更新になりそうです。

| | コメント (0) | トラックバック (0)

2008年6月 4日 (水)

PostGISでヘキサゴナル・グリッド生成

リンク: [postgis-users] hexagonal grid.

 PostGISでヘキサゴナル・グリッドを生成する例。メーリングリストに挙がっていたのが上のリンクのやり方です。コピペで試してみるとすんなり作成されます。

Qgisss001

何に使うの?...と聞かれても特に使い道は無いのですが,少し感動したのでここにメモ。

| | コメント (2) | トラックバック (0)

2008年4月28日 (月)

PostGISでGeoJson

リンク: [postgis-users] GeoJson export function.

 PostGISでGeoJson出力ができるパッチがメーリングリストに投稿されているので試してみました。

 上記リンクの内容では最新のSVN用のようですが,PostgreSQL(8.3.1)+PostGIS(1.3.3)のソースでも特に問題はなさそう。PostGISをconifgureする前に,ソースを展開したディレクトリ(POSTGRES_SRC/contrib/postgis-1.3.3/)でパッチをあて,あとは通常通りconfigure, make, make installするだけです。

SELECT ST_AsGeoJson(ST_GeomFromText('POINT(123.4 234.5)'));

とすると

{"type":"Point","coordinates":[123.400000000000006,234.500000000000000]} 

と出力されます。

パッチを当てた後のlwpostgis.sql(4390行目付近)では

CREATE OR REPLACE FUNCTION ST_AsGeoJson(geometry)
        RETURNS TEXT
        AS 'SELECT _ST_AsGeoJson(1, $1, 15, 0)'
        LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);

となっていて,小数以下はデフォルトで15桁になります。

 以下lwpostgis.sqlで定義されている関数と引数のデフォルト値です。

_ST_AsGeoJson(version, geom, precision, options)
ST_AsGeoJson(geom, precision) 
        version=1
        options=0
ST_AsGeoJson(geom)
        precision=15
        version=1
        options=0
ST_AsGeoJson(version, geom)
        precision=15
        options=0
ST_AsGeoJson(version, geom, precision)
        options=0
ST_AsGeoJson(geom, precision, options)
        version=1
ST_AsGeoJson(version, geom, precision,options)
        _ST_AsGeoJsonと同じ

| | コメント (0) | トラックバック (0)

2007年5月30日 (水)

AsUKML()とAsKML()

 別館のPostGISの項目を整理しつつlwpostgis.sqlを見ていて気付いたのですが,AsUKML()という関数があります。確認したバージョンはPostGIS-1.2.1。

 定義は

CREATE OR REPLACE FUNCTION AsUKML(geometry, int4, int4)
    RETURNS TEXT
    AS '$libdir/liblwgeom.so.1.2','LWGEOM_asKML'
    LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
...

となっていて,これが自分の理解して(思い込んで)いたAsKML()の定義。

 AsKML()の定義はどうなっているかというと

-- AsKML(geom, precision, version)
CREATE OR REPLACE FUNCTION AsKML(geometry, int4, int4)
    RETURNS TEXT
    AS 'SELECT AsUKML(transform($1,4326),$2,$3)'
    LANGUAGE 'SQL' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
...

となっていて,AsUKML()関数の第一引数にtransform($1,4326)を渡しており,WGS84(SRID=4326)へのtransform()を内部で行うようになっています。
 処理する元データがWGS84決めうちであれば,AsUKML()を使う方がよいのかもしれません。


 もうひとつ。上の定義には引数が三つありますが,最後の引数にはKMLのバージョンを渡せるようになっています。省略した場合には

...
-- AsUKML(geom, precision) / version=2
CREATE OR REPLACE FUNCTION AsUKML(geometry, int4)
    RETURNS TEXT
    AS '$libdir/liblwgeom.so.1.2','LWGEOM_asKML'
    LANGUAGE 'C' IMMUTABLE STRICT; -- WITH (isstrict,iscachable);
...

となっていてversion 2がデフォルト。型がintなので2.1は渡せませんし,ソースコード(lwgeom_kml.c)のLWGEOM_asKML()関数を見ると

    if ( version != 2 )
    {
        elog(ERROR, "Only KML 2 is supported");
        PG_RETURN_NULL();
    }

となっていて現状では特に意味はもちませんが,今後のKMLのバージョンアップ(3以降)を想定する場合には考慮しておくのも良いかもしれません。

 とりあえず別館のページも以上の内容を加筆しておきました。


| | コメント (0) | トラックバック (0)

2007年5月18日 (金)

別館のPostGISの項目を久しぶりに更新

Line_substring

リンク: Bubble://ちずろぐ/別館/ - B-Wiki - PostGIS.

 とある道路関係のWebGISの機能拡張に関係して,PostGISのLRS(Linear Reference System)関連を調べていたり,以前のエントリにコメントをつけたりしつつ気になったのが,別館のPostGISに関する項目が完全に放置状態なこと。

 本館・別館のネタではラスタ処理中心でka-MapやGRASSを主に触っていて,仕事でPostGISを使う場合でも,データがシンプルなもの(とはいって点数は億近いレーザープロファイラデータだったりしますが)ばかりだったので,突っ込んでPostGISをいじり倒すことから遠ざかっていたのですが,ちょうど良い機会ということで,久しぶりに以下のPostGIS関数を追加しました。

  • line_interpolate_point()
  • line_substring()
  • line_locate_point()

 全てLRSがらみの関数です。分かり易い文章を書くスキルが無いので図で誤魔化してはいますが...。

 元々"PostGIS関数リファレンス"という大層なタイトルをつけていたのですが,どう考えても本家のマニュアルには追いつけないので"PostGIS関数サンプル集"と名前も変えて再スタートになります。

 "GRASSリファレンスマニュアル"もタイトルが変わりそうな予感がします...。

| | コメント (0) | トラックバック (1)

2007年5月16日 (水)

PostGISのasKML()とka-MapとGoogleEarthと...

Onlinesoilsurvey001_1

リンク: [postgis-users] Fun uses for the asKML() function in PostGIS !!.

 PostGIS公式サイトの"Case Studies"にある"UC Davis Soil Resource Laboratory"の,PostGISのasKML()を使用したka-MapとGoogleEarthの連動機能について紹介する内容。

 実際のka-Mapのサイトはこちら。ページ最下部の"Give it a try!"から入れます。以下操作の概要を紹介。

 ↑の画像のページで表示する位置を選択し1:35,000以上のスケールにすると,ka-MapのツールバーにあるGoogleEarthのアイコンがクリックできるようになります。

Onlinesoilsurvey002

 GoogleEarthアイコンをクリックすると,ka-Map上で表示されている位置のkmlデータをダウンロードし,GoogleEarth上に表示。

Onlinesoilsurvey003

 GoolgeEarth上のPOINTをクリックすると,地質と勾配の概要が吹き出しで表示されます。

Onlinesoilsurvey004

 吹き出上のリンクをクリックすると,ブラウザに"Map Unit"の情報が表示されます。

Onlinesoilsurvey005

 "Map Unit"とは何かという説明はここにあります。難しそうなので読んでませんが...。

 地質関係でいつも思うのが,GoogleEarthの地表面の透明度を変更できるようにしてほしいということ。

 前にも書いたかもしれませんが,数年前に仕事で三次元GISアプリケーション上に柱状図(簡易的な棒グラフ状の3Dモデル)や地質の想定断面,河川断面等を取り込み,地表の半透明化機能を使って表示させるということをやったのですが,データの蓄積が進むと面的(というか三次元的な)構成が分かり易くなりそうです。高さ方向のスケール拡大機能を併用しないと変化が乏しくて見にくいですが...。 究極はこれですかね(そろそろ削除されるようですが)。

| | コメント (0) | トラックバック (0)

2007年4月26日 (木)

PostGIS 2.0 Wishlist

リンク: PostGIS 2.0 Wishlist.

 PostGISメーリングリストで少し盛り上がっている。かいつまんでみると

  • SQL/MM
  • We would like to use SQL/MM as our new design road map. Previously we used OGC Simple Features for SQL, but...省略

    • The nice thing about SQL/MM is that it is fairly complete...
    • it uses the idea of methods on geometry objects, not functions that take geometries...
  • CURVES
    • The current geometry implementation only supports a finite number of nesting levels...
    • The geometry implementation needs an update to support arbitrary nesting, and that means lots of care will be required...

  • LINEAR REFERENCING
    • ST_IsMeasured(geometry)
    • ST_LocateAlong(reference geometry, measure float)
    • SP_LocateAlong(reference geometry, measure-offset point)
    • SP_MeasureAlong(reference, spatial-point point)
    • ST_LocateBetween(reference geometry, start float, end float)

  • FUNCTION NAMES AND PREFIXES
    • ST_ for SQL/MM
    • SE_ for ESRI
    • SP_ for PostGIS

  • GEODETIC MAGIC
  • Perhaps the most common question on the user mailing list is "Why is distance(A,B) returning 2.34? I know A and B are 874 kilometers apart!"...中略...Far better, to just return the right answer, a metric (or imperial) distance.

  • GEOMETRY MATCHING FUNCTIONS
    • SP_Hausdorf(g1 geometry, g2 geometry)
    • SP_AverageDistance(g1 geometry, g2 geometry, nsamples integer)
    • SP_MaxDistance(g1 geometry, g2 geometry)

  • SPLITTING FUNCTIONS
    • SP_SplitGeometry(polygon, line)
    • SP_SplitGeometry(lineA, lineB)
    • SP_SplitGeometry(line, point)

  • GEOCODING
  • ROUTING/NETWORKS
  • SFSQL2 COMPLIANCE
  • TOPOLOGY
    • Complete topology building (JTS coverage first?) and
    • then output functions.

  • GEOMETRY_COLUMNS
  • It would be nice to have GEOMETRY_COLUMNS as a view, or an automatically updated table.

    • Problems with a view: querying a view will have a higher overhead than querying a data table. For applications like Mapserver that query the view for every map rendering, this will not be an acceptable change.
    • Problems with an automatically updated table: it is just not possible right now. When PostgreSQL supports triggers on system tables, it is trivial to implement.
    • Possible stopgap: let another management function for geometry_columns that automatically fills it in based on current database state. If the function is sufficiently lightweight, and written in C, we could even run it automatically as part of the ANALYZE process.

  • NEAREST NEIGHBOR
  • EXTENT
  • PRECISION MODEL
  • UTILITY FUNCTIONS
  • BLUE SKY
  • DOCUMENTATION

| | コメント (0) | トラックバック (0)

2007年1月13日 (土)

PostGISで述部のthe_geomにTransform()をかけると...

 皆さんご存知の話なのかもしれませんが...。
 何の気なしにPostGISのクエリで,述部のgeometry columnsにTransform()をかけて,EXPLAINを実行してみました。

 使用したテーブルの概要は

  • 約89,000,000点の3次元POINT
  • the_geom列以外にint型の列が一つあるのみ
  • SRID=4612(JGD2000 緯度経度)
  • the_geomに対しGiSTインデックスを作成

という感じ。

 このテーブルに対してTransform()無しで普通に約50m×50の矩形範囲に含まれる点を取り出すクエリプランを見てみると...


-- SQL文
EXPLAIN SELECT the_geom
          FROM geo_table
         WHERE the_geom &&
               SetSRID('BOX3D(...,...)'::box3d, 4612);
-- クエリプラン
 Index Scan using geo_table_sidx on geo_table (cost=0.00..30.83 rows=1 width=33)
   Index Cond: (the_geom && '...'::geometry)
   Filter: (the_geom && '...'::geometry)

という感じで,まぁ普通です。
 で,WHERE the_geom の部分をあえてWHERE Transform(the_geom, 4612)にかえてみると, クエリプランがシーケンシャルに変わり,ものすごいコストをはじき出します。


-- SQL文
EXPLAIN SELECT the_geom
          FROM geo_table
         WHERE Transform(the_geom, 4612) &&
               SetSRID('BOX3D(...,...)'::box3d, 4612);
-- クエリプラン
Seq Scan on geo_table (cost=0.00..2025529.48 rows=425 width=33)
   Filter: (transform(the_geom, 4612) && '...'::geometry)

 元々POINTはSRID=4612なので,わざわざTransform()する必要は無いわけですが,仮にSRID=2444等の公共座標で 入っていて,かつ結果をSRID=4612で取り出したい場合には,POINTをBOX3DのSRIDに合わせるために安易にthe_geom側に Transform()をかけると,GiSTインデックスは使用されないということですかね...。
 GiSTは元々の座標系(この例では2444)で作成されてはずなので,極自然な結果ではあるわけですが。

 取り込まれているデータの座標系と,取り出したい座標系が異なる場合は,BOX3Dをthe_geomに合わせ,取得結果にTransform()をかける)という方法が最適な方法なのでしょうね。


-- こんな感じ?
-- BOX3DをはじめからSRID=2444にしても良いわけですが...
SELECT Transform(the_geom, 4612)
    FROM geo_table WHERE the_geom &&
      Transform(SetSRID('BOX3D(...,...)'::box3d, 4612), 2444);

少なくともクエリプランナはそこまで気を利かせることはしないようです。
 まぁ実行した環境の実メモリ量(PostgreSQLの共有メモリ量)等でもプランが変わりそうなので一概には言えないのでしょうけど。

| | コメント (0) | トラックバック (1)

AsKML()試してみました。

試しただけですが。

-- 点データをKMLで出力する例
--
select AsKML(the_geom, 4) from points limit 3;

                            kml
------------------------------------------------------------
<Point><coordinates>130.5,33.24,4.19</coordinates></Point>
<Point><coordinates>130.5,33.24,3.71</coordinates></Point>
<Point><coordinates>130.5,33.24,4.61</coordinates></Point>
(3 rows)

| | コメント (7) | トラックバック (1)

2007年1月12日 (金)

PostGIS1.2.1でました

 AsKML()から始まったPostGIS1.2.1の話。結局今日PostGIS1.2.1のリリースがアナウンスされました。

Bringing all the bug fixes of the last month to you, is the 1.2.1
release!
   <http://postgis.refractions.net/download>
The 1.2.1 release of PostGIS is now available. This is a minor bug
fix release.

* Fix for bug in Within() caused by point-in-polygon performance
shortcut.
* Fix for bug in indexes with null on PostgreSQL 8.2.
* Fix for JTS handling of multi-dimensional data.
* Fix for GCJ Java support.
* Fix for JDBC compatibility in PostgreSQL 8.2.
* New AsKML() function.
* Better Transform() performance when no transform is actually required!

AsKML and Transform courtesy of Eduin Carrillo.  JDBC work courtesy
of Markus Schaber, per usual, with an assist from Thomas Marti.  Mark
Cave-Ayland tracked down the 8.2 null problem.   Mark Leslie cleaned
up the p-i-p problem in within().

 ということで,メインはバグフィックスですが,AsKML()の追加とTransform()の改善がされているようです。

| | コメント (3) | トラックバック (0)

2007年1月 9日 (火)

PostGIS1.2.0でAsKML()から話が流れて...

 昨日PostGIS1.2.0のマニュアルにAsKML()がのっているのだが...という話を書いたのだが...。
 その後スレッドは別の方向に流れて,Javaで作った「SimpleKMLExporter」があるよ,という話に。これ,WKTをKMLに変換するというもの。

Have a look at
http://www.zubi.li/wiki/doku.php?id=prog:java 
(text german)I written a SimpleKMLExporter
in Java that generate a KML file from a
WKT string.
The javadoc is unfortunately written
in my bad english.
;-)

 ソースファイルのサイトはここ。ドイツ語ですか...。

Thanks, Thomas. I'll have a look.
Luckily,I can understand your bad
German as well  ;-)

彼らの漫才はとりあえずほっといて,このソースで使われている以下のクラス

  • WGS84Coordinate
  • WGS84CoordinateSequence
  • InvalidPositionException
  • CH1903Converter

は,ここから入手可能。

 Javaは何年も触ったことがないし,コンパイルして試す気も無いし,と思いつつソースをざっと読んでみたのだが内部でWGS84へ座標変換しているCH1903Converterクラスって,スイス連邦国土地理局の測地系(CH1903)ですか...。スイスと縁のない私には使えませんね。

| | コメント (0) | トラックバック (0)

2007年1月 8日 (月)

PostGIS1.2.0でAsKML()

 さっきメーリングリストに以下のような投稿が...

I just saw that an asKML() function was added to the on-line postgis
manual (1.2.0).
In the release notes, there is no trace to when this was added.
Apparently not in 1.1.5. Does it require an upgrade to 1.2.0 (preferably
soft, but how?).

 で調べてみたのだが,確かにVer1.2.0のマニュアルにはAsKML(geometry, [precision])の記述が載っているが,psqlインターフェース上で試してみてもそんな関数は無いと怒られる。
 ついでに nm liblwgeom.so.1.2 してもシンボル名は無し。ソースやlwpostgis.sqlをgrepしても見つからず。1.2.1で追加されるのかな?

-- 追記 --

 念のため,普段購読していないpostgis-develの12月のアーカイブを覗いてみると,色々やり取りが行われていたみたい。ざっと目を通しただけだが...(以下雰囲気だけの超手抜きダイジェスト)

  • Google EarthはWGS84決め打ちなので,変換を内部でやってしまうか,利用者が明示的にAsKML(Transform(the_geom,4326))するのか...
  • Google Earth上での表示方法(extrude, tessellate, altitudeMode)を面倒見る?スタイル情報まで混在するのは...
  • AsGML()と同様に図形情報のみ(just generating the geometric piece)を生成するのが筋でしょ。
  • ...

のような議論があっているようだ。

 とりあえず,開発版のソースには取り込まれてるっぽい。

| | コメント (0) | トラックバック (0)

2006年6月23日 (金)

PGdijkstraの処理速度

PGdijkstraとはPostGISの最短経路探索用pl/sql関数のこと。
dijkstra(ダイクストラ)法とは,最短経路探索の代表的なアルゴリズム。

Chris氏のページにPGdijkstraを使用した処理速度に関するレポートが乗っている。
私がPGdijkstraを知ったのは,同氏のブログの一連の記事から。

最近はなかなかGIS関連に割り振る時間が無いので,少々GIS界隈の進歩に乗り遅れ気味だが,同記事によると

SELECT astext(the_geom) FROM shortest_path_as_geometry(‘roadstable’, startnode, endnode)

といった感じでSQLを発行すると,探索してくれるようだ。

興味のある方は御一読を。

PGdijkstraに関する日本語のページは
http://www.saruga-tondara.net/GIS/?pgdijkstra
(株)オークニーもPostLBSという独自?に開発PGdijkstraをベースとしたPostGIS関連製品を販売している。
http://www.orkney.co.jp/product/postlbs.html

| | コメント (2) | トラックバック (0)

2005年12月 3日 (土)

AWKT?

一つ前のブログも含めて,FDOのコンパイルで気になったのが,AWKTという文字がよく出てくること。

どうもAutoDesk拡張のWKT形式らしい。知らなかった。
grepで色々調べてみると,ソースファイル(テスト用?)内に

GeomFromText('POINT XYZ (10 11 12)')
GeomFromText('POINT XYM (10 11 1.2)')
GeomFromText('POINT XYZM (10 11 12 1.2)')

というような記述がある。

POINTと(座標の並び)の間に,XYZ,XYM,XYZMという記述があるのが拡張だろうか?。これってPostGISのEWKTとも違う。
確かEWKTではPOINTMを導入して構文自体の変更はしていないはず。

オリジナルのWKTにEWKTにAWKTか...ややこしい...。

| | コメント (0) | トラックバック (0)