test.hiroo.webfactional.com

1
オープンソースGISを用いた
自然環境解析講座
PostGISコース
2012年6月24日
講師: 今木洋大
2
自己紹介
• GCNの紹介、スタッフの紹介
• 各自の自己紹介 (参加者全員で)
– 専門、バックグラウンド、何でも
– GISを何に使っているか?
– なぜオープンソースに興味があるか?
– 講習会に期待するもの
3
1.はじめに
(60min)




講義内容・日程について
オープンソース 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)
 ラスタデータの取り扱い
 ラスタ解析の例
 実習
5
オープンソースGISとは何か
• オープンソースソフトウェアーとは、あるライセ
ンス契約の元、ソースコードが公開されてい
るソフトウェアーのことであり、そのライセンス
下ではソフトウェアーの改変とその再配布が
許されている。 (http://opensource.org/, 2007).
6
オープンソースGISとは何か
• ということは、
• オープンソースソフトウェアーは必ずしも無料
ではない
• さまざまなライセンスの種類がある
– GNU GPL、BSD、Apache ライセンスなど
• 改変、再配布においてもオープンソースであ
る必要がある
7
オープンソースGISとは何か
• フリーウェアはフリーソフトと違う
–
–
–
–
GoogleEarth,GoogleMap
Virtual Earth, BingMaps
ArcExplorer
ERDAS VeiwFinder
• フリーソフトとオープンソースは似ている
• そこで、まとめてFOSS4G
– Free and Open Source Software for Geospatial
– 350以上のFOSS4G製品が利用できる(freegis.org)
8
なぜオープンソースGISを使わないか
•
•
•
•
すでに市販製品を使っていて満足している
オープンソースGISを知らない
自分のニーズがよくわからない
いろいろ自分で勉強するのが面倒くさい
9
どっちを使う?
• どうやって仕事を確実にそして早く終わらせら
れるか?
– 自分のGIS使用の目的を明確にする
– 自分のリソースを知る(人的、金銭的)
– 将来のGIS利用のビジョン
10
PostGISの歴史
• 2001年Refractions Research(カナダ)によって開
発開始
• 2005年4月、安定バージョン1.0リリース
• GNU General Public License
• 2012年4月、バージョン2.0リリース
–
–
–
–
–
データベース構成の変更
各種コマンドの強化
ラスターの取り扱い
シェープファイルローダーの改善
新しいインデックスの実装
11
PostGISの良さ
• データベース
– データの安全性
– 大きなデータの取扱
• クエリと多様なファンクションにより細部に渡り、
解析をコントロールしやすい
• クエリを書くことにより質問に集中できる
• SQL自体が履歴ファイル
• 解析の繰り返し、やり直しがやりやすい
• ビューがレイヤとして扱える
• R、Pythonなどと連携しやすい(オープンソース)
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
13
WWW.GeoPacific.org
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ファイルをダブルクリックする
15
PostgreSQL・pgAdmin IIIを開く
1.「PostgreSQL
9.1」をダブルク
リックしてサー
バーにアクセス
2.「データベース」
の+マークをク
リックしてデータ
ベースリストを展
開
3.
「template_postgis_
20」をクリックして
データベースにアク
セスした後、現れる
+マークをクリック
してデータベースを
展開
SQLエディターを
開く
PostGIS Shapefile
and DBF Loader
2.0を開く
データベースtemplate_postgis_20を
調べる
以下の内容がpgAdminⅢで確認できるか
サーバ
データベース
スキーマ
Public
テーブル
Spatial_ref_sys
ビュー
Geometry_columns
16
17
テーブルの中身の確認
1
1. 対象テーブルを
リストから選択
2. 「データを
ビュー」ボタンを
クリック
3. テーブルの表示
2
3
18
SQLエディタとSQLの実行
クエリの実行
1. SQLアイコン
をクリック
2. SQLエディタ
にクエリを書
く
3. 「クエリの実
行」ボタンを
クリック
19
QGIS可動の確認
• postgis_training.
qgsファイルをダ
ブルクリックして
QGISを起動
20
2.PostGISと オープンソースツール
(60min)






PostGIS、PostgreSQLとは
QGISについて
データベースの作成方法
ベクタデータのPostGISへのインポート方法
日本語対応
実習
21
PostGIS、QGIS、、、
数値データの
解析
プログラミング
ベクタデータの
保存、解析
GISデータの変換、
メタデータの閲覧、
視覚化
ラスタデータの
解析
22
PostGISとは?
• 空間情報データベースの一種
– 他にはOracle、MySQL、SQLite、IBM DB2、SQL Server2008、Ingres
等がある
– このうちオープンソースは、 PostgreSQL、MySQL、 SQLite、Ingres
• 空間情報データベースとは?
– リレーショナルデータベース
– ジオメトリー情報を格納
– 空間情報の検索やジオメトリーの操作を可能にした
• PostgreSQLのライブラリ
– PostGISという単独のGISソフトウェアーではない
– PostgreSQLの機能拡張
23
他のGISとどこが違うか?
•
•
•
•
•
SQLで空間情報を解析
オープンソース(GNU General Public License)
無料
ローカル、サーバ両環境
様々なGISのバックエンドとして活躍
• 空間データの視覚化機能がない
– 最新のPostGISではpgAdminⅢからはデータの簡
単な視覚化が可能になっている
24
なぜPostGISを使うか
•
•
•
•
•
GISサーバーとして使える
強力なジオメトリ解析機能+標準のデータベース機能
オープンソースである
大きなデータを扱える
ウェブマッピングなどのバックエンドで使える
– MapServer, GeoServer, GeoDjangoなど
• 安定
• とにかくおもしろい
• などなど
25
いつPostGISを使わないか
• 地図作成
– GRASS、QGIS、MapServer、GeoServer、 市販製品、
• GISデータ入力・編集
– GRASS、QGIS、市販製品、
• GISデータ視覚化
– QGIS、GRASS、UDig、 MapServer、GeoServer、市販製品、
• ラスターデータ解析(まだ開発途上)
– GRASS、GDAL、市販製品、
• データフォーマット変換
– QGIS、GDAL/OGR、
• メタデータ閲覧
– QGIS、GDAL/OGR、
26
PostGISのユーザーインターフェース
• PostGISを使う=SQLを書いて実行する
– GUI管理・開発ツールpgAdminⅢを使う
– コマンドラインのpsqlを使う
– QGISのアドインを使う
27
pgAdminⅢ
• PostgreSQLデータベースの管理、データ検索
などに用いられる、オープンソースプログラム
• データベースの作成、テーブルの管理、クエ
リーの作成などがGUIで行える
28
pgAdmin ⅢとSQLエディタ
29
QGISとは
•
•
•
•
•
•
•
•
•
•
•
オープンソースGIS
データの視覚化、管理、編集、分析、地図の作成など
日本語化されている(OSGeo-Japan)
ユーザーインターフェースが洗練、使い安い
開発速度が速い
多様なラスター、ベクターデータを扱える
アドインを使うことで機能を拡張できる
比較的軽い
PostGISのビュアーとして使える
PostGISのジオメトリを編集できる
PostGISの様々なアドインが用意されている
1
QGISによるPostGISデータの表示
(データベースへの新規接続)
3
2
30
QGISによるPostGISデータの表示
PostGISにつなぐ
データベースを
選択し
テーブルを選択
し
加える
31
32
PostGISを使う準備
• データベースの作成
– template_Postgis_20データベースをテンプレート
とする
• データのインポート
– Shapefileローダーを使ったシェープファイルのイ
ンポート
33
データベースの作成
• pgAdminⅢの起動
• サーバーへアクセス
– サーバーアイコンをダブルクリック
• データベースの新規作成
– サーバーアイコンで右クリックして新規作成
• テンプレート:template_postgis_20
• エンコーディング: utf8
• オーナー:postgres
34
PostGISデータベースの新規作成
テンプレート:
template_postgis_20
35
PostGISへのデータのインポート
• Shp2pgsql (シェープファイル)
– コマンドライン
– GUI
• OGR(OGRでカバーされているファイル形式)
• QGIS・SPITプラグイン(シェープファイル)
pgAdminⅢからシェープファイルローダーを
呼び出す
36
Shp2pgsqlでシェープファイルを
インポート
37
データベース接
続設定
SRS、テーブル
名の指定
シェープファイ
ルの指定
38
PostGIS Shapefile and DBF loader 2.0
• 複数のシェープファイルがインポートしやすく
なった
– 複数のシェープファイルのインポート
– 複数のDBFファイルのインポート
• PostGISデータのシェープファイルとしてのエク
スポートができるようになった
39
PostGIS Shapefile and DBF loader 2.0
PostgreSQL
サーバーへの
接続設定
サーバー接続
のテスト
インポート先の
データベース名
40
PostGIS Shapefile and DBF loader 2.0
シェープファイ
ルの指定
スキーマ名
各項目を編集する場合は、その項目を
ダブルクリック
インポート後の
テーブル名
インポート後の
ジオメトリ列名
EPSGコード
41
PostGIS Shapefile and DBF loader 2.0
インポートするDBFの文字エンコード
列名の大文字、小文字の使用を保存す
るか。ディフォルトでは小文字を使用
Bigintデータタイプを許可するか
空間インデックスを作成するか
DBFのみをインポートするか
ジオメトリをGEGRAPHY列に読み込むか
データインポート挿入ではなくコピーを使
うか
42
pgsql2shpとshp2pgsql
• PostGISデーターをshapefileに変換またはその
逆
• Postgresqlのフォルダない、binフォルダに収
められている
• コマンドラインツール
Pgsql2shp -f shepefile名 -h localhost -u postgres データ
ベース名 テーブル名
43
日本語エンコーディング
• PostgreSQL8.4から、データベースごとにロケール
の設定が可能
– ロケールの設定を「C」に設定するとエンコーディング
の設定に柔軟性が出る
– 日本語のエンコーディングは、UTF8がお勧め
• 詳しくは、
– http://www.postgresql.jp/document/pg833doc/html/l
ocale.html
– http://lets.postgresql.jp/documents/technical/textprocessing/2
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 (テーブル名)
45
3.PostGIS -入門編-
(90min)







PostGISとPostgreSQLについて
pgAdminとSQL
SQL入門
PostGISデータの作り方
テーブルの結合
ビューの作成
実習
PostGISとPostgreSQLについて
(PostGISとは何か)
• PostGISとは、PostgreSQLデーターベースを機
能拡張させ、空間情報を扱えるようにした空
間データベース
• 空間情報の検索、作成、操作ができる
• 現在は、ベクターデータのみを扱える
– 近い将来、ラスターも扱える
46
47
DBMSとSQL
• PostGISを使うには、データベースの基礎知識
が必要となる。
• そのためここでは少し、データベース操作の
基礎となる、データベースマネージメントとSQL
についてpgAdmin III を使って勉強する
48
pgAdmin III
データベースのリスト
データベースの中身
データベースの
構造
49
スキーマ
ファンクション
スキーマが収められ
ている
PostGISのすべての
ファンクションが収
められている
各テーブルのジオメ
ジオメトリーコラム
トリーについての情
テーブル
報が収められる
空間参照系
テーブル
空間参照系(SRS)に
ついての情報が収
められている
ビュー
ビューが収められて
いる
50
データベース用語のまとめ
• データベース
– スキーマ
– データベースの下に作られ
るディレクトリー構造のよう
なもの
• テーブル
– データを収める入れ物
• ビュー
– データ自身ではなく、データ
を検索するクエリーを保存
したもの
51
テーブル
• 実際にデータを
保存
• 行がデータ単位
• 列で属性を示す
52
空間参照系テーブル
• 空間参照系(SRS)の定義に関する情報が収
められている
• 独自のSRSを挿入する事もできる
– spatialreference.orgを利用
53
ビュー
• SQLで作ったクエリ自体を保存したもの
• ビューを呼び出すごとにSQL文が実行される
• データは含まない
• ひとつ以上のテーブルから任意のデータを選
択、表示できる
• 使いこなせばとても便利
54
ジオメトリーコラムビュー
• 各テーブルのジオメトリーに関する情報を収める
ビュー(PostGIS独自のもの)
• PostGIS1.xではテーブルとして扱われていた
• GeoServerなどのアプリケーションはこのビューをメタ
データとして参照する
55
スキーマとは?
1. データベース内に作られるディレクトリーのようなもの
2. スキーマ間の情報検索が可能 (データベース間は
不可能)
3. 例えば、基本的なデータは、 ‘base’というスキーマに
保存し、プロジェクトAに関するデータは、’project_a’
というスキーマに保存する。
4. データのバックアップなど、維持管理が簡単になる。
5. スキーマごとにテーブルへのアクセスの権限設定が
できる
56
データベース用語のまとめ
• データベース
– スキーマ
– データベースの下に作られ
るディレクトリー構造のよう
なもの
• テーブル
– データを収める入れ物
• ビュー
– データ自身ではなく、データ
を検索するクエリーを保存
したもの
57
空間参照ID (SRID)
• 座標参照系(CRS・SRS)が標準化されている
• 代表的なコード系はEPSG (European Petroleum
Survey Group) コード
• 例えば、
参照系名
EPSGコード
WGS84
4326
日本測地系2000:JGD2000
4612
WGS84 / UTM zone 54N
32654
• www.spatialreference.orgを利用して、SRSの検索
ができる
58
SQL 101
• Structured Query Language
• データの問い合わせに特化した言語
• リレーショナルデータベースの操作
– データ定義
• CREATE TABLE, DROP TABLE,…
– データ操作
• SELECT, DELETE, UPDATE,…
– データ制御
• BEGIN,…
• PostGISは、SQLを使って空間的な情報の問い合
わせを可能にしている
59
SQL 101
SELECT place FROM 市町村;
• 「市町村」テーブルから、「place」列にあるデータ
を返す
• SELECT 列名 FROM テーブル名;
• 大文字小文字は関係ない
• SQL文の最後にはセミコロンを付ける
• すべての列を選択するには、「*」
– SELECT * FROM in_table
60
データの検索、SELECT文
• SELECT文を使い、必要な情報を検索する
日光
SELECT place FROM 市町村;
今市
湯元
テーブル名:市町村
Id
place
the_geom
1
日光
0101000020E6………
2
今市
0101000020E6………
3
湯元
0101000020E6………
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;
62
SELECT文
-- 集落の名前とその人口を表示させる
SELECT moji, jinko FROM census;
• 「census」テーブルから、列「moji」、「jinko」を
返す
63
ORDER BY [列名] DESC (ASC)
-- 集落の名前とその人口を人口の多い順に表示させる
SELECT moji, jinko FROM census ORDER BY jinko DESC;
•
•
•
•
クエリの結果を並び替える
一つまたは複数の列名を指定する
昇順(asc)、降順(desc)を指定する
昇順がデフォルト
64
集約クエリ
--集落名に重複があるので、重複した集落はまとめて人口の多い順に集落名
を表示する
SELECT moji, SUM (jinko) FROM census GROUP BY moji
ORDER BY sum DESC;
• レコードを集約した結果を返す
• 合計「sum」、最大「max」、最小「min」、平均
「avg」、サンプル数「count」
65
集約クエリ
--集落名に重複があるので、重複した集落はまとめて人口の多い順に集落名
を表示する
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
日光
30
6
今市
200
moji
SUM
今市
280
日光
180
湯元
30
降
順
66
実際にクエリを書いてみる
• 国勢調査(census)を
使ってクエリを書く練
習をする。
• データベース
「macaca」を開く
• SQLアイコンをクリッ
クしてSQLエディタを
開く
67
pgAdminⅢ SQLエディター
結果のエク
スポート
実行したい
文を選択
クエリの
結果出力
クエリの
実行
クエリの実行に
関するメッセージ
68
結果の出力
• クエリで得られた結果は、pgAdminⅢの「ファ
イル」メニュー、「エクスポート」でテキストファ
イルとして出力できる
69
実習3-1:クエリの基本
• 国勢調査テーブル(census)から
– 集落の名前 (moji) とその人口 (jinko) を表示させる
– 集落の名前(moji)とその人口 (jinko) を人口の多い順
に表示させる
– 集落名(moji)に重複があるので、重複した集落はまと
めて人口(jinko)の多い順に集落名を表示する
– 最も人口の多い集落名(moji)とその人口だけを表示
– 人口の多い順に集落名を表示した結果をテキスト
ファイルとして保存
70
データの検索、WHERE句
• WHERE句で条件を絞り込む
SELECT place FROM 市町村
WHERE id = 1;
テーブル名:市町村
id
place
the_geom
1
日光
0101000020E6………
2
今市
0101000020E6………
3
湯元
0101000020E6………
日光
71
WHERE句では
• 条件の絞り込みには以下の比較演算子が使え
る
–
–
–
–
=
<、>、<=、>=
<>
!=
• また、AND、OR、NOT、IN、LIKE、EXISTS、
BETWEENなどの演算子も使える
– 詳しくは:
http://www.postgresql.jp/document/pg911doc/html/
functions.html
SQLのコツは、
細かいことは後にして、、、
72
• SQLは具体例から学ぶのが一番
• 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を使うことで、戻ってくるデータの件数を
制限する
• クエリを試す際に便利
73
74
実習3-2:クエリの基本
• 国勢調査テーブル(census)から
– 市町村名(gst_name)「今市市」に該当するすべて
の列(データ)を表示
– 市町村名(gst_name)「今市市」に該当するデー
ターが何件あるか調べる
75
PostGIS用のテーブルを作る
1.
2.
3.
4.
5.
テーブルの作成
データの挿入
プライマリキーの設定
インデックスの作成
テーブル統計の取得
テーブル名:市町村
id
place the_geom
1
日光
0101000………
2
今市
0101000………
3
湯元
0101000………
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 市町村;
77
テーブルの作成
• データを収納する空のテーブルを作成する
• テーブル名、列名には日本語も使用可能
– ただし、列名に日本語を使うと、ダブルクオーテーション
マークを使う必要があるため、半角英数字を使うほうが便
利
– 列名にはName, tableなどの幾つかの予約語があるので
使用を避ける
CREATE TABLE テーブル名 (
列名1 データタイプ,
列名2 データタイプ,
列名3 データタイプ);
列名1
列名2
列名3
78
テーブルの作成
• PostgreSQLのデータタイプ
データタイプ
説明
例
int4
整数
3
float4
浮動小数点数
1.023
varchar()
テキスト
‘Tokyo’
geometry
ジオメトリー
010200002E6****
date
日付
Wed Dec 17
time
時間
07:37:16 1997 PST
…
79
テーブルの作成
CREATE TABLE 市町村 (id int4, place varchar (20));
テーブルを作るコマンド
列名とデータタイプ
テーブル名
Id
place
列名とデータタイプ
セミコロン
80
PostGIS用のテーブルを作る
• 通常のテーブルとの違いは、
– ジオメトリ列を含むだけ
• PostGISテーブル作成の手順
1. PostGIS2.X
•
テーブル作成時にジオメトリー列も作成
–
•
CREATE TABLE
通常のテーブルにジオメトリー列を追加
–
ALTER TABLE *** ADD COLUMN
2. PostGIS1.X
•
通常のテーブルを作成した後、ジオメトリー列を入れる命
令を実行
–
SELECT ADDGEOMETRYCOLUMN
81
PostGISテーブルの作成
CREATE TABLE 市町村 (id int4, place varchar (20));
CREATE TABLE 市町村 (id int4, place varchar (20),
geom geometry(POINT, 4326));
ジオメトリ列名
ジオメトリタイプとSRS
データタイプ
Id
place
geom
82
ジオメトリータイプ
• POINT
• LINESTRING
• POLYGON
83
ジオメトリー列の挿入
• テーブルの変更(ALTER TABLE)
– すでにあるテーブルに列を加えたり、削除したり、
列名を変更したり、様々な制限を加えたりする
ALTER TABLE 市町村 ADD COLUMN
geom geometry(Point, 4326);
テーブル名:市町村
Id
place
Id
place
geom
84
ジオメトリー列の挿入
テーブル名
ALTER TABLE 市町村
ADD COLUMN geom geometry (Point, 4326);
空間参照系
データタイプ
ジオメト (EPSG)
ジオメトリー列名
リータイプ
テーブル名:市町村
Id
place
Id
place
geom
85
ジオメトリー列の挿入
ALTER TABLE 市町村 ADD COLUMN geom
geometry(Point, 4326);
テーブル名:市町村
Id
place
1. 市町村にジオメトリーを保存す
るための列を挿入
geom
1
2. geometry_columns ビューには
自動的にテーブルに関する情
報が収められる
2
3
ビュー名:geometry_columns
Id
Schema
Table
Name
Geometry
Column
SRID
Geometry
Type
Dimension
1
Public
市町村
the_geom
4326
POINT
2
86
実習3-3:クエリの基本
• 日光、今市、湯元の人口を示す以下の「人口」テーブ
ルを作る
id
population
– 列名とデータタイプ
• Id (int4)
• Population (int4)
テーブル名:人口
• 市町村の位置を示す「市町村」テーブルを作る
– ジオメトリタイプ:POINT
– EPSG:4326
– 列名とデータタイプ
• id (int4)
• place (varchar(20))
• geom (geometry)
id
テーブル名:市町村
place
geom
87
PostGIS用のテーブルを作る
1.
2.
3.
4.
5.
テーブルの作成
データの挿入
プライマリキーの設定
インデックスの作成
テーブル統計の取得
テーブル名:市町村
id
place geom
1
日光
0101000………
2
今市
0101000………
3
湯元
0101000………
88
データの挿入
• 作成したテーブルにデータを挿入する
INSERT INTO テーブル名 (列名1, 列名2, 列名3) VALUES (値1, 値2, 値3);
列に左から順番に値を挿入する場合は列名の指定をしなくても良い
INSERT INTO テーブル名 VALUES (値1, 値2, 値3);
89
ジオメトリを作る
• PostGISではジオメトリはバイナリで保存され
ている
SELECT ST_GeomFromText ( 'POINT (139.691701 35.689506)', 4326);
バイナリのジオメト
リーをテキスト表現か
ら作るコマンド
ジオメトリーをテキストで表現
SRID
バイナリをテキスト表示
SELECT ST_AsText (
ST_GeomFromText ( 'POINT (139.691701 35.689506)', 4326)
);
90
ジオメトリーを作る
ST_GeomFromText ('POINT (139.691701 35.689506)', 4326)
(139.691701 35.689506)
(経度 緯度)
スペース!
91
データの挿入
INSERT INTO 市町村 VALUES (
INSERT1,INTO 市町村 VALUES (
‘日光',
2,INTO 市町村 VALUES (
INSERT
ST_GeomFromText
('POINT (139.619492 36.747919)‘, 4326)
'今市',
3,
); ST_GeomFromText
('POINT (139.684039 36.726429)', 4326)
'湯元',
); ST_GeomFromText ('POINT (139.424574 36.806853)', 4326)
);
テーブル名:市町村
Id
id
place geom
the_geom
1
日光
0101000020E6………
2
今市
0101000020E6………
3
湯元
0101000020E6………
92
実習3-4:クエリの基本
• 人口テーブルにデータを挿入
– 列名
• id, population
– データ
• 1, 30000
• 2, 62000
• 3, 1000
id
population
1
30000
2
62000
3
1000
id
place
geom
1
日光
0101000………
2
今市
0101000………
3
湯元
0101000………
4
鹿沼
0101000………
• 市町村テーブルにデータを挿入
– 列名
• Id, place, geom
– データ
•
•
•
•
1, 日光, POINT (139.619492
2, 今市, POINT (139.684039
3, 湯元, POINT (139.424574
4, 鹿沼, POINT (139.745013
36.747919)
36.726429)
36.806853)
36.567110)
93
PostGIS用のテーブルを作る
1.
2.
3.
4.
5.
テーブルの作成
データの挿入
プライマリキーの設定
インデックスの作成
テーブル統計の取得
テーブル名:市町村
id
place geom
1
日光
0101000………
2
今市
0101000………
3
湯元
0101000………
94
プライマリーキーの設定
• プライマリーキーとは、テーブルの各行を一
意に識別するための列。QGISでデータを見る
ために必要。この場合、Idをキーに設定。
テーブル名:市町村
id
place
the_geom
1
日光
0101000020E6………
2
今市
0101000020E6………
3
湯元
0101000020E6………
ALTER TABLE 市町村 ADD CONSTRAINT pkey_市町村
PRIMARY KEY (id);
95
プライマリーキーの設定
• データ(各行)が一意であることを保障する仕組み
テーブルに何かしらの規制を加えるためのコマンド
制限名。この場合
プライマリーキー名
ALTER TABLE 市町村 ADD CONSTRAINT pkey_my_table
PRIMARY KEY (Id);
規制がプライマ
リーキーである
ことの宣言
プライマ
リーキー
を設定す
る列名
テーブル名:市町村
id
place
the_geom
1
日光
0101000020E6………
2
今市
0101000020E6………
3
湯元
0101000020E6………
96
空間インデックス・テーブル統計の取得
• 後ほど。。。
-- プライマリーキーの設定
ALTER TABLE 市町村 ADD CONSTRAINT pkey_市町村 PRIMARY KEY (id);
-- インデックスの作成
CREATE INDEX idx_市町村 on 市町村 (id);
-- 空間インデックスの作成
CREATE INDEX gist_市町村 on 市町村 USING GIST (the_geom);
-- テーブルに関する情報を収集する
VACUUM ANALYZE 市町村;
97
実際には、、、
• テーブルをいちから作り上げることは少なく、
既存のデータを使うことが多い
• しかし、どの様にPostGISのデータが保存され
ているのか知ることは重要
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 市町村;
99
テーブルの結合
• 複数のテーブルを共通のキー(列)を使って結合
する
• SELECT文で結合したテーブルの中から必要な列
だけを選択できる
• 結合には様々な種類があるが、等結合(inner
join)と外部結合(left join)が主
– Inner join, left (right, full) outer join, cross joinなどが
ある
– Inner joinはテーブル間に共通するキーだけを元にレ
コードを表示する
100
等結合
id
市町村
id
人口
1
日光
1
10000
2
今市
2
50000
4
120000
3
鹿沼
市町村テーブル
id
市町村
人口
1
日光
10000
2
今市
50000
人口テーブル
左外部結合
id
市町村
id
人口
id
市町村
人口
1
日光
1
10000
1
日光
10000
2
今市
2
50000
2
今市
50000
3
鹿沼
4
120000
3
鹿沼
NULL
市町村テーブル
人口テーブル
101
等結合
id
place
id
population
1
日光
1
10000
2
今市
2
50000
4
120000
3
鹿沼
市町村テーブル
id
place
population
1
日光
10000
2
今市
50000
人口テーブル
SELECT 市町村.id, 市町村.place, 人口.population
FROM 市町村, 人口
WHERE 市町村.id = 人口.id;
102
等結合
id
place
id
population
1
日光
1
10000
2
今市
2
50000
4
120000
3
鹿沼
市町村テーブル
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;
103
左外部結合
id
place
id
population
id
place
population
1
日光
1
10000
1
日光
10000
2
今市
2
50000
2
今市
50000
3
鹿沼
4
120000
3
鹿沼
NULL
市町村テーブル
人口テーブル
SELECT 市町村.id, 市町村.place, 人口.population
FROM 市町村 LEFT JOIN 人口
ON 市町村.id = 人口.id;
104
実習3-6
• テーブル結合に関する以下のクエリを試す
-- テーブルの結合 (Inner Join)
SELECT 市町村.id, 市町村.place, 人口.population
FROM 市町村, 人口
WHERE 市町村.id = 人口.id;
-- テーブルの結合 (Inner Join)
SELECT 市町村.id, 市町村.place, 人口.population
FROM 市町村 INNER JOIN 人口
ON 市町村.id = 人口.id;
-- テーブルの結合 (Left join)
SELECT 市町村.id, 市町村.place, 人口.population
FROM 市町村 LEFT JOIN 人口
ON 市町村.id = 人口.id;
105
ビュー
• SQLで作ったクエリ自体を保存したもの
• ビューを呼び出すごとにSQL文が実行される
• データは含まない
• ひとつ以上のテーブルから任意のデータを選
択、表示できる
• 使いこなせばとても便利
106
ビューの作成
CREATE VIEW 市町村別人口 AS
SELECT 市町村.id, 市町村.place, 市町村.the_geom, 人口.population
FROM 市町村, 人口
WHERE 市町村.id = 人口.id
• GISのデータとしてビューを利用する
• データを視覚化できる
• テーブルの変更を常に反映
• サイズが小さい
107
QGISでテーブル及びビューを見る
名称: macaca
ホスト: localhost
データベース: macaca
ユーザー名:postgres
パスワード:各自
108
QGISでテーブル及びビューを見る
109
実習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;
110
111
エイリアス
• テーブル名の表記またはクエリを別の短い名前で表す。た
とえば、
–
–
–
–
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;
112
113
SQLでの演算
• 基本的な算術演算子、+、ー、*、/、が使
える
– http://www.postgresql.jp/document/9.1/html/fu
nctions-math.html
• 文字関数も多数用意されている
– http://www.postgresql.jp/document/9.1/html/fu
nctions-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,
2つのテーブルの
総人口が0のデータは
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;
114
115
今日のクエリ2
116
DROP TABLE と DROP VIEW
• 作成したテーブルまたはビューを削除する
– 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;
117
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
119
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;
120
121
PostGISによる空間情報の検索
• 空間情報のクエリーには、SQL文をベースに
ジオメトリーとPostGISのさまざまな機能を使う。
• 空間クエリーとは、空間に関した情報の検索
で例えば、
– サルの植生タイプの利用頻度を調べる
– 植生タイプはポリゴン、サルの位置は点
– 各テーブルは以下のようなフォーマット
植生テーブル
サルテーブル
ID
植生タイプ
the_geom
ID
日付
the_geom
1
ミズナラ林
*******
1
2011/11/1
*******
2
スギ林
*******
2
2011/11/6
*******
3
水田
*******
3
2011/11/20
*******
122
PostGISによる空間情報の検索
SELECT 植生.植生タイプ, COUNT(サル.ID)
FROM 植生, サル
WHERE ST_INTERSECTS (植生.the_geom, サル.the_geom)
GROUP BY 植生.植生タイプ;
植生テーブル
ID
植生タイプ
the_geom
1
ミズナラ林
*******
2
スギ林
*******
3
水田
*******
サルテーブル
ID
日付
the_geom
1
2011/11/1
*******
2
2011/11/6
*******
3
2011/11/20
*******
植生タイプ
COUNT
ミズナラ林
2
スギ林
4
水田
2
今日のクエリー4
ジオメトリ操作
--河川から一定の距離にある植生の面積を求める
--まず最初に植生図を河川のバッファーで切り抜く
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;
123
124
PostGISによるジオメトリー操作
• ジオメトリー操作とは、ジオメトリーに手を加え
ること。例えば、
– 二つのポリゴンの交わる面を取り出す
– 複雑なポリゴンを単純化する
– 線にバッファーを発生させる
• PostGISにはさまざまなジオメトリー操作のた
めの機能がそろっている
125
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 )
126
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);
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);
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)
– 地物の面積を求める
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_km2
FROM riparian
GROUP BY v_name ORDER BY area_km2 DESC;
130
SQL:列追加とアップデート
• テーブルに新しい列を加える
– Alter Table テーブル名 ADD 列名 データタイプ;
• 列に値を入力する
– Update テーブル SET 対象列 = 値
--次に新しい列を作って各植生ポリゴンの面積を求める
ALTER TABLE riparian ADD area_m2 float4;
UPDATE riparian
SET area_m2 = ST_Area (geom);
131
PostGISによるジオメトリー操作
• 機能の一例
– ST_Buffer
• バッファーのジオメトリーを返す
– ST_ConvexHull
• 最小凸型多角形のジオメトリーを返す
– ST_Difference
• ジオメトリーAのうち、ジオメトリーBと交わらない部分のジオメトリーを
返す
– ST_Intersection
• ジオメトリーAとBが共有する部分のジオメトリーを返す
– ST_Simplify
• Douglas-Peuker アルゴリズムを使ってジオメトリーを単純化する
– ST_Union
• ジオメトリーを結合した結果出来上がる点集合のジオメトリーを返す
今日のクエリー4
ジオメトリ操作
--河川から一定の距離にある植生の面積を求める
--まず最初に植生図を河川のバッファーで切り抜く
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;
132
133
今日のクエリ4
134
空間インデックス
• 空間インデックスとは、ジオメトリーにつけられるインデックスで、
空間情報の検索を著しく早くすることができる。
• PostGISでは、ジオメトリーがバウンディングボックス(BBox)という
箱で各ジオメトリーを囲み、その箱同士の関係でインデックスを作
る
• 複雑なジオメトリーでも、箱にすれば2つの点で表せる
• PostGISの情報検索は実は2段階で行われる
– バウンディングボックスによる検索
– 実際のジオメトリー情報による検索
• インデックスは入れ子になった箱同士の関係を整理したもので、
目的の情報にすばやくアクセスすることを可能にする
135
PostGIS用のテーブルを作る
1.
2.
3.
4.
5.
6.
テーブルの作成
ジオメトリコラムの挿入
データの挿入
プライマリキーの設定
インデックスの作成
テーブル統計の取得
テーブル名:市町村
id
place the_geom
1
日光
0101000………
2
今市
0101000………
3
湯元
0101000………
136
空間インデックス
ネズミ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
が交差していないことから、これら
の行動圏が重複していないことが
インデックスの検索だけでわかる。
137
空間インデックスの作成
CREATE INDEX [インデックス名]
ON
[テーブル名]
USING GIST ( [ジオメトリー列名] );
Vacuum Analyze [テーブル名];
• インデックス名は自分でつける(何でもよい)
• Vaccum Analyzeは、インデックスを実際にクエ
リーで使えるようにするために必須
138
そのほかの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)
139
実習4
• Ki群が1996年6月から9月に利用した植生タイプを求め、そ
の頻度を示す
• Ki群の1996年6月から9月の行動圏(最外郭法)を描く
– ST_ConvexHull(geom)
– QGISで行動圏を表示し、確認する
• Ki群の1996年6月から9月の行動圏内の植生割合を求め
る
– ST_Intersection(geom, geom)
• 利用可能な植生(行動圏内)と実際に利用した植生(サル
のポイント)を比較する
• ボーナス:行動圏内にランダムに100ポイントを発生させ、
その植生タイプを求め、サルの実際の利用と比較する
140
5.PostGISによるラスタ解析
(30min)
 ラスタデータの取り扱い
 ラスタ解析の例
 実習
141
PostGIS2.0
• 正式にラスタデータが取り扱える
• ラスタを取り込むraster2pgsql.exeを利用
• QGISのPostGIS Rasterアドインを使ってラス
ター表示
• 機能はまだ限定的
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が元のサイズ
その他多数
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
144
ラスタの表示
• QGISの「Load Postgis Raster to QGIS 0.5.3」を
インストール
• 「PostGISレイヤの追加」であらかじめデータ
ベースへの接続を設定
• インストールしたアドインで、表示したいラスタ
を指定して表示
ラスタの表示
145
146
ラスタのデータタイプ
• ラスタの代表的データタイプ rasterとgeomval
– raster
• インポートしたデータ
• 複数のバンドを持てる
– geomval
• geomとvalの2つのフィールドから成るラスタデータタイ
プ
• geom: ジオメトリーオブジェクトを収納
• val: 倍精度浮動小数点数でピクセル値を収納
• ベクタデータとのインタラクションに使われる
147
ラスタの機能
•
•
•
•
•
•
•
•
•
ST_Clip()
ST_Aspect(), ST_Slope(), ST_Hillshade()
ST_Intersection()
ST_MapAlgebraExpr()
ST_Polygon()
ST_Reclass()
ST_Union()
ST_Interesects()
… その他多数
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;
149
実習5
• raster2pgsqlを使って、標高、傾斜、方位ラス
タをインポート
• QGISで読み込んだラスタを表示
• Ki群が1996年6月から9月に利用した場所
の標高、斜面傾斜、斜面方位を求める