149
1 オオオオオオオ オオオオ GIS オオオオオオオオ 2012 オ 6 オ 24 オ オオ オオオオ PostGIS コココ

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

  • Upload
    irving

  • View
    58

  • Download
    0

Embed Size (px)

DESCRIPTION

オープンソースGISを用いた 自然環境解析講座. PostGIS コース. 2012 年 6 月 24 日 講師: 今木洋大. 自己紹介. GCN の紹介、スタッフの紹介 各自の自己紹介 (参加者全員で) 専門、バックグラウンド、何でも GIS を何に使っているか? なぜオープンソースに興味があるか? 講習会に期待するもの. 1.はじめに ( 60min ). 講義内容・日程について オープンソース GIS について ソフトウェアーインストールの確認 実習. 講習会内容 . テーブルの結合 ビューの作成 実 習 - PowerPoint PPT Presentation

Citation preview

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

1

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

PostGISコース

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

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

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

3

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

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

4講習会内容 1.はじめに( 60min )

講義内容・日程について オープンソース 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 ) ラスタデータの取り扱い ラスタ解析の例 実習

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

5オープンソース GIS とは何か• オープンソースソフトウェアーとは、あるライセンス契約の元、ソースコードが公開されているソフトウェアーのことであり、そのライセンス下ではソフトウェアーの改変とその再配布が許されている。

(http://opensource.org/, 2007).

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

6オープンソース GIS とは何か• ということは、• オープンソースソフトウェアーは必ずしも無料ではない• さまざまなライセンスの種類がある– GNU GPL 、 BSD 、 Apache ライセンスなど

• 改変、再配布においてもオープンソースである必要がある

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

7オープンソース GIS とは何か• フリーウェアはフリーソフトと違う– GoogleEarth,GoogleMap– Virtual Earth, BingMaps– ArcExplorer– ERDAS VeiwFinder

• フリーソフトとオープンソースは似ている• そこで、まとめて FOSS4G– Free and Open Source Software for Geospatial– 350 以上の FOSS4G 製品が利用できる( freegis.org )

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

8

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

なぜオープンソース GIS を使わないか

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

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

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

10

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

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

11

PostGIS の良さ• データベース– データの安全性– 大きなデータの取扱

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

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

12

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

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

13

WWW.GeoPacific.org

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

14実習1• ソフトウェアーインストールの確認

– PGAdminⅢを使って、 PostgreSQL/PostGIS 環境を見る• 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 ファイルをダブルクリックする

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

15

PostgreSQL ・ pgAdmin III を開く1 .「 PostgreSQL 9.1」をダブルクリックしてサーバーにアクセス

3.「 template_postgis_20」をクリックしてデータベースにアクセスした後、現れる+マークをクリックしてデータベースを展開

SQL エディターを開く

PostGIS Shapefile and DBF Loader

2.0 を開く

2.「データベース」の+マークをクリックしてデータベースリストを展開

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

16データベース template_postgis_20 を調べる

サーバ データベース スキーマ Public テーブル Spatial_ref_sys ビュー Geometry_columns

以下の内容が pgAdminⅢ で確認できるか

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

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

3

1

2

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

18

SQL エディタと SQL の実行

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

クエリの実行

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

19

QGIS可動の確認• postgis_training.

qgs ファイルをダブルクリックして QGIS を起動

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

20

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

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

21

PostGIS 、 QGIS 、、、

GIS データの変換、メタデータの閲覧、視覚化

ベクタデータの保存、解析

ラスタデータの解析

数値データの解析プログラミング

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

22

PostGIS とは?• 空間情報データベースの一種

– 他には Oracle 、 MySQL 、 SQLite 、 IBM DB2 、 SQL Server2008 、Ingres等がある

– このうちオープンソースは、 PostgreSQL 、 MySQL 、 SQLite 、 Ingres

• 空間情報データベースとは?– リレーショナルデータベース– ジオメトリー情報を格納– 空間情報の検索やジオメトリーの操作を可能にした

• PostgreSQL のライブラリ– PostGIS という単独の GIS ソフトウェアーではない– PostgreSQL の機能拡張

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

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

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

24なぜ PostGIS を使うか• GISサーバーとして使える• 強力なジオメトリ解析機能+標準のデータベース機能• オープンソースである• 大きなデータを扱える• ウェブマッピングなどのバックエンドで使える

– MapServer, GeoServer, GeoDjango など• 安定• とにかくおもしろい• などなど

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

25いつ PostGIS を使わないか• 地図作成

– GRASS 、 QGIS 、 MapServer 、 GeoServer 、 市販製品、• GIS データ入力・編集

– GRASS 、 QGIS 、市販製品、• GIS データ視覚化

– QGIS 、 GRASS 、 UDig 、 MapServer 、 GeoServer 、市販製品、• ラスターデータ解析(まだ開発途上)

– GRASS 、 GDAL 、市販製品、• データフォーマット変換

– QGIS 、 GDAL/OGR 、• メタデータ閲覧

– QGIS 、 GDAL/OGR 、

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

26

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

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

27

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

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

28

pgAdmin Ⅲ と SQL エディタ

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

29

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

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

30

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

2

3

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

31

PostGIS につなぐデータベースを選択しテーブルを選択し

加える

QGIS による PostGIS データの表示

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

32

PostGIS を使う準備• データベースの作成– template_Postgis_20 データベースをテンプレートとする

• データのインポート– Shapefile ローダーを使ったシェープファイルのインポート

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

33データベースの作成• pgAdminⅢ の起動• サーバーへアクセス–サーバーアイコンをダブルクリック

• データベースの新規作成–サーバーアイコンで右クリックして新規作成• テンプレート: template_postgis_20• エンコーディング : utf8• オーナー: postgres

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

34

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

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

35

PostGIS へのデータのインポート• Shp2pgsql  (シェープファイル)– コマンドライン– GUI

• OGR ( OGR でカバーされているファイル形式)• QGIS ・ SPIT プラグイン(シェープファイル)

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

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

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

37

Shp2pgsql でシェープファイルをインポート

オ プ シ ョ ンシェープファイルの指定

データベース接続設定

SRS 、テーブル名の指定

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

38

PostGIS Shapefile and DBF loader 2.0

• 複数のシェープファイルがインポートしやすくなった– 複数のシェープファイルのインポート– 複数の DBF ファイルのインポート

• PostGIS データのシェープファイルとしてのエクスポートができるようになった

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

39

PostGIS Shapefile and DBF loader 2.0

PostgreSQLサーバーへの接続設定

インポート先のデータベース名サーバー接続のテスト

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

40

PostGIS Shapefile and DBF loader 2.0

シェープファイルの指定 スキーマ名

EPSG コード

インポート後のテーブル名

インポート後のジオメトリ列名各項目を編集する場合は、その項目をダブルクリック

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

41

PostGIS Shapefile and DBF loader 2.0

インポートする DBF の文字エンコード 列名の大文字、小文字の使用を保存するか。ディフォルトでは小文字を使用Bigint データタイプを許可するか

空間インデックスを作成するか

DBF のみをインポートするかデータインポート挿入ではなくコピーを使うかジオメトリを GEGRAPHY列に読み込むか

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

42

pgsql2shp と shp2pgsql

• PostGIS データーを shapefile に変換またはその逆• Postgresql のフォルダない、 bin フォルダに収められている• コマンドラインツール

Pgsql2shp -f shepefile名 -h localhost -u postgres  データベース名 テーブル名

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

43日本語エンコーディング• PostgreSQL8.4 から、データベースごとにロケールの設定が可能– ロケールの設定を「 C」に設定するとエンコーディングの設定に柔軟性が出る– 日本語のエンコーディングは、 UTF8 がお勧め

• 詳しくは、– http://www.postgresql.jp/document/pg833doc/html/

locale.html– http://lets.postgresql.jp/documents/technical/text-

processing/2

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

44実習2• PostGIS データベースを作成

• 新規データベース名: macaca• テンプレート: 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   (テーブル名)

– エンコーディング :SHIFT-JIS• 国勢調査データ(テーブル)

– \census\male_female_en.dbf census_male_female   (テーブル名)– \census\occupation_en.dbf census_occupation   (テーブル名)

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

45

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

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

46

PostGIS と PostgreSQL について ( PostGIS とは何か)• PostGIS とは、 PostgreSQL データーベースを機能拡張させ、空間情報を扱えるようにした空間データベース• 空間情報の検索、作成、操作ができる• 現在は、ベクターデータのみを扱える–近い将来、ラスターも扱える

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

47

DBMS と SQL

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

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

48

pgAdmin III

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

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

49

スキーマ スキーマが収められているデータベースの構造

ファンクション PostGIS のすべてのファンクションが収められている

ジオメトリーコラムテーブル各テーブルのジオメトリーについての情報が収められる

ビュー ビューが収められている

空間参照系テーブル空間参照系( SRS)についての情報が収められている

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

50データベース用語のまとめ• データベース– スキーマ

– データベースの下に作られるディレクトリー構造のようなもの• テーブル

– データを収める入れ物• ビュー

– データ自身ではなく、データを検索するクエリーを保存したもの

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

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

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

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

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

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

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

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

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

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

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

56データベース用語のまとめ• データベース– スキーマ

– データベースの下に作られるディレクトリー構造のようなもの• テーブル

– データを収める入れ物• ビュー

– データ自身ではなく、データを検索するクエリーを保存したもの

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

57空間参照 ID (SRID)• 座標参照系( CRS ・ SRS )が標準化されている• 代表的なコード系は EPSG (European Petroleum Survey

Group ) コード• 例えば、

• www.spatialreference.org を利用して、 SRS の検索ができる

参照系名 EPSG コードWGS84 4326

日本測地系 2000: JGD2000 4612

WGS84 / UTM zone 54N 32654

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

58

SQL 101• Structured Query Language• データの問い合わせに特化した言語• リレーショナルデータベースの操作– データ定義

• CREATE TABLE, DROP TABLE,…– データ操作

• SELECT, DELETE, UPDATE,…– データ制御

• BEGIN,…

• PostGIS は、 SQL を使って空間的な情報の問い合わせを可能にしている

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

59

SQL 101

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

SELECT place FROM 市町村 ;

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

60データの検索、 SELECT 文• SELECT 文を使い、必要な情報を検索する

SELECT place FROM 市町村 ;

Id place the_geom

1 日光 0101000020E6………

2 今市 0101000020E6………

3 湯元 0101000020E6………

テーブル名:市町村

日光今市湯元

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

61実際にクエリを書いてみる• クエリでは大文字小文字を気にしない

-- 集落の名前とその人口を表示させる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;

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

62

SELECT 文

• 「 census」テーブルから、列「 moji」、「 jinko」を返す

-- 集落の名前とその人口を表示させるSELECT moji, jinko FROM census;

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

63

ORDER BY [列名 ] DESC (ASC)

• クエリの結果を並び替える• 一つまたは複数の列名を指定する• 昇順( asc )、降順( desc )を指定する• 昇順がデフォルト

-- 集落の名前とその人口を人口の多い順に表示させるSELECT moji, jinko FROM census ORDER BY jinko DESC;

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

64集約クエリ

• レコードを集約した結果を返す• 合計「 sum」、最大「 max」、最小「 min」、平均「 avg」、サンプル数「 count」

-- 集落名に重複があるので、重複した集落はまとめて人口の多い順に集落名を表示するSELECT moji, SUM (jinko) FROM census GROUP BY moji ORDER BY sum DESC;

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

65集約クエリ

id moji jinko

1 日光 50

2 今市 80

3 湯元 30

4 日光 100

5 日光 30

6 今市 200

テーブル名: census

moji SUM

今市 280

日光 180

湯元 30

降順

-- 集落名に重複があるので、重複した集落はまとめて人口の多い順に集落名を表示するSELECT moji, SUM (jinko) FROM census GROUP BY moji ORDER BY sum DESC;

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

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

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

67

pgAdmin SQLⅢ エディター

実行したい文を選択クエリの実行

クエリの結果出力 クエリの実行に関するメッセージ

結果のエクスポート

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

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

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

69実習3-1:クエリの基本• 国勢調査テーブル (census) から– 集落の名前 (moji) とその人口 (jinko) を表示させる– 集落の名前 (moji) とその人口 (jinko) を人口の多い順に表示させる– 集落名 (moji) に重複があるので、重複した集落はまとめて人口 (jinko) の多い順に集落名を表示する– 最も人口の多い集落名 (moji) とその人口だけを表示– 人口の多い順に集落名を表示した結果をテキストファイルとして保存

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

70データの検索、 WHERE句• WHERE句で条件を絞り込む

SELECT place FROM 市町村 WHERE id = 1;

id place the_geom

1 日光 0101000020E6………

2 今市 0101000020E6………

3 湯元 0101000020E6………

テーブル名:市町村

日光

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

71

WHERE句では• 条件の絞り込みには以下の比較演算子が使える– =– <、>、<=、>=– <>– !=

• また、 AND 、 OR 、 NOT 、 IN 、 LIKE 、 EXISTS 、BETWEEN などの演算子も使える– 詳しくは: http://

www.postgresql.jp/document/pg911doc/html/functions.html

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

72

SQL のコツは、細かいことは後にして、、、• SQL は具体例から学ぶのが一番• SQL は簡単なクエリを作り、実行しながらどんどん条件を足していく。例えば

SELECT place FROM 市町村 ; SELECT place FROM 市町村 WHERE id <= 2;SELECT place FROM 市町村 WHERE id <=2 AND place LIKE ‘東 %’;

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

73

SQL のコツは、細かいことは後にして、、、

• LIMIT を使うことで、戻ってくるデータの件数を制限する• クエリを試す際に便利

SELECT place FROM 市町村 LIMIT 10;

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

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

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

75

PostGIS 用のテーブルを作る1. テーブルの作成2. データの挿入3. プライマリキーの設定4. インデックスの作成5. テーブル統計の取得

id place the_geom

1 日光 0101000………

2 今市 0101000………

3 湯元 0101000………

テーブル名:市町村

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

76今日のクエリー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 市町村 ;

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

77テーブルの作成• データを収納する空のテーブルを作成する• テーブル名、列名には日本語も使用可能

– ただし、列名に日本語を使うと、ダブルクオーテーションマークを使う必要があるため、半角英数字を使うほうが便利– 列名には Name, table などの幾つかの予約語があるので使用を避ける

CREATE TABLE テーブル名 (列名 1 データタイプ , 列名 2 データタイプ ,列名 3 データタイプ );

列名 1 列名 2 列名 3

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

78テーブルの作成• PostgreSQL のデータタイプ

データタイプ 説明 例int4 整数 3

float4 浮動小数点数 1.023

varchar() テキスト ‘Tokyo’

geometry ジオメトリー 010200002E6****

date 日付 Wed Dec 17

time 時間 07:37:16 1997 PST

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

79テーブルの作成CREATE TABLE 市町村 (id int4, place varchar (20));

Id place

テーブルを作るコマンドテーブル名

列名とデータタイプ 列名とデータタイプセミコロン

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

80

PostGIS 用のテーブルを作る• 通常のテーブルとの違いは、– ジオメトリ列を含むだけ

• PostGIS テーブル作成の手順1. PostGIS2.X• テーブル作成時にジオメトリー列も作成

– CREATE TABLE• 通常のテーブルにジオメトリー列を追加

– ALTER TABLE *** ADD COLUMN

2. PostGIS1.X• 通常のテーブルを作成した後、ジオメトリー列を入れる命令を実行

– SELECT ADDGEOMETRYCOLUMN

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

81

PostGIS テーブルの作成CREATE TABLE 市町村 (id int4, place varchar (20));

Id place geom

ジオメトリ列名データタイプ

ジオメトリタイプと SRS

CREATE TABLE 市町村 (id int4, place varchar (20), geom geometry(POINT, 4326));

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

82ジオメトリータイプ• POINT

• LINESTRING

• POLYGON

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

83ジオメトリー列の挿入• テーブルの変更( ALTER TABLE )– すでにあるテーブルに列を加えたり、削除したり、列名を変更したり、様々な制限を加えたりする

ALTER TABLE 市町村 ADD COLUMN

geom geometry(Point, 4326);

Id placeテーブル名:市町村

Id place geom

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

84ジオメトリー列の挿入ALTER TABLE 市町村 ADD COLUMN geom geometry (Point, 4326);

テーブル名

ジオメトリー列名空間参照系( EPSG )ジオメトリータイプ

データタイプ

Id placeテーブル名:市町村

Id place geom

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

85ジオメトリー列の挿入ALTER TABLE 市町村 ADD COLUMN geom geometry(Point, 4326);

Id place geom123

Id Schema Table Name Geometry Column

SRID Geometry Type

Dimension

1 Public 市町村 the_geom 4326 POINT 2

ビュー名: geometry_columns

1. 市町村にジオメトリーを保存するための列を挿入2. geometry_columns ビューには自動的にテーブルに関する情報が収められる

テーブル名:市町村

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

86実習3-3:クエリの基本• 日光、今市、湯元の人口を示す以下の「人口」テーブルを作る

– 列名とデータタイプ• Id (int4)• Population (int4)

• 市町村の位置を示す「市町村」テーブルを作る– ジオメトリタイプ: POINT– EPSG : 4326– 列名とデータタイプ

• id (int4)• place (varchar(20))• geom (geometry)

id population

テーブル名:人口

id place geom

テーブル名:市町村

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

87

PostGIS 用のテーブルを作る1. テーブルの作成2. データの挿入3. プライマリキーの設定4. インデックスの作成5. テーブル統計の取得

id place geom

1 日光 0101000………

2 今市 0101000………

3 湯元 0101000………

テーブル名:市町村

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

88データの挿入• 作成したテーブルにデータを挿入するINSERT INTO テーブル名 (列名 1, 列名 2, 列名 3) VALUES (値 1, 値 2, 値

3);

INSERT INTO テーブル名 VALUES (値 1, 値 2, 値 3);

列に左から順番に値を挿入する場合は列名の指定をしなくても良い

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

89ジオメトリを作る• PostGIS ではジオメトリはバイナリで保存されている

SELECT ST_GeomFromText ( 'POINT (139.691701 35.689506)', 4326);

SELECT ST_AsText ( ST_GeomFromText ( 'POINT (139.691701 35.689506)', 4326) );

バイナリをテキスト表示

バイナリのジオメトリーをテキスト表現から作るコマンドジオメトリーをテキストで表現 SRID

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

90ジオメトリーを作るST_GeomFromText ('POINT (139.691701 35.689506)', 4326)

(139.691701 35.689506)

(経度 緯度)スペース!

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

91

データの挿入INSERT INTO 市町村 VALUES (

1, ‘日光 ', ST_GeomFromText ('POINT (139.619492 36.747919)‘, 4326));

Id place the_geom

1 日光 0101000020E6………

テーブル名:市町村

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 the_geom

1 日光 0101000020E6………

2 今市 0101000020E6………

id place geom

1 日光 0101000020E6………

2 今市 0101000020E6………

3 湯元 0101000020E6………

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

92実習3-4:クエリの基本• 人口テーブルにデータを挿入

– 列名• id, population

– データ• 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 place geom

1 日光 0101000………

2 今市 0101000………

3 湯元 0101000………

4 鹿沼 0101000………

id population

1 30000

2 62000

3 1000

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

93

PostGIS 用のテーブルを作る1. テーブルの作成2. データの挿入3. プライマリキーの設定4. インデックスの作成5. テーブル統計の取得

id place geom

1 日光 0101000………

2 今市 0101000………

3 湯元 0101000………

テーブル名:市町村

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

94プライマリーキーの設定• プライマリーキーとは、テーブルの各行を一意に識別するための列。 QGIS でデータを見るために必要。この場合、 Id をキーに設定。

ALTER TABLE 市町村 ADD CONSTRAINT pkey_ 市町村 PRIMARY KEY (id);

id place the_geom

1 日光 0101000020E6………

2 今市 0101000020E6………

3 湯元 0101000020E6………

テーブル名:市町村

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

95プライマリーキーの設定• データ(各行)が一意であることを保障する仕組み

ALTER TABLE 市町村 ADD CONSTRAINT pkey_my_table PRIMARY KEY (Id);

id place the_geom

1 日光 0101000020E6………

2 今市 0101000020E6………

3 湯元 0101000020E6………

プライマリーキーを設定する列名

制限名。この場合プライマリーキー名テーブルに何かしらの規制を加えるためのコマンド

規制がプライマリーキーであることの宣言

テーブル名:市町村

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

96

空間インデックス・テーブル統計の取得• 後ほど。。。

-- プライマリーキーの設定ALTER TABLE 市町村 ADD CONSTRAINT pkey_ 市町村 PRIMARY KEY (id);-- インデックスの作成CREATE INDEX idx_ 市町村 on 市町村 (id);-- 空間インデックスの作成CREATE INDEX gist_ 市町村 on 市町村 USING GIST (the_geom);

-- テーブルに関する情報を収集するVACUUM ANALYZE 市町村 ;

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

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

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

98実習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 市町村 ;

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

99テーブルの結合• 複数のテーブルを共通のキー(列)を使って結合する• SELECT 文で結合したテーブルの中から必要な列だけを選択できる• 結合には様々な種類があるが、等結合( inner

join )と外部結合( left join )が主– Inner join, left (right, full) outer join, cross join などがある– Inner join はテーブル間に共通するキーだけを元にレコードを表示する

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

100等結合id 市町村1 日光2 今市3 鹿沼

id 人口1 10000

2 50000

4 120000

id 市町村 人口1 日光 10000

2 今市 50000

左外部結合id 市町村1 日光2 今市3 鹿沼

id 人口1 10000

2 50000

4 120000

id 市町村 人口1 日光 10000

2 今市 50000

3 鹿沼 NULL

市町村テーブル 人口テーブル

市町村テーブル 人口テーブル

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

101等結合id place

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;

市町村テーブル 人口テーブル

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

102等結合id place

1 日光2 今市3 鹿沼

id population

1 10000

2 50000

4 120000

id place population

1 日光 10000

2 今市 50000

SELECT 市町村 .id, 市町村 .place, 人口 .populationFROM 市町村 , 人口WHERE 市町村 .id = 人口 .id;

SELECT 市町村 .id, 市町村 .place, 人口 .populationFROM 市町村 INNER JOIN 人口ON 市町村 .id = 人口 .id;

市町村テーブル 人口テーブル

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

103左外部結合id place

1 日光2 今市3 鹿沼

id population

1 10000

2 50000

4 120000

id place population

1 日光 10000

2 今市 50000

3 鹿沼 NULL

SELECT 市町村 .id, 市町村 .place, 人口 .populationFROM 市町村 LEFT JOIN 人口ON 市町村 .id = 人口 .id;

市町村テーブル 人口テーブル

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

104実習3-6• テーブル結合に関する以下のクエリを試す

-- テーブルの結合 (Inner Join)SELECT 市町村 .id, 市町村 .place, 人口 .populationFROM 市町村 , 人口WHERE 市町村 .id = 人口 .id;

-- テーブルの結合 (Inner Join)SELECT 市町村 .id, 市町村 .place, 人口 .populationFROM 市町村 INNER JOIN 人口ON 市町村 .id = 人口 .id;

-- テーブルの結合 (Left join)SELECT 市町村 .id, 市町村 .place, 人口 .populationFROM 市町村 LEFT JOIN 人口ON 市町村 .id = 人口 .id;

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

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

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

106ビューの作成CREATE VIEW 市町村別人口 ASSELECT 市町村 .id, 市町村 .place, 市町村 .the_geom, 人口 .populationFROM 市町村 , 人口WHERE 市町村 .id = 人口 .id

• GIS のデータとしてビューを利用する• データを視覚化できる• テーブルの変更を常に反映• サイズが小さい

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

107

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

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

108

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

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

109実習3-7• 市町村テーブルと人口テーブルを結合したビューを作り、ビューを QIGSで見る

CREATE VIEW 市町村別人口 ASSELECT 市町村 .id, 市町村 .place, 市町村 .geom, 人口 .populationFROM 市町村 , 人口WHERE 市町村 .id = 人口 .id;

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

110今日のクエリー2エイリアス-- 年寄りの男女別人口を集落ごとに示し、年寄り率を求め、 GIS レイヤとして使えるようにジオメトリとプライマリキーを入れたビューを作るDROP VIEW IF EXISTS census_stat; -- もしビューがあったら削除するCREATE VIEW census_stat ASSELECT 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 t2WHERE t1.key_code = t2.key_codeAND t2.total != 0ORDER BY t2.f_egt75 DESC;

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

111エイリアス• テーブル名の表記またはクエリを別の短い名前で表す。たとえば、

– SELECT monkey.id, monkey.date FROM monkey;– が– SELECT t1.id, t1.date FROM monkey t1;– と表現できる。

• 複数のテーブルを使ったクエリでは、「テーブル名 .列名」の形式で引っ張ってくる列を指定するので、特にエイリアスの利用が便利になる。• また、クエリの結果返される列名にもエイリアスを使える

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

112今日のクエリー2SQL での演算

-- 年寄りの男女別人口を集落ごとに示し、年寄り率を求め、 GIS レイヤとして使えるようにジオメトリとプライマリキーを入れたビューを作るDROP VIEW IF EXISTS census_stat; -- もしビューがあったら削除するCREATE VIEW census_stat ASSELECT 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 t2WHERE t1.key_code = t2.key_codeAND t2.total != 0ORDER BY t2.f_egt65 DESC;

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

113

SQL での演算• 基本的な算術演算子、+、ー、*、/、が使える– http://www.postgresql.jp/document/9.1/html/

functions-math.html• 文字関数も多数用意されている– http://www.postgresql.jp/document/9.1/html/

functions-string.html

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

114今日のクエリー 2属性情報検索-- 年寄りの男女別人口を集落ごとに示し、年寄り率を求め、 GIS レイヤとして使えるようにジオメトリとプライマリキーを入れたビューを作るDROP VIEW IF EXISTS census_stat; -- もしビューがあったら削除するCREATE VIEW census_stat ASSELECT 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 t2WHERE t1.key_code = t2.key_codeAND t2.total != 0ORDER BY t2.f_egt65 DESC;

2 つのテーブルの等結合総人口が 0 のデータは除く

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

115今日のクエリ2

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

116

DROP TABLE と DROP VIEW

• 作成したテーブルまたはビューを削除する– DROP TABLE テーブル名 ;– DROP VIEW テーブル名 ;

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

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

117今日のクエリー 2属性情報検索-- 年寄りの男女別人口を集落ごとに示し、年寄り率を求め、 GIS レイヤとして使えるようにジオメトリとプライマリキーを入れたビューを作るDROP VIEW IF EXISTS census_stat; -- もしビューがあったら削除するCREATE VIEW census_stat ASSELECT 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 t2WHERE t1.key_code = t2.key_codeAND t2.total != 0ORDER BY t2.f_egt65 DESC;

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

118実習3-8• テーブルの結合

– 国勢調査のテーブル (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

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

119

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

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

120今日のクエリ―3空間情報検索--Ki群の 1996 年 6 月から 9 月の植生タイプの利用を調べるSELECT

COUNT(t1.*),t2.v_name

FROM monkey t1, vegetation t2WHERE ST_INTERSECTS (t1.geom, t2.geom)AND t1.troop = 'KI'AND year = 1996AND month BETWEEN 6 AND 9GROUP BY t2.v_nameORDER BY count;

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

121

PostGIS による空間情報の検索• 空間情報のクエリーには、 SQL 文をベースにジオメトリーと PostGIS のさまざまな機能を使う。• 空間クエリーとは、空間に関した情報の検索で例えば、–サルの植生タイプの利用頻度を調べる–植生タイプはポリゴン、サルの位置は点– 各テーブルは以下のようなフォーマット

ID 日付 the_geom

1 2011/11/1 *******

2 2011/11/6 *******

3 2011/11/20 *******

サルテーブルID 植生タイプ the_geom

1 ミズナラ林 *******

2 スギ林 *******

3 水田 *******

植生テーブル

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

122

PostGIS による空間情報の検索SELECT 植生 .植生タイプ , COUNT(サル .ID) FROM   植生 ,  サル WHERE ST_INTERSECTS (植生 .the_geom, サル .the_geom)GROUP BY 植生 .植生タイプ ;

ID 日付 the_geom

1 2011/11/1 *******

2 2011/11/6 *******

3 2011/11/20 *******

サルテーブル

ID 植生タイプ the_geom

1 ミズナラ林 *******

2 スギ林 *******

3 水田 *******

植生テーブル

植生タイプ COUNT

ミズナラ林 2

スギ林 4

水田 2

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

123今日のクエリー4ジオメトリ操作--河川から一定の距離にある植生の面積を求める-- まず最初に植生図を河川のバッファーで切り抜くDROP TABLE IF EXISTS riparian; -- もしテーブルがあったら削除するCREATE TABLE riparian ASSELECT

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;

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

124

PostGIS によるジオメトリー操作• ジオメトリー操作とは、ジオメトリーに手を加えること。例えば、–二つのポリゴンの交わる面を取り出す– 複雑なポリゴンを単純化する–線にバッファーを発生させる

• PostGIS にはさまざまなジオメトリー操作のための機能がそろっている

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

125

PostGIS によるジオメトリ操作• 河川から200mのバッファを発生させ、植生ポリゴンを切り抜く

ID 県名 the_geom

1 広瀬川 *******

2 名取川 *******

3 北上川 *******

河川テーブル

ID 植生タイプ the_geom

1 ミズナラ林 *******

2 スギ林 *******

3 水田 *******

植生テーブル

ST_Intersection (ST_Buffer ( t1.the_geom, 200 ), t2.the_geom )

ST_Buffer ( t1.the_geom, 200 )

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

126

PostGIS によるジオメトリ操作-- まず最初に植生図を河川のバッファーで切り抜くCREATE TABLE riparian ASSELECT

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);

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

127サブクエリー• クエリーの中で使われるクエリー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);

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

128

PostGIS ファンクション• ST_Intersection (t1.geom, t2.geom)– 2 つのジオメトリの交差を求める

• ST_Union (geom)– ジオメトリを溶融させる

• ST_Buffer (geometry, distance ),– バッファを発生させる

• ST_Intersects (t1.geom, t2.geom)– 2 つのレイヤの地物が重なるかどうか

• ST_Area (geom)– 地物の面積を求める

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

129

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_km2FROM riparian GROUP BY v_name ORDER BY area_km2 DESC;

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

130

SQL :列追加とアップデート• テーブルに新しい列を加える– Alter Table テーブル名 ADD 列名 データタイプ;

• 列に値を入力する– Update テーブル SET 対象列 = 値

--次に新しい列を作って各植生ポリゴンの面積を求めるALTER TABLE riparian ADD area_m2 float4;UPDATE riparian SET area_m2 = ST_Area (geom);

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

131

PostGIS によるジオメトリー操作• 機能の一例

– ST_Buffer• バッファーのジオメトリーを返す

– ST_ConvexHull• 最小凸型多角形のジオメトリーを返す

– ST_Difference• ジオメトリー A のうち、ジオメトリー B と交わらない部分のジオメトリーを返す

– ST_Intersection• ジオメトリー A と B が共有する部分のジオメトリーを返す

– ST_Simplify• Douglas-Peuker アルゴリズムを使ってジオメトリーを単純化する

– ST_Union• ジオメトリーを結合した結果出来上がる点集合のジオメトリーを返す

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

132今日のクエリー4ジオメトリ操作--河川から一定の距離にある植生の面積を求める-- まず最初に植生図を河川のバッファーで切り抜くDROP TABLE IF EXISTS riparian; -- もしテーブルがあったら削除するCREATE TABLE riparian ASSELECT

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;

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

133今日のクエリ4

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

134空間インデックス• 空間インデックスとは、ジオメトリーにつけられるインデックス

で、空間情報の検索を著しく早くすることができる。• PostGIS では、ジオメトリーがバウンディングボックス( BBox )

という箱で各ジオメトリーを囲み、その箱同士の関係でインデックスを作る

• 複雑なジオメトリーでも、箱にすれば2 つの点で表せる• PostGIS の情報検索は実は 2段階で行われる

– バウンディングボックスによる検索– 実際のジオメトリー情報による検索

• インデックスは入れ子になった箱同士の関係を整理したもので、目的の情報にすばやくアクセスすることを可能にする

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

135

PostGIS 用のテーブルを作る1. テーブルの作成2. ジオメトリコラムの挿入3. データの挿入4. プライマリキーの設定5. インデックスの作成6. テーブル統計の取得

id place the_geom

1 日光 0101000………

2 今市 0101000………

3 湯元 0101000………

テーブル名:市町村

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

136空間インデックス

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 が交差していないことから、これらの行動圏が重複していないことがインデックスの検索だけでわかる。

ネズミ A

ネズミ B

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

137空間インデックスの作成

• インデックス名は自分でつける(何でもよい)• Vaccum Analyze は、インデックスを実際にクエリーで使えるようにするために必須

CREATE INDEX [ インデックス名 ] ON [ テーブル名 ] USING GIST ( [ ジオメトリー列名 ] );

Vacuum Analyze   [ テーブル名 ];

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

138そのほかの 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)

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

139実習4• Ki群が 1996 年 6 月から 9 月に利用した植生タイプを求め、その頻度を示す• Ki群の 1996 年 6 月から 9 月の行動圏(最外郭法)を描く

– ST_ConvexHull(geom)– QGIS で行動圏を表示し、確認する

• Ki群の 1996 年 6 月から 9 月の行動圏内の植生割合を求める– ST_Intersection(geom, geom)

• 利用可能な植生(行動圏内)と実際に利用した植生(サルのポイント)を比較する• ボーナス:行動圏内にランダムに100ポイントを発生させ、その植生タイプを求め、サルの実際の利用と比較する

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

140

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

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

141

PostGIS2.0

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

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

142ラスタのインポート• コマンドラインツール、 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 が元のサイズその他多数

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

143ラスタのインポート• 実際のインポートコマンドの例

– 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

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

144ラスタの表示• QGIS の「 Load Postgis Raster to QGIS

0.5.3」をインストール• 「 PostGIS レイヤの追加」であらかじめデータベースへの接続を設定• インストールしたアドインで、表示したいラスタを指定して表示

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

145ラスタの表示

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

146ラスタのデータタイプ• ラスタの代表的データタイプ  raster と

geomval– raster• インポートしたデータ• 複数のバンドを持てる

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

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

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

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

148ポイント上のラスタ値を求める-- 各点の標高を求める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;

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

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