ポリゴン内にある点を抽出するには
以下では、
テスト用毎木調査データを作るには で作成したデータから適当に囲んだポリゴン内にある樹木を抽出する例を示します。
上記の図のデータがあり、樹木テーブルが「trees」、ポリゴンが「polygs」テーブルのgid=1のデータだったとして、
抽出するクエリは以下のようになります。
# select * from trees where ST_Within( the_geom, ( select the_geom from polygs where gid = 1) );
抽出結果
テーブル内のある点が所属する図郭を検索する
POINTのテーブルと図郭のテーブルがあって、POINTテーブルの指定した点が所属する図郭を検索したい場合などでは
以下のようにすると良いでしょう。
# select name from zukaku where ST_WITHIN( ( select the_geom from points where gid = id ), zukaku.the_geom );
ST_Within
以外にも図形演算用関数がいろいろとありますが、たぶん同じような要領で出来ると思います。
複数の連結している連続線分ををLINESTRINGにするには
始終点が一致している一連の連続線分を連結させてLINESTRING
にするには
ST_LineMergeを使用します。
ただし、この関数の引数はMULTILINESTRING
型なので、まず一連の連続線分をMULTILINESTRING
型に合成する必要があります。
MULTILINESTRING
型は連続線分の集合です。各連続線分に同じ属性を持たせたい場合に使うんだろうと思われます。
結果として、以下の様なSQLを実行します。
# select ST_LineMerge(ST_Multi(ST_Union(the_geom))) as new_geom from lines 何か条件;
条件節にはGROUP BY
とかを指定するといいでしょう。
指定した連続線分が繋がっていない場合は、繋げられるところをつなげてMULTILINESTRING
型を返すようです。
この場合はMULTILINESTRING
型の各端点を調べて編集しましょう。
参考サイト
MULTILINESTRINGを分解するには
MULTILINESTRING
型を分解して個別のLINESTRING
型にする場合は以下のようにします。
# select (ST_Dump(the_geom)).geom as new_geom from multilines;
‘( )’に注意してください。
ST_DumpはSETを返すそうです。
.path
とすると、分解した各要素の番号を参照します。
参考サイト
要素の長さを測るには
長さを測る関数はST_Length()
関数を利用します。引数には長さを測りたいGeometry型を指定します。
経緯度座標で展開されているデータの場合は一度投影変換してから測る必要があります。
# select ST_Length(ST_Transform(geom, 3100)) ...;
ST_Tranform
の第2引数は投影変換先のSRID番号を指定します。
球面距離で計算したい場合は直接的な方法はなさそうですが、以下のURLにGEOGRAPHY型の説明があります。
参考サイト
球面距離を求めるには
2点間の楕円体上に置ける距離や球面距離を求める場合、ポイントをgeography型にしてst_distanceでいいらしいです。以下の例はWeb Tile Mercator座標系上にある図郭の横、縦の距離を求めるものです。
select st_distance(TL, TR) as BWIDTH, st_distance(TL, BL) as BHEIGHT from ( select st_transform('SRID=3857;POINT(左上X座標 左上Y座標)'::geometry, 4326)::geography as TL, st_transform('SRID=3857;POINT(右上X座標 右上Y座標)'::geometry, 4326)::geography as TR, st_transform('SRID=3857;POINT(左下X座標 左下Y座標)'::geometry, 4326)::geography as BL ) as hoge;
上記の場合は楕円体距離が求まります。球面距離にする場合はst_distance()
の第3引数にfalse
を指定します。
厳密には図郭の上辺と下辺で球面距離は変わるので注意してください。