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
© Copyright 2025 ExpyDoc