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 による空間情報の検索 ID 温泉名 the_geom 1 鳴子 ******* 2 蔵王 ******* 3 蟹場 ******* SELECT COUNT( 温泉.ID) FROM 温泉, 県 WHERE ST_INTERSECTS ( 県.the_geom, 温泉.the_geom) AND 県. 県名 = ’ 宮城 ’; 温泉テーブル ID 県名 the_geom 1 宮城 ******* 2 岩手 ******* 3 秋田 ******* 県テーブル = 2
PostGIS による空間情報の検索 河川から200m以内にある落葉樹の本 数を数える ID 県名 the_geom 1 広瀬川 ******* 2 名取川 ******* 3 北上川 ******* 河川テーブル ID 県名 the_geom 1 落葉 ******* 2 常緑 ******* 3 落葉 ******* 樹木テーブル
PostGIS による空間情報の検索 SELECT COUNT( 樹木.ID) FROM 河川, 樹木 WHERE ST_DWithin ( 河川.the_geom, 樹木.the_geom, 200) AND 樹木. 樹種 = ’ 落葉 ’ AND 河川. 河川名 = ‘ 広瀬川 ’; ID 河川名 the_geom 1 広瀬川 ******* 2 名取川 ******* 3 北上川 ******* 河川テーブル ID 樹種 the_geom 1 落葉 ******* 2 常緑 ******* 3 落葉 ******* 樹木テーブル = 5
空間インデックス 空間インデックスとは、ジオメトリーにつけられるインデッ クスで、空間情報の検索を著しく早くすることができる。 PostGIS では、ジオメトリーがバウンディングボックス ( BBox )という箱で各ジオメトリーを囲み、その箱同士の関 係でインデックスを作る 複雑なジオメトリーでも、箱にすれば 2 つの点で表せる PostGIS の情報検索は実は 2 段階で行われる – バウンディングボックスによる検索 – 実際のジオメトリー情報による検索 インデックスは入れ子になった箱同士の関係を整理したもの で、目的の情報にすばやくアクセスすることを可能にする
空間インデックス より引 用 o 例えば、ネズミ A とネズミ B の 行動圏の重複を調べるとする。 o ネズミ A の行動圏の BBOX は R8 で表され、ネズミ B は R19 で表さ れる o この場合、実際のネズミ A の行 動圏のポリゴンは 500 点から、 ネズミ B は 300 点から構成されて いるとする。 o A と B の行動圏が重複しないの は明らかだが、もし空間イン デックスを使わないならば、ネ ズミ B の 300 点がネズミ A の 500 点 から構成されるポリゴン内に落 ちていないことを調べる必要が ある。 o 空間インデックスを使えば、 それぞれの上位インデックスの R3 と R7 が交差していないことか ら、これらの行動圏が重複して いないことがインデックスの検 索だけでわかる。 ネズミ A ネズミ B
空間インデックスの作成 インデックス名は自分でつける(何でも よい) Vaccum Analyze は、インデックスを実際に クエリーで使えるようにするために必須 CREATE INDEX [ インデックス名 ] ON [ テーブル名 ] USING GIST ( [ ジオメトリー列名 ] ); Vacuum Analyze [ テーブル名 ];
PostGIS によるジオメトリー操作 ジオメトリー操作とは、ジオメトリーに 手を加えること。例えば、 – 二つのポリゴンの交わる面を取り出す – 複雑なポリゴンを単純化する – 線にバッファーを発生させる PostGIS にはさまざまなジオメトリー操作 のための機能がそろっている
PostGIS によるジオメトリー操作 機能の一例 – ST_Buffer ST_Buffer バッファーのジオメトリーを返す – ST_ConvexHull ST_ConvexHull 最小凸型多角形のジオメトリーを返す – ST_DifferenceST_Difference ジオメトリー A のうち、ジオメトリー B と交わらない部分のジオ メトリーを返す – ST_IntersectionST_Intersection ジオメトリー A と B が共有する部分のジオメトリーを返す – ST_Simplify ST_Simplify Douglas-Peuker アルゴリズムを使ってジオメトリーを単純化する – ST_Union ST_Union ジオメトリーを結合した結果出来上がる点集合のジオメトリー を返す
PostGIS によるジオメトリー操作 仙台市内の国道 48 号線の総延長を計算す る ID 市町村名 the_geom 1 仙台市 ******* 2 名取市 ******* 3 岩沼市 ******* 市町村テーブル ID 国道番号 the_geom 14******* 248******* 36 国道テーブル
PostGIS によるジオメトリー操作 SELECT ST_INTERSECTION( 市町村.the_geom, 国道.the_geom) FROM 市町村, 国道 WHERE 市町村. 市町村名 = ’ 仙台市 ’ AND 国道. 国道番号 = 4 ; ID 市町村名 the_geom 1 仙台市 ******* 2 名取市 ******* 3 岩沼市 ******* 市町村テーブル ID 国道番号 the_geom 14******* 248******* 36 国道テーブル =
質問をよく考える ID 河川名 the_geom 1 広瀬川 ******* 2 名取川 ******* 3 北上川 ******* 河川テーブル ID 樹種 the_geom 1 落葉 ******* 2 常緑 ******* 3 落葉 ******* 樹木テーブル = 5 ID 市町村名 the_geom 1 仙台市 ******* 2 名取市 ******* 3 岩沼市 ******* 市町村テーブル ID 国道番号 the_geom 14******* 248******* 36 国道テーブル =
そのほかの PostGIS 機能 管理機能 (16) – ジオメトリー列の追加: 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 が話せるようにする – ウィンドウズのコントロールパネルから管理ツールを選択 して開く – データソース( ODBC )を開く – ユーザー DNS のタブで新しい接続を加える PostgreSQL ドライバーがインストールされていない場合は からドライ バーをダウンロードする データベースへの接続情報を入れる R を起動し、 RODBC パッケージをインストールする RODBC のコマンドを使って PostgreSQL データベースか らデータを取り込んだり、数値処理の結果をデータ ベースに戻したりする。 詳しくは、私のホームページで見てください。
PostGIS + R デモ
デモ: PostGIS + GeoServer + GE