PostGIS-2(応用編)

PostGIS-2(応用編)
PostGIS-2(応用編)
• PostGISによる空間情報の検索 (SQL応用編)
• PostGISによるジオメトリー操作 (いくつかの基本的な
コマンド紹介。intersection, buffer, など実習で使うコマ
ンド)
• PostGIS+α (PostGISとそのほかのオープンソース
ツールについて。R、python, Google Earth,
Geoserver.....)
• 実習
– 2つテーブル間のクエリー
– ジオメトリーの加工
PostGISによる空間情報の検索
• 空間情報のクエリーには、SQL文をベースに
ジオメトリーとPostGISのさまざまな機能を使う。
• 空間クエリーとは、空間に関した情報の検索
で例えば、
– 宮城県にある温泉地が何点あるか調べたい。
– 県境はポリゴン、温泉は点
– 各テーブルは以下のようなフォーマット
県テーブル
温泉テーブル
ID
県名
the_geom
ID
温泉名
the_geom
1
宮城
*******
1
鳴子
*******
2
岩手
*******
2
蔵王
*******
3
秋田
*******
3
蟹場
*******
PostGISによる空間情報の検索
SELECT
FROM
WHERE
AND
COUNT(温泉.ID)
温泉, 県
ST_INTERSECTS (県.the_geom, 温泉.the_geom)
県.県名 = ’宮城’;
県テーブル
ID
県名
the_geom
1
宮城
*******
2
岩手
*******
3
秋田
*******
温泉テーブル
ID
温泉名
the_geom
1
鳴子
*******
2
蔵王
*******
3
蟹場
*******
=2
PostGISによる空間情報の検索
• 河川から200m以内にある落葉樹の本数を
数える
河川テーブル
ID
県名
the_geom
1
広瀬川
*******
2
名取川
*******
3
北上川
*******
樹木テーブル
ID
県名
the_geom
1
落葉
*******
2
常緑
*******
3
落葉
*******
PostGISによる空間情報の検索
SELECT
FROM
WHERE
AND
AND
COUNT(樹木.ID)
河川, 樹木
ST_DWithin (河川.the_geom, 樹木.the_geom, 200)
樹木.樹種 = ’落葉’
河川.河川名 = ‘広瀬川’;
河川テーブル
ID
河川名
the_geom
1
広瀬川
*******
2
名取川
*******
3
北上川
*******
樹木テーブル
ID
樹種
the_geom
1
落葉
*******
2
常緑
*******
3
落葉
*******
=5
空間インデックス
• 空間インデックスとは、ジオメトリーにつけられるインデックスで、
空間情報の検索を著しく早くすることができる。
• PostGISでは、ジオメトリーがバウンディングボックス(BBox)という
箱で各ジオメトリーを囲み、その箱同士の関係でインデックスを作
る
• 複雑なジオメトリーでも、箱にすれば2つの点で表せる
• PostGISの情報検索は実は2段階で行われる
– バウンディングボックスによる検索
– 実際のジオメトリー情報による検索
• インデックスは入れ子になった箱同士の関係を整理したもので、
目的の情報にすばやくアクセスすることを可能にする
空間インデックス
ネズミA
ネズミB
http://workshops.opengeo.org/stack-intro/postgis.html より引用
o例えば、ネズミAとネズミBの行動
圏の重複を調べるとする。
oネズミAの行動圏のBBOXはR8で
表され、ネズミBはR19で表される
oこの場合、実際のネズミAの行
動圏のポリゴンは500点から、ネ
ズミBは300点から構成されている
とする。
oAとBの行動圏が重複しないのは
明らかだが、もし空間インデックス
を使わないならば、ネズミBの300
点がネズミAの500点から構成さ
れるポリゴン内に落ちていないこ
とを調べる必要がある。
o空間インデックスを使えば、それ
ぞれの上位インデックスのR3とR7
が交差していないことから、これら
の行動圏が重複していないことが
インデックスの検索だけでわかる。
空間インデックスの作成
CREATE INDEX [インデックス名]
ON
[テーブル名]
USING GIST ( [ジオメトリー列名] );
Vacuum Analyze [テーブル名];
• インデックス名は自分でつける(何でもよい)
• Vaccum Analyzeは、インデックスを実際にクエ
リーで使えるようにするために必須
PostGISによるジオメトリー操作
• ジオメトリー操作とは、ジオメトリーに手を加え
ること。例えば、
– 二つのポリゴンの交わる面を取り出す
– 複雑なポリゴンを単純化する
– 線にバッファーを発生させる
• PostGISにはさまざまなジオメトリー操作のた
めの機能がそろっている
PostGISによるジオメトリー操作
• 機能の一例
– ST_Buffer
• バッファーのジオメトリーを返す
– ST_ConvexHull
• 最小凸型多角形のジオメトリーを返す
– ST_Difference
• ジオメトリーAのうち、ジオメトリーBと交わらない部分のジオメトリーを
返す
– ST_Intersection
• ジオメトリーAとBが共有する部分のジオメトリーを返す
– ST_Simplify
• Douglas-Peuker アルゴリズムを使ってジオメトリーを単純化する
– ST_Union
• ジオメトリーを結合した結果出来上がる点集合のジオメトリーを返す
PostGISによるジオメトリー操作
• 仙台市内の国道48号線の総延長を計算する
市町村テーブル
ID
市町村名
the_geom
1
仙台市
*******
2
名取市
*******
3
岩沼市
*******
国道テーブル
ID
国道番号
the_geom
1
4
*******
2
48
*******
3
6
*******
PostGISによるジオメトリー操作
SELECT
FROM
WHERE
AND
ST_INTERSECTION(市町村.the_geom, 国道.the_geom)
市町村, 国道
市町村.市町村名 = ’仙台市’
国道.国道番号 = 4;
市町村テーブル
ID
市町村名
the_geom
1
仙台市
*******
2
名取市
*******
3
岩沼市
*******
国道テーブル
ID
国道番号
the_geom
1
4
*******
2
48
*******
3
6
*******
=
質問をよく考える
河川テーブル
ID
河川名
the_geom
1
広瀬川
*******
2
名取川
*******
3
北上川
*******
樹木テーブル
ID
樹種
the_geom
1
落葉
*******
2
常緑
*******
3
落葉
*******
=5
市町村テーブル
ID
市町村名
the_geom
1
仙台市
*******
2
名取市
*******
3
岩沼市
*******
国道テーブル
ID
国道番号
the_geom
1
4
*******
2
48
*******
3
6
*******
=
そのほかのPostGIS機能
•
管理機能 (16)
–
•
ジオメトリー作成 (28)
–
•
バッファーを発生させる: ST_Buffer()
リニアリファレンシング (6)
–
•
•
•
ポリゴンの面積を返す: ST_Area()
ジオメトリー操作 (18)
–
•
バウンディングボックスの重なりを調べる: &&
空間関係と計測 (33)
–
•
ジオメトリーをテキスト表示で返す: ST_AsEWKT()
バウンディングボックスの位置関係を調べる (13 オペレーター)
–
•
ジオメトリーの投影系・座標系を変換する: ST_Transform()
ジオメトリー出力 (10)
–
•
ジオメトリータイプを調べる: ST_GeometryType()
ジオメトリー編集 (25)
–
•
テキストからジオメトリーを作成: ST_GeometryFromText()
ジオメトリー情報の取り出し (32)
–
•
ジオメトリー列の追加: ST_AddGeometryColumn()
線上に落ちる点を発生させる: ST_Line_Interpolate_Point()
長いトランザクションのサポート(6)
上で分類しにくい機能 (16)
そのほかの機能 (3)
PostGIS+α
• ウェブマッピング
– PostGIS + MapServer、GeoServer、Mapnik、、、
• フィールドナビゲーション
– PostGIS + WMS Server + GoogleEarth
• 数値解析
– PostGIS + R
• プログラミング
– PostGIS + Python
PostGIS + R
• オープンソース統計パッケージRとPostGISを
組み合わせて使う
• 実際には、PostgreSQLとのデーターのやり取
りを可能にする環境を作る
• データベースでは不可能な複雑なデータ解析
ができる
• 直接接続することで、一時的なファイルなど
が発生しない
PostGIS + R
• まずは、PostgreSQLとRが話せるようにする
– ウィンドウズのコントロールパネルから管理ツールを選択して
開く
– データソース(ODBC)を開く
– ユーザーDNSのタブで新しい接続を加える
• PostgreSQLドライバーがインストールされていない場合は
http://www.postgresql.org/ftp/odbc/versions/msi/ からドライバーを
ダウンロードする
• データベースへの接続情報を入れる
• Rを起動し、RODBCパッケージをインストールする
• RODBCのコマンドを使ってPostgreSQLデータベースから
データを取り込んだり、数値処理の結果をデータベースに
戻したりする。
• 詳しくは、私のホームページで見てください。
PostGIS + R
• デモ
デモ:PostGIS + GeoServer + GE