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月に利用した場所 の標高、斜面傾斜、斜面方位を求める
© Copyright 2024 ExpyDoc