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