オープンソースGISを用いた 自然環境解析講座

Slides:



Advertisements
Similar presentations
Plone の使い方. とは 日本におけるオープンソース GIS ( FOSS4G) の活用を促進するための双方向の知識 ベース 最新の GIS および周辺ソフトウェアーの動 向、利用 方法、トラブルシューティング など実践的な情報を集め共有.
Advertisements

PostGIS 、 QGIS 、 OGR. PostGIS 、 QGIS 、 OGR とは PostGIS とは QGIS とは – QGIS の使い方 シェープファイルの見方 WMS データの見方 PostGIS データの見方 GDAL/OGR ( OSGeo4W.exe )とは – メタデータの閲覧.
PostGIS 、 QGIS 、 OGR. PostGIS 、 QGIS 、 OGR とは PostGIS とは QGIS とは – QGIS の使い方 シェープファイルの見方 WMS データの見方 PostGIS データの見方 GDAL/OGR ( OSGeo4W.exe )とは – メタデータの閲覧.
QGISの操作方法について ~「地図で見る統計」を使用しコロプレスマップを描くまで~ 1. 概要です。 1 GIS について GIS というソフトについて説明します。 2 ファイル結合 複数あるファイルの処理のしかたについて説明します。 3 投影変換作業 ファイルを計算できる形に変換する方法を説明します。
基盤地図情報の活用 中村 憲. 基盤地図情報とは 国土地理院が整備 様々な機関が作成した地図データを統一フォー マットでネット上で公開 無料 ( 登録必要 ) OCAD 等で利用するためには形式を変換する必要 あり 公開範囲は順次拡大中 GPS との相性もいい ( リアルワールド座標 )
PostGIS -2(応用編). PostGIS による空間情報の検索 ( SQL 応用編) PostGIS によるジオメトリー操作 (いくつかの基 本的なコマンド紹介。 intersection, buffer, など実習 で使うコマンド) PostGIS + α ( PostGIS とそのほかのオープンソー.
オープンソース GIS 入門コース PostGIS + QGIS で始める空間データ解析 2010 年 3 月 21 日 講師:今木洋大.
Accessによるデータベース(1) Ver.1 /11.
7-1.WEKOコンテンツ 一括登録 マニュアル Version2.5
実習1:コマンドシェルの使い方.
PostGIS-2(応用編).
情報処理実習 第05回 Excelマクロ機能入門 操作マクロ入門.
DB(データベース)のおはなし 作成者:小野正広 DBと言っても、  ドラゴンボール ではないですぞ! 3/1/2017.
SQLite3
情報理工学部 情報システム工学科 ラシキアゼミ 3年 H 井奈波 和也
ブラウザの基本操作 前のページに戻る ブラウザの左上にある 「戻る」ボタンで、自分がたどってきた一つ前のページに戻ることができます。
実習1:QGIS、OGR.
PostGIS - 1 (入門編).
オープンソースGIS入門コース PostGIS+QGISで始める空間データ解析
3-1 MySQLについて 発表者:藤村元彦 自然言語処理研究室.
ファイルやフォルダを検索する ①「スタート」→「検索」→「ファイルとフォルダ」とクリックする。
6-2 データベース 1.SQLite SQLを単純化した SQLite を使ってデータベースを操作 表「fruit」
SQL J2EE I 第3回 /
地理情報システム論 第3回 コンピュータシステムおける データ表現(1)
F5 を押すか、または [スライド ショー] > [最初から] をクリックして、コースを開始してください。
文献管理ソフトRefWorksの利用.
3-2.データを取り出す 2004年 5月20日(木) 01T6074X 茂木啓悟.
実習1:コマンドシェルの使い方.
EBSCOhost 詳細検索 チュートリアル support.ebsco.com.
(B2) 親: minami, kazuki 多様な認証機器に対応する 認証システム (B2) 親: minami, kazuki.
この資料は、テキストをもとに、講義のために作成したものです.学習用に活用してください.
14.テーブル定義,一対多の関係,多対多の関係, 外部キー,索引(インデックス),データベース操作
マイクロソフト Access を使ってみよう 第1回
データベース設計 第9回 Webインタフェースの作成(1)
マイクロソフト Access での SQL 演習 第1回 SQL問い合わせ(クエリ)
マイクロソフト Access を使ってみよう 第4回
実際にたたいてAPI APIの初歩からプログラムまで使用方法のAtoZ.
空間情報サーバ (株)パスコ.
管理画面操作マニュアル <サイト管理(1)> 基本設定 第9版 改訂 株式会社アクア 1.
2004/05/13 3-4 データ型(カラムタイプ) について 発表者:藤村元彦 自然言語処理研究室.
第2回.リレーショナルデータベース入門 SQL を用いたテーブルへの行の挿入 SQL 問い合わせの発行と評価結果の確認.
3-10. MySQLシステムの管理  2004年6月10日  大北高広                01T6010F.
第1回.リレーショナルデータベースを使ってみよう
第1回.リレーショナルデータベースを使ってみよう
第2回.リレーショナルデータベース入門 SQL を用いたテーブルへの行の挿入 SQL 問い合わせの発行と評価結果の確認.
SQL パフォーマンス チューニング ~ プランガイドの利用~
マイクロソフト Access での SQL 演習 第5回 副問い合わせ
3-6.インデックスについて 3-7.関数と併用されることの 多いMySQLコマンド
3-3.テーブルを更新する 2004年 4月22日(木) 01T6074X 茂木啓悟.
マイクロソフト Access での SQL 演習 第4回 並べ替え(ソート)
テーブル設計を後から変更 現場で使える小技のご紹介 株式会社ジーワンシステム 生島 勘富(イクシマ サダヨシ)
スイッチを入れる前に… 講習を受けていない人は、まだスイッチを入れないこと。 まず講習を受けてセットアップを行ってください 注意.
データベース設計 第8回 クライアント=サーバーモデル(2)
コンピュータ プレゼンテーション.
マイクロソフト Access での SQL 演習 第2回 集計,集約
3-8・関数を使ってデータを取り出す   2004年6月3日(木) 01T6010F               大北高広.
3.リレーショナルデータベース,主キー, SQL
地理情報システム論 第8回 GISによる処理技法(1) データの入手と座標系の変換 ベクタ形式における空間的演算(1)
C言語 はじめに 2016年 吉田研究室.
統計ソフトウエアRの基礎.
再帰CTE を使って遊ぼう 大阪#9 2012/04/14.
常設チャット トピック フィードを作成してアクティビティをフォローする Lync 2013 クイック リファレンス
Googleマップを活用した 生物調査データベースの構築
第2回.リレーショナルデータベース入門 SQL を用いたテーブルへの行の挿入 SQL 問い合わせの発行と評価結果の確認.
地理情報システム論 第6回 GISによる処理技法 GIS入門(2)
地理情報コンテンツ・データベースコンテンツ新規作成
SQL J2EE I (データベース論) 第3回 /
printf・scanf・変数・四則演算
SQL データベース論 第11回.
地理情報システム論 第5回 GISによる処理技法 GIS入門(1)
Presentation transcript:

オープンソースGISを用いた 自然環境解析講座 PostGISコース 2012年6月24日 講師: 今木洋大

自己紹介 GCNの紹介、スタッフの紹介 各自の自己紹介 (参加者全員で) 専門、バックグラウンド、何でも GISを何に使っているか? 各自の自己紹介 (参加者全員で) 専門、バックグラウンド、何でも GISを何に使っているか? なぜオープンソースに興味があるか? 講習会に期待するもの

1.はじめに (60min) 講義内容・日程について オープンソース GISについて ソフトウェアーインストールの確認 実習

講習会内容 1.はじめに(60min) 4.PostGIS -応用編-(90min) 講義内容・日程について オープンソース GISについて ソフトウェアーインストールの確認 実習 2.PostGISと オープンソースツール(60min) PostGIS、PostgreSQLとは QGISについて データベースの作成方法 ベクタデータのPostGISへのインポート方法 日本語対応 3.PostGIS-入門編-(90min) PostGISとPostgreSQLについて (PostGISとは何か) pgAdminとSQL (基本的なSQL構文について) SQL入門 PostGISデータの作り方  テーブルの結合 ビューの作成 実習 4.PostGIS -応用編-(90min) PostGISによる空間情報の検索 (SQL応用編) PostGISによるジオメトリー操作 (基本的なコマンド紹介。intersection, bufferなど) より複雑な検索 5.PostGISラスタ解析(30min) ラスタデータの取り扱い ラスタ解析の例

オープンソースGISとは何か オープンソースソフトウェアーとは、あるライセンス契約の元、ソースコードが公開されているソフトウェアーのことであり、そのライセンス下ではソフトウェアーの改変とその再配布が許されている。 (http://opensource.org/, 2007).

オープンソースGISとは何か ということは、 オープンソースソフトウェアーは必ずしも無料ではない さまざまなライセンスの種類がある GNU GPL、BSD、Apache ライセンスなど 改変、再配布においてもオープンソースである必要がある

オープンソースGISとは何か フリーウェアはフリーソフトと違う フリーソフトとオープンソースは似ている そこで、まとめてFOSS4G GoogleEarth,GoogleMap Virtual Earth, BingMaps ArcExplorer ERDAS VeiwFinder フリーソフトとオープンソースは似ている そこで、まとめてFOSS4G Free and Open Source Software for Geospatial 350以上のFOSS4G製品が利用できる(freegis.org)

なぜオープンソースGISを使わないか すでに市販製品を使っていて満足している オープンソースGISを知らない 自分のニーズがよくわからない いろいろ自分で勉強するのが面倒くさい

どっちを使う? どうやって仕事を確実にそして早く終わらせられるか? 自分のGIS使用の目的を明確にする 自分のリソースを知る(人的、金銭的)

PostGISの歴史 2001年Refractions Research(カナダ)によって開発開始 2005年4月、安定バージョン1.0リリース GNU General Public License 2012年4月、バージョン2.0リリース データベース構成の変更 各種コマンドの強化 ラスターの取り扱い シェープファイルローダーの改善 新しいインデックスの実装

PostGISの良さ データベース クエリと多様なファンクションにより細部に渡り、解析をコントロールしやすい データの安全性 大きなデータの取扱 クエリと多様なファンクションにより細部に渡り、解析をコントロールしやすい クエリを書くことにより質問に集中できる SQL自体が履歴ファイル 解析の繰り返し、やり直しがやりやすい ビューがレイヤとして扱える R、Pythonなどと連携しやすい(オープンソース)

PostGISリソース Refractions: http://postgis.refractions.net/ BostonGIS: http://www.bostongis.com/ OpenGeo: http://workshops.opengeo.org/postgis-intro/ Paul Ramseyのブログ: http://blog.cleverelephant.ca/ 私のサイト: http://www.geopacific.org 英語の本 PostGIS in Action Regina O. Obe and Leo S. Hsu, Manning

WWW.GeoPacific.org WWW.GeoPacific.orgとは 日本におけるオープンソースGIS(FOSS4G)の活用を促進するための双方向の知識ベース 最新のGISおよび周辺ソフトウェアーの動向、利用 方法、トラブルシューティングなど実践的な情報を集め共有 統計パッケージR、やPython、そのほかオープンソースで刺激的で面白いものはどんどん取り入れる オープンソースコンテンツマネージメントシステムPloneを使ってサイトを構築 ユーザー登録すれば誰でも独自のページを作れる。 一般公開するためには管理者や編集者の許可が必要 ページの作成、編集、画像のアップなどが簡単 参加型のホームページでありながら、内容を公開前に吟味できる 情報の共有に最適のツール

実習1 ソフトウェアーインストールの確認 PGAdminⅢを使って、PostgreSQL/PostGIS環境を見る QGISの動作確認 template_postgis_20 データベースのテーブル、ビューには何が含まれているか? spatial_ref_sysテーブルにはどのような情報が収められているか? テーブルを開いてみる SQLクエリーエディタを開けて、以下のコマンドを実行 select * from spatial_ref_sys limit 2; データーローダーの確認 PGAdminⅢのアドイン、PostGIS Shapefile and DBF Loader 2.0が開けるか確認 QGISの動作確認 postgis_training.qgsファイルをダブルクリックする

PostgreSQL・pgAdmin IIIを開く 2.「データベース」の+マークをクリックしてデータベースリストを展開 PostGIS Shapefile and DBF Loader 2.0を開く SQLエディターを開く 3.「template_postgis_20」をクリックしてデータベースにアクセスした後、現れる+マークをクリックしてデータベースを展開

データベースtemplate_postgis_20を調べる 以下の内容がpgAdminⅢで確認できるか サーバ データベース スキーマ Public テーブル Spatial_ref_sys ビュー Geometry_columns

テーブルの中身の確認 1 対象テーブルをリストから選択 「データをビュー」ボタンをクリック テーブルの表示 2 3

SQLエディタとSQLの実行 クエリの実行 SQLアイコンをクリック SQLエディタにクエリを書く 「クエリの実行」ボタンをクリック

QGIS可動の確認 postgis_training.qgsファイルをダブルクリックしてQGISを起動

2.PostGISと オープンソースツール (60min) PostGIS、PostgreSQLとは QGISについて データベースの作成方法 ベクタデータのPostGISへのインポート方法 日本語対応 実習

GISデータの変換、メタデータの閲覧、視覚化 PostGIS、QGIS、、、 数値データの 解析 プログラミング ベクタデータの保存、解析 GISデータの変換、メタデータの閲覧、視覚化 ラスタデータの 解析

PostGISとは? 空間情報データベースの一種 他にはOracle、MySQL、SQLite、IBM DB2、SQL Server2008、Ingres等がある このうちオープンソースは、 PostgreSQL、MySQL、 SQLite、Ingres 空間情報データベースとは? リレーショナルデータベース ジオメトリー情報を格納 空間情報の検索やジオメトリーの操作を可能にした PostgreSQLのライブラリ PostGISという単独のGISソフトウェアーではない PostgreSQLの機能拡張

他のGISとどこが違うか? SQLで空間情報を解析 オープンソース(GNU General Public License) 無料 ローカル、サーバ両環境 様々なGISのバックエンドとして活躍 空間データの視覚化機能がない 最新のPostGISではpgAdminⅢからはデータの簡単な視覚化が可能になっている

なぜPostGISを使うか GISサーバーとして使える 強力なジオメトリ解析機能+標準のデータベース機能 オープンソースである 大きなデータを扱える ウェブマッピングなどのバックエンドで使える MapServer, GeoServer, GeoDjangoなど 安定 とにかくおもしろい などなど

いつPostGISを使わないか 地図作成 GISデータ入力・編集 GISデータ視覚化 ラスターデータ解析(まだ開発途上) GRASS、QGIS、MapServer、GeoServer、 市販製品、 GISデータ入力・編集 GRASS、QGIS、市販製品、 GISデータ視覚化 QGIS、GRASS、UDig、 MapServer、GeoServer、市販製品、 ラスターデータ解析(まだ開発途上) GRASS、GDAL、市販製品、 データフォーマット変換 QGIS、GDAL/OGR、 メタデータ閲覧

PostGISのユーザーインターフェース PostGISを使う=SQLを書いて実行する GUI管理・開発ツールpgAdminⅢを使う コマンドラインのpsqlを使う QGISのアドインを使う

pgAdminⅢ PostgreSQLデータベースの管理、データ検索などに用いられる、オープンソースプログラム データベースの作成、テーブルの管理、クエリーの作成などがGUIで行える

pgAdmin ⅢとSQLエディタ

QGISとは オープンソースGIS データの視覚化、管理、編集、分析、地図の作成など 日本語化されている(OSGeo-Japan) ユーザーインターフェースが洗練、使い安い 開発速度が速い 多様なラスター、ベクターデータを扱える アドインを使うことで機能を拡張できる 比較的軽い PostGISのビュアーとして使える PostGISのジオメトリを編集できる PostGISの様々なアドインが用意されている

QGISによるPostGISデータの表示 (データベースへの新規接続) 1 3 2

QGISによるPostGISデータの表示 データベースを選択し テーブルを選択し 加える

PostGISを使う準備 データベースの作成 データのインポート template_Postgis_20データベースをテンプレートとする Shapefileローダーを使ったシェープファイルのインポート

データベースの作成 pgAdminⅢの起動 サーバーへアクセス データベースの新規作成 サーバーアイコンをダブルクリック サーバーアイコンで右クリックして新規作成 テンプレート:template_postgis_20 エンコーディング: utf8 オーナー:postgres

PostGISデータベースの新規作成 テンプレート: template_postgis_20

PostGISへのデータのインポート Shp2pgsql (シェープファイル) OGR(OGRでカバーされているファイル形式) コマンドライン GUI OGR(OGRでカバーされているファイル形式) QGIS・SPITプラグイン(シェープファイル)

pgAdminⅢからシェープファイルローダーを呼び出す

Shp2pgsqlでシェープファイルを インポート データベース接続設定 SRS、テーブル名の指定 シェープファイルの指定 オプション

PostGIS Shapefile and DBF loader 2.0 複数のシェープファイルがインポートしやすくなった 複数のシェープファイルのインポート 複数のDBFファイルのインポート PostGISデータのシェープファイルとしてのエクスポートができるようになった

PostGIS Shapefile and DBF loader 2.0 PostgreSQLサーバーへの接続設定 インポート先のデータベース名 サーバー接続のテスト

PostGIS Shapefile and DBF loader 2.0 シェープファイルの指定 スキーマ名 インポート後のテーブル名 インポート後のジオメトリ列名 EPSGコード 各項目を編集する場合は、その項目をダブルクリック

PostGIS Shapefile and DBF loader 2.0 列名の大文字、小文字の使用を保存するか。ディフォルトでは小文字を使用 Bigintデータタイプを許可するか 空間インデックスを作成するか DBFのみをインポートするか データインポート挿入ではなくコピーを使うか ジオメトリをGEGRAPHY列に読み込むか

pgsql2shpとshp2pgsql PostGISデーターをshapefileに変換またはその逆 Postgresqlのフォルダない、binフォルダに収められている コマンドラインツール Pgsql2shp -f shepefile名 -h localhost -u postgres データベース名 テーブル名

日本語エンコーディング PostgreSQL8.4から、データベースごとにロケールの設定が可能 詳しくは、 ロケールの設定を「C」に設定するとエンコーディングの設定に柔軟性が出る 日本語のエンコーディングは、UTF8がお勧め 詳しくは、 http://www.postgresql.jp/document/pg833doc/html/locale.html http://lets.postgresql.jp/documents/technical/text-processing/2

実習2 PostGISデータベースを作成 データベースmacacaにデータをインポート エンコーディング:SHIFT-JIS テンプレート: template_postgis_20 エンコーディング: UTF-8 データベースmacacaにデータをインポート エンコーディング:SHIFT-JIS 国勢調査データ(ポリゴン) \census\nikko_imaichi_32654_utf8.shp  census (テーブル名) ニホンザルの位置データ \monkey\location_all.dat_32654.shp  monkey  (テーブル名) 河川 \river\nikko_river_32654.shp  river  (テーブル名) 植生 \veg\nikko_vege_32654_utf8.shp  vegetation  (テーブル名) 国勢調査データ(テーブル) \census\male_female_en.dbf  census_male_female  (テーブル名) \census\occupation_en.dbf  census_occupation  (テーブル名)

3.PostGIS -入門編- (90min) PostGISとPostgreSQLについて pgAdminとSQL SQL入門 テーブルの結合 ビューの作成 実習

PostGISとPostgreSQLについて (PostGISとは何か) 空間情報の検索、作成、操作ができる 現在は、ベクターデータのみを扱える 近い将来、ラスターも扱える

DBMSとSQL PostGISを使うには、データベースの基礎知識が必要となる。 そのためここでは少し、データベース操作の基礎となる、データベースマネージメントとSQLについてpgAdmin III を使って勉強する

pgAdmin III データベースのリスト データベースの中身

データベースの構造 スキーマが収められている スキーマ PostGISのすべてのファンクションが収められている ファンクション ジオメトリーコラム テーブル 各テーブルのジオメトリーについての情報が収められる 空間参照系 テーブル 空間参照系(SRS)についての情報が収められている ビュー ビューが収められている

データベース用語のまとめ データベース スキーマ テーブル ビュー データベースの下に作られるディレクトリー構造のようなもの データを収める入れ物 ビュー データ自身ではなく、データを検索するクエリーを保存したもの

テーブル 実際にデータを保存 行がデータ単位 列で属性を示す

空間参照系テーブル 空間参照系(SRS)の定義に関する情報が収められている 独自のSRSを挿入する事もできる spatialreference.orgを利用

ビュー SQLで作ったクエリ自体を保存したもの ビューを呼び出すごとにSQL文が実行される データは含まない ひとつ以上のテーブルから任意のデータを選択、表示できる 使いこなせばとても便利

ジオメトリーコラムビュー 各テーブルのジオメトリーに関する情報を収めるビュー(PostGIS独自のもの) PostGIS1.xではテーブルとして扱われていた GeoServerなどのアプリケーションはこのビューをメタデータとして参照する

スキーマとは? データベース内に作られるディレクトリーのようなもの スキーマ間の情報検索が可能 (データベース間は不可能) スキーマ間の情報検索が可能 (データベース間は不可能) 例えば、基本的なデータは、 ‘base’というスキーマに保存し、プロジェクトAに関するデータは、’project_a’というスキーマに保存する。 データのバックアップなど、維持管理が簡単になる。 スキーマごとにテーブルへのアクセスの権限設定ができる

データベース用語のまとめ データベース スキーマ テーブル ビュー データベースの下に作られるディレクトリー構造のようなもの データを収める入れ物 ビュー データ自身ではなく、データを検索するクエリーを保存したもの

空間参照ID (SRID) 座標参照系(CRS・SRS)が標準化されている 代表的なコード系はEPSG (European Petroleum Survey Group) コード 例えば、 www.spatialreference.orgを利用して、SRSの検索ができる 参照系名 EPSGコード WGS84 4326 日本測地系2000:JGD2000 4612 WGS84 / UTM zone 54N 32654

SQL 101 Structured Query Language データの問い合わせに特化した言語 リレーショナルデータベースの操作 データ定義 CREATE TABLE, DROP TABLE,… データ操作 SELECT, DELETE, UPDATE,… データ制御 BEGIN,… PostGISは、SQLを使って空間的な情報の問い合わせを可能にしている

SQL 101 「市町村」テーブルから、「place」列にあるデータを返す SELECT 列名 FROM テーブル名; SELECT place FROM 市町村; 「市町村」テーブルから、「place」列にあるデータを返す SELECT 列名 FROM テーブル名; 大文字小文字は関係ない SQL文の最後にはセミコロンを付ける すべての列を選択するには、「*」 SELECT * FROM in_table

データの検索、SELECT文 SELECT文を使い、必要な情報を検索する SELECT place FROM 市町村; 日光 今市 湯元 テーブル名:市町村 Id place the_geom 1 日光 0101000020E6……… 2 今市 3 湯元

実際にクエリを書いてみる クエリでは大文字小文字を気にしない -- 集落の名前とその人口を表示させる SELECT moji, jinko FROM census; -- 集落の名前とその人口を人口の多い順に表示させる SELECT moji, jinko FROM census ORDER BY jinko DESC; --集落名に重複があるので、重複した集落はまとめて人口の多い順に集落名を表示する SELECT moji, SUM (jinko) FROM census GROUP BY moji ORDER BY sum DESC; --最も人口の多い集落名(moji)とその人口だけを表示 SELECT moji, SUM (jinko) FROM census GROUP BY moji ORDER BY sum DESC LIMIT 1;

SELECT文 「census」テーブルから、列「moji」、「jinko」を返す -- 集落の名前とその人口を表示させる SELECT moji, jinko FROM census; 「census」テーブルから、列「moji」、「jinko」を返す

ORDER BY [列名] DESC (ASC) -- 集落の名前とその人口を人口の多い順に表示させる SELECT moji, jinko FROM census ORDER BY jinko DESC; クエリの結果を並び替える 一つまたは複数の列名を指定する 昇順(asc)、降順(desc)を指定する 昇順がデフォルト

集約クエリ レコードを集約した結果を返す 合計「sum」、最大「max」、最小「min」、平均「avg」、サンプル数「count」 --集落名に重複があるので、重複した集落はまとめて人口の多い順に集落名を表示する SELECT moji, SUM (jinko) FROM census GROUP BY moji ORDER BY sum DESC; レコードを集約した結果を返す 合計「sum」、最大「max」、最小「min」、平均「avg」、サンプル数「count」

集約クエリ --集落名に重複があるので、重複した集落はまとめて人口の多い順に集落名を表示する SELECT moji, SUM (jinko) FROM census GROUP BY moji ORDER BY sum DESC; テーブル名:census id moji jinko 1 日光 50 2 今市 80 3 湯元 30 4 100 5 6 200 moji SUM 今市 280 日光 180 湯元 30 降順

実際にクエリを書いてみる 国勢調査(census)を使ってクエリを書く練習をする。 データベース「macaca」を開く SQLアイコンをクリックしてSQLエディタを開く

pgAdminⅢ SQLエディター 結果のエクスポート クエリの実行 実行したい文を選択 クエリの結果出力 クエリの実行に関するメッセージ

結果の出力 クエリで得られた結果は、pgAdminⅢの「ファイル」メニュー、「エクスポート」でテキストファイルとして出力できる

実習3-1:クエリの基本 国勢調査テーブル(census)から 集落の名前 (moji) とその人口 (jinko) を表示させる 人口の多い順に集落名を表示した結果をテキストファイルとして保存

データの検索、WHERE句 WHERE句で条件を絞り込む SELECT place FROM 市町村 WHERE id = 1; 日光 テーブル名:市町村 id place the_geom 1 日光 0101000020E6……… 2 今市 3 湯元

WHERE句では 条件の絞り込みには以下の比較演算子が使える = <、>、<=、>= <> != また、AND、OR、NOT、IN、LIKE、EXISTS、BETWEENなどの演算子も使える 詳しくは:http://www.postgresql.jp/document/pg911doc/html/functions.html

SQLのコツは、 細かいことは後にして、、、 SELECT place FROM 市町村; SELECT place FROM 市町村 WHERE id <= 2; SELECT place FROM 市町村 WHERE id <=2 AND place LIKE ‘東%’;

SQLのコツは、 細かいことは後にして、、、 SELECT place FROM 市町村 LIMIT 10; LIMITを使うことで、戻ってくるデータの件数を制限する クエリを試す際に便利

実習3-2:クエリの基本 国勢調査テーブル(census)から 市町村名(gst_name)「今市市」に該当するすべての列(データ)を表示

PostGIS用のテーブルを作る テーブルの作成 データの挿入 プライマリキーの設定 インデックスの作成 テーブル統計の取得 テーブル名:市町村 id place the_geom 1 日光 0101000……… 2 今市 3 湯元

今日のクエリー1 --PostGISテーブルを初めから作る CREATE TABLE 市町村 (id int4, place varchar (20), geom geometry(Point, 4326)); INSERT INTO 市町村 VALUES (1, '日光', ST_GeomFromText ('POINT (139.619492 36.747919)', 4326)); INSERT INTO 市町村 VALUES (2, '今市', ST_GeomFromText ('POINT (139.684039 36.726429)', 4326)); INSERT INTO 市町村 VALUES (3, '湯元', ST_GeomFromText ('POINT (139.424574 36.806853)', 4326)); INSERT INTO 市町村 VALUES (4, '鹿沼', ST_GeomFromText ('POINT (139.745013 36.567110)', 4326)); ALTER TABLE 市町村 ADD CONSTRAINT pkey_市町村 PRIMARY KEY (id); CREATE INDEX idx_市町村 on 市町村 (id); CREATE INDEX gist_市町村 on 市町村 USING GIST (the_geom); --テーブルに関する情報を収集する VACUUM ANALYZE 市町村;

テーブルの作成 CREATE TABLE テーブル名 ( 列名1 データタイプ, 列名2 データタイプ, 列名3 データタイプ); データを収納する空のテーブルを作成する テーブル名、列名には日本語も使用可能 ただし、列名に日本語を使うと、ダブルクオーテーションマークを使う必要があるため、半角英数字を使うほうが便利 列名にはName, tableなどの幾つかの予約語があるので使用を避ける CREATE TABLE テーブル名 ( 列名1 データタイプ, 列名2 データタイプ, 列名3 データタイプ); 列名1 列名2 列名3

テーブルの作成 PostgreSQLのデータタイプ データタイプ 説明 例 int4 整数 3 float4 浮動小数点数 1.023 varchar() テキスト ‘Tokyo’ geometry ジオメトリー 010200002E6**** date 日付 Wed Dec 17 time 時間 07:37:16 1997 PST …

テーブルの作成 CREATE TABLE 市町村 (id int4, place varchar (20)); テーブルを作るコマンド 列名とデータタイプ 列名とデータタイプ テーブル名 セミコロン Id place

PostGIS用のテーブルを作る 通常のテーブルとの違いは、 PostGISテーブル作成の手順 ジオメトリ列を含むだけ PostGIS2.X テーブル作成時にジオメトリー列も作成 CREATE TABLE 通常のテーブルにジオメトリー列を追加 ALTER TABLE *** ADD COLUMN PostGIS1.X 通常のテーブルを作成した後、ジオメトリー列を入れる命令を実行 SELECT ADDGEOMETRYCOLUMN

PostGISテーブルの作成 CREATE TABLE 市町村 (id int4, place varchar (20)); CREATE TABLE 市町村 (id int4, place varchar (20), geom geometry(POINT, 4326)); ジオメトリ列名 ジオメトリタイプとSRS データタイプ Id place geom

ジオメトリータイプ POINT LINESTRING POLYGON ジオメトリーとは、表現したい対象の幾何的な形状  ジオメトリーとは、表現したい対象の幾何的な形状 実際の世界をモデル化するためにいくつかのジオメトリーが考えられるが、点、線、面であらわすのが一般的 PostGISのジオメトリータイプには、点、線、面、に対応する、POINT、LINESTRING、POLYGONが用意されて いる。 PostGISでは、代表的な3タイプの他に多数のジオメトリータイプがある

ジオメトリー列の挿入 テーブルの変更(ALTER TABLE) すでにあるテーブルに列を加えたり、削除したり、列名を変更したり、様々な制限を加えたりする ALTER TABLE 市町村 ADD COLUMN geom geometry(Point, 4326); テーブル名:市町村 Id place geom Id place

ジオメトリー列の挿入 ALTER TABLE 市町村 ADD COLUMN geom geometry (Point, 4326); テーブル名 ALTER TABLE 市町村 ADD COLUMN geom geometry (Point, 4326); 空間参照系 (EPSG) データタイプ ジオメトリータイプ ジオメトリー列名 テーブル名:市町村 Id place geom Id place

ジオメトリー列の挿入 ALTER TABLE 市町村 ADD COLUMN geom geometry(Point, 4326); テーブル名:市町村 市町村にジオメトリーを保存するための列を挿入 geometry_columns ビューには自動的にテーブルに関する情報が収められる Id place geom 1 2 3 ビュー名:geometry_columns ADDGEOMETRYCOLUMNはPostGISコマンド 必要な情報は、 スキーマ名(省略可) : ‘public’ テーブル名 : ‘my_table’ ジオメトリー列名 : ‘the_geom’ 地理参照系ID (EPSG) : 4326 ジオメトリータイプ : ‘POINT’ 地理参照系の次元 : 2 Id Schema Table Name Geometry Column SRID Geometry Type Dimension 1 Public 市町村 the_geom 4326 POINT 2

実習3-3:クエリの基本 日光、今市、湯元の人口を示す以下の「人口」テーブルを作る 市町村の位置を示す「市町村」テーブルを作る 列名とデータタイプ Id (int4) Population (int4) 市町村の位置を示す「市町村」テーブルを作る ジオメトリタイプ:POINT EPSG:4326 id (int4) place (varchar(20)) geom (geometry) id population テーブル名:人口 id place geom テーブル名:市町村

PostGIS用のテーブルを作る テーブルの作成 データの挿入 プライマリキーの設定 インデックスの作成 テーブル統計の取得 テーブル名:市町村 id place geom 1 日光 0101000……… 2 今市 3 湯元

データの挿入 作成したテーブルにデータを挿入する INSERT INTO テーブル名 (列名1, 列名2, 列名3) VALUES (値1, 値2, 値3); 列に左から順番に値を挿入する場合は列名の指定をしなくても良い INSERT INTO テーブル名 VALUES (値1, 値2, 値3);

ジオメトリを作る PostGISではジオメトリはバイナリで保存されている SELECT ST_GeomFromText ( 'POINT (139.691701 35.689506)', 4326); バイナリのジオメトリーをテキスト表現から作るコマンド ジオメトリーをテキストで表現 SRID バイナリをテキスト表示 SELECT ST_AsText ( ST_GeomFromText ( 'POINT (139.691701 35.689506)', 4326) );

ジオメトリーを作る (経度 緯度) スペース! ST_GeomFromText ('POINT (139.691701 35.689506)', 4326) (139.691701 35.689506) スペース! (経度 緯度)

データの挿入 INSERT INTO 市町村 VALUES ( 1, ‘日光', ST_GeomFromText ('POINT (139.619492 36.747919)‘, 4326) ); INSERT INTO 市町村 VALUES ( 2, '今市', ST_GeomFromText ('POINT (139.684039 36.726429)', 4326) ); INSERT INTO 市町村 VALUES ( 3, '湯元', ST_GeomFromText ('POINT (139.424574 36.806853)', 4326) ); テーブル名:市町村 id place geom 1 日光 0101000020E6……… 2 今市 3 湯元 Id place the_geom 1 日光 0101000020E6……… 2 今市 Id place the_geom 1 日光 0101000020E6………

実習3-4:クエリの基本 人口テーブルにデータを挿入 市町村テーブルにデータを挿入 列名 データ id population 1 30000 1, 30000 2, 62000 3, 1000 市町村テーブルにデータを挿入 Id, place, geom 1, 日光, POINT (139.619492 36.747919) 2, 今市, POINT (139.684039 36.726429) 3, 湯元, POINT (139.424574 36.806853) 4, 鹿沼, POINT (139.745013 36.567110) id population 1 30000 2 62000 3 1000 id place geom 1 日光 0101000……… 2 今市 3 湯元 4 鹿沼

PostGIS用のテーブルを作る テーブルの作成 データの挿入 プライマリキーの設定 インデックスの作成 テーブル統計の取得 テーブル名:市町村 id place geom 1 日光 0101000……… 2 今市 3 湯元

プライマリーキーの設定 プライマリーキーとは、テーブルの各行を一意に識別するための列。QGISでデータを見るために必要。この場合、Idをキーに設定。 テーブル名:市町村 id place the_geom 1 日光 0101000020E6……… 2 今市 3 湯元 ALTER TABLE 市町村 ADD CONSTRAINT pkey_市町村 PRIMARY KEY (id);

プライマリーキーの設定 データ(各行)が一意であることを保障する仕組み 制限名。この場合プライマリーキー名 テーブルに何かしらの規制を加えるためのコマンド ALTER TABLE 市町村 ADD CONSTRAINT pkey_my_table PRIMARY KEY (Id); 規制がプライマリーキーであることの宣言 プライマリーキーを設定する列名 テーブル名:市町村 id place the_geom 1 日光 0101000020E6……… 2 今市 3 湯元

空間インデックス・テーブル統計の取得 後ほど。。。 -- プライマリーキーの設定 ALTER TABLE 市町村 ADD CONSTRAINT pkey_市町村 PRIMARY KEY (id); -- インデックスの作成 CREATE INDEX idx_市町村 on 市町村 (id); -- 空間インデックスの作成 CREATE INDEX gist_市町村 on 市町村 USING GIST (the_geom); -- テーブルに関する情報を収集する VACUUM ANALYZE 市町村;

実際には、、、 テーブルをいちから作り上げることは少なく、既存のデータを使うことが多い しかし、どの様にPostGISのデータが保存されているのか知ることは重要

実習3-5: クエリの基本 以下のクエリを実行して「市町村」テーブルを完成させる -- プライマリーキーの設定 ALTER TABLE 市町村 ADD CONSTRAINT pkey_市町村 PRIMARY KEY (id); -- インデックスの作成 CREATE INDEX idx_市町村 on 市町村 (id); -- 空間インデックスの作成 CREATE INDEX gist_市町村 on 市町村 USING GIST (the_geom); -- テーブルに関する情報を収集する VACUUM ANALYZE 市町村;

テーブルの結合 複数のテーブルを共通のキー(列)を使って結合する SELECT文で結合したテーブルの中から必要な列だけを選択できる 結合には様々な種類があるが、等結合(inner join)と外部結合(left join)が主 Inner join, left (right, full) outer join, cross joinなどがある Inner joinはテーブル間に共通するキーだけを元にレコードを表示する

等結合 左外部結合 id 市町村 1 日光 2 今市 3 鹿沼 id 人口 1 10000 2 50000 4 120000 id 市町村 市町村テーブル 人口テーブル 左外部結合 id 市町村 1 日光 2 今市 3 鹿沼 id 人口 1 10000 2 50000 4 120000 id 市町村 人口 1 日光 10000 2 今市 50000 3 鹿沼 NULL 市町村テーブル 人口テーブル

等結合 SELECT 市町村.id, 市町村.place, 人口.population FROM 市町村, 人口 1 日光 2 今市 3 鹿沼 id population 1 10000 2 50000 4 120000 id place population 1 日光 10000 2 今市 50000 市町村テーブル 人口テーブル SELECT 市町村.id, 市町村.place, 人口.population FROM 市町村, 人口 WHERE 市町村.id = 人口.id;

等結合 SELECT 市町村.id, 市町村.place, 人口.population FROM 市町村, 人口 1 日光 2 今市 3 鹿沼 id population 1 10000 2 50000 4 120000 id place population 1 日光 10000 2 今市 50000 市町村テーブル 人口テーブル SELECT 市町村.id, 市町村.place, 人口.population FROM 市町村, 人口 WHERE 市町村.id = 人口.id; SELECT 市町村.id, 市町村.place, 人口.population FROM 市町村 INNER JOIN 人口 ON 市町村.id = 人口.id;

左外部結合 SELECT 市町村.id, 市町村.place, 人口.population FROM 市町村 LEFT JOIN 人口 1 日光 2 今市 3 鹿沼 id population 1 10000 2 50000 4 120000 id place population 1 日光 10000 2 今市 50000 3 鹿沼 NULL 市町村テーブル 人口テーブル SELECT 市町村.id, 市町村.place, 人口.population FROM 市町村 LEFT JOIN 人口 ON 市町村.id = 人口.id;

実習3-6 テーブル結合に関する以下のクエリを試す -- テーブルの結合 (Inner Join) SELECT 市町村.id, 市町村.place, 人口.population FROM 市町村, 人口 WHERE 市町村.id = 人口.id; FROM 市町村 INNER JOIN 人口 ON 市町村.id = 人口.id; -- テーブルの結合 (Left join) FROM 市町村 LEFT JOIN 人口

ビュー SQLで作ったクエリ自体を保存したもの ビューを呼び出すごとにSQL文が実行される データは含まない ひとつ以上のテーブルから任意のデータを選択、表示できる 使いこなせばとても便利

ビューの作成 GISのデータとしてビューを利用する データを視覚化できる テーブルの変更を常に反映 サイズが小さい CREATE VIEW 市町村別人口 AS SELECT 市町村.id, 市町村.place, 市町村.the_geom, 人口.population FROM 市町村, 人口 WHERE 市町村.id = 人口.id GISのデータとしてビューを利用する データを視覚化できる テーブルの変更を常に反映 サイズが小さい

QGISでテーブル及びビューを見る 名称: macaca ホスト: localhost データベース: macaca ユーザー名:postgres パスワード:各自

QGISでテーブル及びビューを見る

実習3-7 市町村テーブルと人口テーブルを結合したビューを作り、ビューをQIGSで見る CREATE VIEW 市町村別人口 AS SELECT 市町村.id, 市町村.place, 市町村.geom, 人口.population FROM 市町村, 人口 WHERE 市町村.id = 人口.id;

今日のクエリー2 エイリアス --年寄りの男女別人口を集落ごとに示し、年寄り率を求め、GISレイヤとして使えるようにジオメトリとプライマリキーを入れたビューを作る DROP VIEW IF EXISTS census_stat; --もしビューがあったら削除する CREATE VIEW census_stat AS SELECT t1.gid, t1.moji, t1.the_geom, t2.total, t2.m_egt65, t2.f_egt65, t2.tot_egt_65 / t2.total * 100 old_rate FROM census t1, census_male_female t2 WHERE t1.key_code = t2.key_code AND t2.total != 0 ORDER BY t2.f_egt75 DESC;

エイリアス テーブル名の表記またはクエリを別の短い名前で表す。たとえば、 SELECT monkey.id, monkey.date FROM monkey; が SELECT t1.id, t1.date FROM monkey t1; と表現できる。 複数のテーブルを使ったクエリでは、「テーブル名.列名」の形式で引っ張ってくる列を指定するので、特にエイリアスの利用が便利になる。 また、クエリの結果返される列名にもエイリアスを使える

今日のクエリー2 SQLでの演算 --年寄りの男女別人口を集落ごとに示し、年寄り率を求め、GISレイヤとして使えるようにジオメトリとプライマリキーを入れたビューを作る DROP VIEW IF EXISTS census_stat; --もしビューがあったら削除する CREATE VIEW census_stat AS SELECT t1.gid, t1.moji, t1.geom, t2.total, t2.m_gt65, t2.f_gt65, t2.tot_egt_65 / t2.total * 100 old_rate FROM census t1, census_male_female t2 WHERE t1.key_code = t2.key_code AND t2.total != 0 ORDER BY t2.f_egt65 DESC;

SQLでの演算 基本的な算術演算子、+、ー、*、/、が使える 文字関数も多数用意されている http://www.postgresql.jp/document/9.1/html/functions-math.html 文字関数も多数用意されている http://www.postgresql.jp/document/9.1/html/functions-string.html

今日のクエリー 2 属性情報検索 --年寄りの男女別人口を集落ごとに示し、年寄り率を求め、GISレイヤとして使えるようにジオメトリとプライマリキーを入れたビューを作る DROP VIEW IF EXISTS census_stat; --もしビューがあったら削除する CREATE VIEW census_stat AS SELECT t1.gid, t1.moji, t1.geom, t2.total, t2.m_gt65, t2.f_gt65, t2.tot_egt_65 / t2.total * 100 old_rate FROM census t1, census_male_female t2 WHERE t1.key_code = t2.key_code AND t2.total != 0 ORDER BY t2.f_egt65 DESC; 2つのテーブルの 等結合 総人口が0のデータは除く

今日のクエリ2

DROP TABLE と DROP VIEW 作成したテーブルまたはビューを削除する もしすでにテーブルがある場合に削除、ない場合にはコマンドを無視 DROP TABLE IF EXISTS テーブル名; 色々条件を変えながら行う作業に便利

今日のクエリー 2 属性情報検索 --年寄りの男女別人口を集落ごとに示し、年寄り率を求め、GISレイヤとして使えるようにジオメトリとプライマリキーを入れたビューを作る DROP VIEW IF EXISTS census_stat; --もしビューがあったら削除する CREATE VIEW census_stat AS SELECT t1.gid, t1.moji, t1.geom, t2.total, t2.m_gt65, t2.f_gt65, t2.tot_egt_65 / t2.total * 100 old_rate FROM census t1, census_male_female t2 WHERE t1.key_code = t2.key_code AND t2.total != 0 ORDER BY t2.f_egt65 DESC;

実習3-8 テーブルの結合 結合したビューをQGISで見てみる 国勢調査のテーブル(census)と男女別人口テーブル(census_male_female)を結合して、 65歳以上の人口(tot_egt_65)が一番多い集落名(moji)を見つける 国勢調査のテーブルと職業別人口テーブルを結合して、 農林水産業を営む人が一番多い集落と少ない集落(moji)を調べる 結合したビューをQGISで見てみる 年寄りの男女別人口を集落ごとに示し、年寄り率を求め、GISレイヤとして使えるようにジオメトリとプライマリキーを入れたビューを作る以下の属性値を各集落ポリゴン単位で表示できるようにする 総人口 (total) 65歳以上の人口 (tot_egt_65) 65歳以上の男性の人口 (m_gt65) 65歳以上の女性の人口 (f_gt65) 年寄り率= 65歳以上の人口 (tot_egt_65) /総人口 (total) * 100

4.PostGIS -応用編- (90min) PostGISによる空間情報の検索(SQL応用編) PostGISによるジオメトリー操作 より複雑な検索 実習

今日のクエリ―3 空間情報検索 --Ki群の1996年6月から9月の植生タイプの利用を調べる SELECT COUNT(t1.*), t2.v_name FROM monkey t1, vegetation t2 WHERE ST_INTERSECTS (t1.geom, t2.geom) AND t1.troop = 'KI' AND year = 1996 AND month BETWEEN 6 AND 9 GROUP BY t2.v_name ORDER BY count;

PostGISによる空間情報の検索 空間情報のクエリーには、SQL文をベースにジオメトリーとPostGISのさまざまな機能を使う。 空間クエリーとは、空間に関した情報の検索で例えば、 サルの植生タイプの利用頻度を調べる 植生タイプはポリゴン、サルの位置は点 各テーブルは以下のようなフォーマット ID 植生タイプ the_geom 1 ミズナラ林 ******* 2 スギ林 3 水田 植生テーブル サルテーブル ID 日付 the_geom 1 2011/11/1 ******* 2 2011/11/6 3 2011/11/20

PostGISによる空間情報の検索 SELECT 植生.植生タイプ, COUNT(サル.ID) FROM 植生, サル WHERE ST_INTERSECTS (植生.the_geom, サル.the_geom) GROUP BY 植生.植生タイプ; ID 植生タイプ the_geom 1 ミズナラ林 ******* 2 スギ林 3 水田 植生テーブル 植生タイプ COUNT ミズナラ林 2 スギ林 4 水田 ID 日付 the_geom 1 2011/11/1 ******* 2 2011/11/6 3 2011/11/20 サルテーブル

今日のクエリー4 ジオメトリ操作 DROP TABLE IF EXISTS riparian; --もしテーブルがあったら削除する --河川から一定の距離にある植生の面積を求める --まず最初に植生図を河川のバッファーで切り抜く DROP TABLE IF EXISTS riparian; --もしテーブルがあったら削除する CREATE TABLE riparian AS SELECT t2.v_name, ST_INTERSECTION(t1.geom, t2.geom) geom FROM (SELECT ST_UNION(ST_BUFFER(geom, 200)) geom FROM river WHERE rin = '板穴川') t1, vegetation t2 WHERE ST_INTERSECTS(t1.geom, t2.geom); --次に新しい列を作って各植生ポリゴンの面積を求める ALTER TABLE riparian ADD area_m2 float4; UPDATE riparian SET area_m2 = ST_Area (geom); --最後に植生タイプでポリゴンの面積を集計する SELECT v_name, SUM ( area_m2 /1000000) area_km2 FROM riparian GROUP BY v_name ORDER BY area_km2 DESC;

PostGISによるジオメトリー操作 ジオメトリー操作とは、ジオメトリーに手を加えること。例えば、 二つのポリゴンの交わる面を取り出す 複雑なポリゴンを単純化する 線にバッファーを発生させる PostGISにはさまざまなジオメトリー操作のための機能がそろっている

PostGISによるジオメトリ操作 河川から200mのバッファを発生させ、植生ポリゴンを切り抜く 河川テーブル 植生テーブル ID 県名 the_geom 1 広瀬川 ******* 2 名取川 3 北上川 河川テーブル ST_Buffer ( t1.the_geom, 200 ) ID 植生タイプ the_geom 1 ミズナラ林 ******* 2 スギ林 3 水田 植生テーブル ST_Intersection ( ST_Buffer ( t1.the_geom, 200 ), t2.the_geom )

PostGISによるジオメトリ操作 --まず最初に植生図を河川のバッファーで切り抜く CREATE TABLE riparian AS SELECT t2.v_name, ST_INTERSECTION(t1.geom, t2.geom) geom FROM (SELECT ST_UNION(ST_BUFFER(geom, 200)) geom FROM river WHERE rin = '板穴川') t1, vegetation t2 WHERE ST_INTERSECTS(t1.geom, t2.geom);

サブクエリー クエリーの中で使われるクエリー SELECT t2.v_name, ST_INTERSECTION(t1.geom, t2.geom) geom FROM (SELECT ST_UNION(ST_BUFFER(geom, 200)) geom FROM river WHERE rin = '板穴川') t1, vegetation t2 WHERE ST_INTERSECTS(t1.geom, t2.geom);

PostGISファンクション ST_Intersection (t1.geom, t2.geom) ST_Union (geom) 2つのジオメトリの交差を求める ST_Union (geom) ジオメトリを溶融させる ST_Buffer (geometry, distance ), バッファを発生させる ST_Intersects (t1.geom, t2.geom) 2つのレイヤの地物が重なるかどうか ST_Area (geom) 地物の面積を求める

PostGISによるジオメトリ操作 --次に新しい列を作って各植生ポリゴンの面積を求める ALTER TABLE riparian ADD area_m2 float4; UPDATE riparian SET area_m2 = ST_Area ( the_geom ); --最後に植生タイプでポリゴンの面積を集計する SELECT v_name, SUM ( area_m2 /1000000) area_km2 FROM riparian GROUP BY v_name ORDER BY area_km2 DESC;

SQL:列追加とアップデート テーブルに新しい列を加える 列に値を入力する Alter Table テーブル名 ADD 列名 データタイプ; Update テーブル SET 対象列 = 値 --次に新しい列を作って各植生ポリゴンの面積を求める ALTER TABLE riparian ADD area_m2 float4; UPDATE riparian SET area_m2 = ST_Area (geom);

PostGISによるジオメトリー操作 機能の一例 ST_Buffer ST_ConvexHull ST_Difference バッファーのジオメトリーを返す ST_ConvexHull 最小凸型多角形のジオメトリーを返す ST_Difference ジオメトリーAのうち、ジオメトリーBと交わらない部分のジオメトリーを返す ST_Intersection ジオメトリーAとBが共有する部分のジオメトリーを返す ST_Simplify Douglas-Peuker アルゴリズムを使ってジオメトリーを単純化する ST_Union ジオメトリーを結合した結果出来上がる点集合のジオメトリーを返す

今日のクエリー4 ジオメトリ操作 DROP TABLE IF EXISTS riparian; --もしテーブルがあったら削除する --河川から一定の距離にある植生の面積を求める --まず最初に植生図を河川のバッファーで切り抜く DROP TABLE IF EXISTS riparian; --もしテーブルがあったら削除する CREATE TABLE riparian AS SELECT t2.v_name, ST_INTERSECTION(t1.geom, t2.geom) geom FROM (SELECT ST_UNION(ST_BUFFER(geom, 200)) geom FROM river WHERE rin = '板穴川') t1, vegetation t2 WHERE ST_INTERSECTS(t1.geom, t2.geom); --次に新しい列を作って各植生ポリゴンの面積を求める ALTER TABLE riparian ADD area_m2 float4; UPDATE riparian SET area_m2 = ST_Area (geom); --最後に植生タイプでポリゴンの面積を集計する SELECT v_name, SUM ( area_m2 /1000000) area_km2 FROM riparian GROUP BY v_name ORDER BY area_km2 DESC;

今日のクエリ4

空間インデックス 空間インデックスとは、ジオメトリーにつけられるインデックスで、空間情報の検索を著しく早くすることができる。 PostGISでは、ジオメトリーがバウンディングボックス(BBox)という箱で各ジオメトリーを囲み、その箱同士の関係でインデックスを作る 複雑なジオメトリーでも、箱にすれば2つの点で表せる PostGISの情報検索は実は2段階で行われる バウンディングボックスによる検索 実際のジオメトリー情報による検索 インデックスは入れ子になった箱同士の関係を整理したもので、目的の情報にすばやくアクセスすることを可能にする

PostGIS用のテーブルを作る テーブルの作成 ジオメトリコラムの挿入 データの挿入 プライマリキーの設定 インデックスの作成 テーブル統計の取得 テーブル名:市町村 id place the_geom 1 日光 0101000……… 2 今市 3 湯元

空間インデックス 例えば、ネズミ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機能 管理機能 (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)

実習4 Ki群が1996年6月から9月に利用した植生タイプを求め、その頻度を示す Ki群の1996年6月から9月の行動圏(最外郭法)を描く ST_ConvexHull(geom) QGISで行動圏を表示し、確認する Ki群の1996年6月から9月の行動圏内の植生割合を求める ST_Intersection(geom, geom) 利用可能な植生(行動圏内)と実際に利用した植生(サルのポイント)を比較する ボーナス:行動圏内にランダムに100ポイントを発生させ、その植生タイプを求め、サルの実際の利用と比較する

5.PostGISによるラスタ解析 (30min) ラスタデータの取り扱い ラスタ解析の例 実習

PostGIS2.0 正式にラスタデータが取り扱える ラスタを取り込むraster2pgsql.exeを利用 QGISのPostGIS Rasterアドインを使ってラスター表示 機能はまだ限定的

raster2pgsql -s SRID -I -C -M -F -t 50x50 -l 2,4,8 in_raster out_table ラスタのインポート コマンドラインツール、raster2pgsql.exeを使ってGDALに対応しているラスタをインポート raster2pgsql -s SRID -I -C -M -F -t 50x50 -l 2,4,8 in_raster out_table オプション -s SRSの指定 -I 空間インデックスを作成 -C 各種データ制限の付加 -M バキュームの実行 オプション -F ファイル名を示す列を追加 -t タイリング指定。 縦x横 で指定 -l ピラミッド作成。1が元のサイズ その他多数

ラスタのインポート 実際のインポートコマンドの例 Nikko10m.tif をdemというテーブル名でインポート SRSは32654、タイルサイズは50x50、オーバービューは2, 4, 8の3種類 空間インデックス、各種データ制限を加え、実行後にバキュームを実行 パイプ(|)を使って、結果を直接データベースmacacaに送る raster2pgsql -s 32654 -I -C -M -F -t 50x50 -l 2,4,8 c:\gisdata\nikko10m.tif dem | psql -U postgres macaca

ラスタの表示 QGISの「Load Postgis Raster to QGIS 0.5.3」をインストール インストールしたアドインで、表示したいラスタを指定して表示

ラスタの表示

ラスタのデータタイプ ラスタの代表的データタイプ rasterとgeomval raster geomval インポートしたデータ 複数のバンドを持てる geomval geomとvalの2つのフィールドから成るラスタデータタイプ geom: ジオメトリーオブジェクトを収納 val: 倍精度浮動小数点数でピクセル値を収納 ベクタデータとのインタラクションに使われる

ラスタの機能 ST_Clip() ST_Aspect(), ST_Slope(), ST_Hillshade() ST_Intersection() ST_MapAlgebraExpr() ST_Polygon() ST_Reclass() ST_Union() ST_Interesects() … その他多数

ポイント上のラスタ値を求める -- 各点の標高を求める SELECT foo.rid, foo.pk, (foo.geom).geom the_geom, (foo.geom).val elev FROM (SELECT t2.rid, t1.pk, ST_Intersection(t1.geom, t2.rast) geom FROM ki_points t1, dem t2 WHERE ST_Intersects(t1.geom, t2.rast) ) foo;

実習5 raster2pgsqlを使って、標高、傾斜、方位ラスタをインポート QGISで読み込んだラスタを表示 Ki群が1996年6月から9月に利用した場所の標高、斜面傾斜、斜面方位を求める