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
1
オープンソースGISを用いた自然環境解析講座2012 年 6 月 24 日講師: 今木洋大
PostGISコース
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」をダブルクリックしてサーバーにアクセス
3.「 template_postgis_20」をクリックしてデータベースにアクセスした後、現れる+マークをクリックしてデータベースを展開
SQL エディターを開く
PostGIS Shapefile and DBF Loader
2.0 を開く
2.「データベース」の+マークをクリックしてデータベースリストを展開
16データベース template_postgis_20 を調べる
サーバ データベース スキーマ Public テーブル Spatial_ref_sys ビュー Geometry_columns
以下の内容が pgAdminⅢ で確認できるか
17テーブルの中身の確認1. 対象テーブルをリストから選択2. 「データをビュー」ボタンをクリック3. テーブルの表示
3
1
2
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 の様々なアドインが用意されている
30
QGIS による PostGIS データの表示(データベースへの新規接続)1
2
3
31
PostGIS につなぐデータベースを選択しテーブルを選択し
加える
QGIS による PostGIS データの表示
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 プラグイン(シェープファイル)
36pgAdminⅢ からシェープファイルローダーを呼び出す
37
Shp2pgsql でシェープファイルをインポート
オ プ シ ョ ンシェープファイルの指定
データベース接続設定
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/
locale.html– http://lets.postgresql.jp/documents/technical/text-
processing/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 データの作り方 テーブルの結合 ビューの作成 実習
46
PostGIS と PostgreSQL について ( PostGIS とは何か)• PostGIS とは、 PostgreSQL データーベースを機能拡張させ、空間情報を扱えるようにした空間データベース• 空間情報の検索、作成、操作ができる• 現在は、ベクターデータのみを扱える–近い将来、ラスターも扱える
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 ) コード• 例えば、
• www.spatialreference.org を利用して、 SRS の検索ができる
参照系名 EPSG コードWGS84 4326
日本測地系 2000: JGD2000 4612
WGS84 / UTM zone 54N 32654
58
SQL 101• Structured Query Language• データの問い合わせに特化した言語• リレーショナルデータベースの操作– データ定義
• CREATE TABLE, DROP TABLE,…– データ操作
• SELECT, DELETE, UPDATE,…– データ制御
• BEGIN,…
• PostGIS は、 SQL を使って空間的な情報の問い合わせを可能にしている
59
SQL 101
• 「市町村」テーブルから、「 place」列にあるデータを返す• SELECT 列名 FROM テーブル名;• 大文字小文字は関係ない• SQL 文の最後にはセミコロンを付ける• すべての列を選択するには、「 *」– SELECT * FROM in_table
SELECT place FROM 市町村 ;
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 文
• 「 census」テーブルから、列「 moji」、「 jinko」を返す
-- 集落の名前とその人口を表示させるSELECT moji, jinko FROM census;
63
ORDER BY [列名 ] DESC (ASC)
• クエリの結果を並び替える• 一つまたは複数の列名を指定する• 昇順( asc )、降順( desc )を指定する• 昇順がデフォルト
-- 集落の名前とその人口を人口の多い順に表示させるSELECT moji, jinko FROM census ORDER BY jinko DESC;
64集約クエリ
• レコードを集約した結果を返す• 合計「 sum」、最大「 max」、最小「 min」、平均「 avg」、サンプル数「 count」
-- 集落名に重複があるので、重複した集落はまとめて人口の多い順に集落名を表示するSELECT moji, SUM (jinko) FROM census GROUP BY moji ORDER BY sum DESC;
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;
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
72
SQL のコツは、細かいことは後にして、、、• SQL は具体例から学ぶのが一番• SQL は簡単なクエリを作り、実行しながらどんどん条件を足していく。例えば
SELECT place FROM 市町村 ; SELECT place FROM 市町村 WHERE id <= 2;SELECT place FROM 市町村 WHERE id <=2 AND place LIKE ‘東 %’;
73
SQL のコツは、細かいことは後にして、、、
• LIMIT を使うことで、戻ってくるデータの件数を制限する• クエリを試す際に便利
SELECT place FROM 市町村 LIMIT 10;
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));
Id place geom
ジオメトリ列名データタイプ
ジオメトリタイプと SRS
CREATE TABLE 市町村 (id int4, place varchar (20), geom geometry(POINT, 4326));
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 geom123
Id Schema Table Name Geometry Column
SRID Geometry Type
Dimension
1 Public 市町村 the_geom 4326 POINT 2
ビュー名: geometry_columns
1. 市町村にジオメトリーを保存するための列を挿入2. geometry_columns ビューには自動的にテーブルに関する情報が収められる
テーブル名:市町村
86実習3-3:クエリの基本• 日光、今市、湯元の人口を示す以下の「人口」テーブルを作る
– 列名とデータタイプ• Id (int4)• Population (int4)
• 市町村の位置を示す「市町村」テーブルを作る– ジオメトリタイプ: POINT– EPSG : 4326– 列名とデータタイプ
• id (int4)• place (varchar(20))• geom (geometry)
id population
テーブル名:人口
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);
SELECT ST_AsText ( ST_GeomFromText ( 'POINT (139.691701 35.689506)', 4326) );
バイナリをテキスト表示
バイナリのジオメトリーをテキスト表現から作るコマンドジオメトリーをテキストで表現 SRID
90ジオメトリーを作るST_GeomFromText ('POINT (139.691701 35.689506)', 4326)
(139.691701 35.689506)
(経度 緯度)スペース!
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………
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
93
PostGIS 用のテーブルを作る1. テーブルの作成2. データの挿入3. プライマリキーの設定4. インデックスの作成5. テーブル統計の取得
id place geom
1 日光 0101000………
2 今市 0101000………
3 湯元 0101000………
テーブル名:市町村
94プライマリーキーの設定• プライマリーキーとは、テーブルの各行を一意に識別するための列。 QGIS でデータを見るために必要。この場合、 Id をキーに設定。
ALTER TABLE 市町村 ADD CONSTRAINT pkey_ 市町村 PRIMARY KEY (id);
id place the_geom
1 日光 0101000020E6………
2 今市 0101000020E6………
3 湯元 0101000020E6………
テーブル名:市町村
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 市町村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
市町村テーブル 人口テーブル
市町村テーブル 人口テーブル
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;
市町村テーブル 人口テーブル
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;
市町村テーブル 人口テーブル
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;
市町村テーブル 人口テーブル
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;
105ビュー• SQL で作ったクエリ自体を保存したもの• ビューを呼び出すごとに SQL 文が実行される• データは含まない• ひとつ以上のテーブルから任意のデータを選択、表示できる• 使いこなせばとても便利
106ビューの作成CREATE VIEW 市町村別人口 ASSELECT 市町村 .id, 市町村 .place, 市町村 .the_geom, 人口 .populationFROM 市町村 , 人口WHERE 市町村 .id = 人口 .id
• GIS のデータとしてビューを利用する• データを視覚化できる• テーブルの変更を常に反映• サイズが小さい
107
QGIS でテーブル及びビューを見る名称: macacaホスト: localhostデータベース: macacaユーザー名: postgresパスワード:各自
108
QGIS でテーブル及びビューを見る
109実習3-7• 市町村テーブルと人口テーブルを結合したビューを作り、ビューを QIGSで見る
CREATE VIEW 市町村別人口 ASSELECT 市町村 .id, 市町村 .place, 市町村 .geom, 人口 .populationFROM 市町村 , 人口WHERE 市町村 .id = 人口 .id;
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;
111エイリアス• テーブル名の表記またはクエリを別の短い名前で表す。たとえば、
– SELECT monkey.id, monkey.date FROM monkey;– が– SELECT t1.id, t1.date FROM monkey t1;– と表現できる。
• 複数のテーブルを使ったクエリでは、「テーブル名 .列名」の形式で引っ張ってくる列を指定するので、特にエイリアスの利用が便利になる。• また、クエリの結果返される列名にもエイリアスを使える
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;
113
SQL での演算• 基本的な算術演算子、+、ー、*、/、が使える– http://www.postgresql.jp/document/9.1/html/
functions-math.html• 文字関数も多数用意されている– http://www.postgresql.jp/document/9.1/html/
functions-string.html
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 のデータは除く
115今日のクエリ2
116
DROP TABLE と DROP VIEW
• 作成したテーブルまたはビューを削除する– DROP TABLE テーブル名 ;– DROP VIEW テーブル名 ;
• もしすでにテーブルがある場合に削除、ない場合にはコマンドを無視– DROP TABLE IF EXISTS テーブル名 ;–色々条件を変えながら行う作業に便利
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;
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 によるジオメトリー操作 より複雑な検索 実習
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;
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 水田 *******
植生テーブル
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
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;
124
PostGIS によるジオメトリー操作• ジオメトリー操作とは、ジオメトリーに手を加えること。例えば、–二つのポリゴンの交わる面を取り出す– 複雑なポリゴンを単純化する–線にバッファーを発生させる
• PostGIS にはさまざまなジオメトリー操作のための機能がそろっている
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 )
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);
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_km2FROM 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• ジオメトリーを結合した結果出来上がる点集合のジオメトリーを返す
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;
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空間インデックス
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
137空間インデックスの作成
• インデックス名は自分でつける(何でもよい)• Vaccum Analyze は、インデックスを実際にクエリーで使えるようにするために必須
CREATE INDEX [ インデックス名 ] ON [ テーブル名 ] USING GIST ( [ ジオメトリー列名 ] );
Vacuum Analyze [ テーブル名 ];
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)
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月に利用した場所の標高、斜面傾斜、斜面方位を求める