postgis handson | foss4g tokyo 2014
Post on 07-Jul-2015
859 Views
Preview:
TRANSCRIPT
PostGIS入門-空間情報データベースを作ってみよう -
FOSS4G 2014 Tokyo
• 代表的な空間情報DBMSであるPostGISを使用して、構築と解析の初歩までを学びます。
• 本セッションはDBMS、GISについての基礎知識を必要とします。(質問は随時どうぞ!)
• PDF資料からコードをコピー&ペーストすると正しく動作しないことがあります。適宜タイプしなおしてください。
• 本資料はクリエイティブ・コモンズ表示-継承3.0非移植ライセンスの下に提供されています。商用利用、改変もOKですが、頒布するには原著作者クレジット(FOSS4G Tokyo)を表示し、本資料と同一の許諾条件としてください。
• 本ハンズオンは事前に以下の準備を行ってください
• PostgreSQL & PostGISのインストール
• QGISのインストール
はじめに
FOSS4G 2014 Tokyo PostGIS入門 2
• フォルダ:docs
• PostGIS入門.pdf (本文書)
• PostGIS 2.2.0devマニュアル日本語訳.pdf
• PostgreSQL&PostGISのインストール.pdf (事前準備マニュアル)
• フォルダ:data
• N03-130401_01_GML.zip : 国土数値情報 - 行政区域(H26) - 千葉県
• P02-06_12_GML.zip : 国土数値情報 - 公共施設(H18) - 千葉県
• N01-07L-12-01.0a_GML.zip : 国土数値情報 - 道路(統一フォーマット H7) - 千葉県
• chiba-hinan.csv :千葉市のオープンデータ「避難場所・避難所・広域避難場所・津波避難ビル一覧」CSVhttp://www.city.chiba.jp/somu/kikikanri/hinanbasyoichiran.htmlの座標を投影変換したCSV
• command.txt : この資料のSQL、コマンドを記載
• フォルダ:shapefiles
• 前記zipを展開したデータ
配布データについて
FOSS4G 2014 Tokyo PostGIS入門 3
Slideshareでご覧の方は各サイトからダウンロードしてください
PostGIS概説・・・PostGISについての説明、導入するメリットなど
PostGISの準備・・・実際に使い始めるまでの説明
テーブルと図形の作成・・・基礎的なジオメトリ(図形)の作成と表示
データのインポート/エクスポート・・・CSV、Shapefileなどから大量にデータをインポート、DBから外部形式にエクスポート
検索する・・・条件指定(Where)の説明、空間インデックスの説明
加工する・・・図形の合成、切り出しをSQLで実行する
本セッションの内容
FOSS4G 2014 Tokyo PostGIS入門 4
PostGIS概説
FOSS4G 2014 Tokyo PostGIS入門 5
PostGISとは?
オープンソースのDBMSであるPostgreSQLで地理空間情報を扱うための拡張機能(PostgreSQLExtension)。
Refractions Research社によりGPLライセンスでリリースされている。
地理空間情報の管理、編集、検索、演算をSQLで行うことができる。
PHP、Java、PythonなどDBへのインターフェイスを持つ言語からも特別な拡張無しに利用できる。
今ではMapServer、GeoServer、QGIS、GRASSなどのOSS GISツールの他、ArcGIS、SISなどの商用GISのバックエンドとしても利用できる。
2012年の1.5から2.0へのバージョンアップでは、モジュールからエクステンションに変更(PostgreSQL9.1以降が対応)、地理データ列の定義方法変更、非推奨関数の多数削除など大きな変更が加えられた。
PostGISとは
FOSS4G 2014 Tokyo PostGIS入門 6
PostGISについて学ぶにはここをチェック
• PostGISオフィシャルサイト(Refractions Research)
• http://www.refractions.net/products/postgis/
• PostGISマニュアル日本語訳(農研機構)
• http://www.finds.jp/docs/pgisman/
• PostgreSQLオフィシャルサイト
• http://www.postgresql.org/
• 日本PostgreSQLユーザ会
• https://www.postgresql.jp/
• Linuxのパッケージは http://postgis.net/install/ を参照(標準パッケージは古いことが多々あるようです)
• WindowsはOSGeo4W(http://trac.osgeo.org/osgeo4w/)でGDAL/OGRも使えるようにすると便利
PostGISについて学ぶ
FOSS4G 2014 Tokyo PostGIS入門 7
主なDBMSのGIS拡張
PostGIS
PostgreSQL標準の幾何データ対応
SpatiaLite(スペイシャライト、ファイルDBであるSQLiteの拡張)
MySQL(5.6) OpenGIS対応
Oracle Spatial(スペイシャル)
SQL Server Spatialサポート
ArcGIS ジオデータベース
主なGISファイル形式
ESRI Shapefile(デファクトスタンダード)
MapInfo(TAB、MIF/MID)
GeoJSON(JavaScriptのオブジェクト配列)
GML、KML(XMLの拡張)
DBMSとGIS
FOSS4G 2014 Tokyo PostGIS入門 8
PostGIS(PostgreSQL)のメリット
• オープンソース(GPL)
• 標準規格への対応(OpenGIS Consortium、標準SQL)
• マルチプラットフォーム
• ネットワーク共有が簡単便利(TCP/IP、トランザクショナル)
• 豊富な連携ソフトウェア(GDAL/OGRなど)
• 情報・知見が得やすい
• 拡張性、可用性、保守性に優れる
☆つまり使いやすい
PostGIS(PostgreSQL)のデメリット
• ファイルベースのデータは手軽(インストール、運用、データコピーetc)
• サーバに負荷がかかり易い
PostGIS(GIS DB)を使うべき理由
FOSS4G 2014 Tokyo PostGIS入門 9
スタンダードフォーマットであるShapefileとの比較
Shapefileとの比較
FOSS4G 2014 Tokyo PostGIS入門 10
PostGIS Shapefile
サイズ制限 十分に大きい .shp(形状)と.dbf(属性)は2GBまで
座標点数制限 十分に大きい 7,000万ポイントが目安(2GB)
フィールド名制限 63バイト 10バイト
フィールド数制限 十分に大きい 255
文字列属性 TEXT、VARCHAR2など 固定長のみ(無駄が多い)
文字コード(日本語) 内部はUTF-8、EUC_JP
Shift-JIS(cp932)はクライアントのみ
Shift-JISが推奨、UTF-8のサポートが拡がるが...※本来はANSI
空間インデックス サポート(汎用検索ツリー) サポート(性能は良くないとされる、アプリ毎に異なるファイル)
共有アクセス 同テーブルへの読み書き可能トランザクション、ロックが可能
高度で安全な共有は期待出来ない
図形タイプ(ジオメトリタイプ)
(シングル・シンプル)ポイント、ライン、ポリゴン
マルチポイント、マルチライン、マルチポリゴン
ジオメトリコレクション、TIN、多面体サーフェイス
空間参照系(SRID)
座標系、測地系、投影法、ジオイドなどの定義
SRIDはQGISなどと共通
spatial_ref_sysテーブルに格納されている
WKT(Well-Known Text)形式
ベクタ図形情報をテキスト形式で表現するフォーマット
OpenGIS Consortium(OGC)による標準定義
DB(ジオメトリ)にはバイナリ形式(WKB)で格納されている
PostGISで使われる用語
FOSS4G 2014 Tokyo PostGIS入門 11
PostGISの準備
FOSS4G 2014 Tokyo PostGIS入門 12
PostgreSQL/PostGISのインストール
Windowsは下記ページを参照してくださいhttp://www.slideshare.net/hideo0515harada/postgresqlpostgis
Linux(*NIX)はパッケージシステム使用を推奨します。(GDAL,GEOSなどの依存関係解決のため)
PostgreSQL/PostGISのインストール
FOSS4G 2014 Tokyo PostGIS入門 13
作業用ログインロール(ユーザ)を追加します
今回は説明の都合上、セキュリティ甘めの設定なことをご了承ください
1. pgAdminⅢを起動(インストール資料のp17を参照)
2. 「ログインロール」を右クリック、「新しいログインロール」を選択
3. 名前とパスワードを入力。今回はdemoを作成(スーパーユーザー特権と、データベース作成特権を与える)
4. pgAdminⅢで「データベース」を右クリック、「新しいデータベース」を選択
5. 名前はhandson、オーナーはdemo、他はデフォルトのまま注)運用では他の設定を変更しても構いません
6. pgAdminⅢの接続を切断し(Dissconnet server)、サーバ(localhost)を右クリックし、「プロパティ」を選択
7. 「DBメンテナンス」をhandson、「ユーザ名」をdemoに変更
ログインロール(ユーザ)を追加
FOSS4G 2014 Tokyo PostGIS入門 14
作業用ログインロール(ユーザ)の追加
ログインロール(ユーザ)を追加
FOSS4G 2014 Tokyo PostGIS入門 15
ロール名:demo
・スーパーユーザ・Can create database(データベース作成権限)
データベースを作成(createdb)
データベース作成
FOSS4G 2014 Tokyo PostGIS入門 16
demo CREATE DATABASEWITH ENCODING=‘UTF8’OWNER=demoCONNECTION LIMIT=-1;
handson
接続するユーザとデータベースを変更
接続先の変更
FOSS4G 2014 Tokyo PostGIS入門 17
DBメンテナンス:handsonユーザ名:demo
作成したデータベースにPostGISエクステンションを追加します
1. 作成したデータベース(handson)の「Extensions」を右クリック、「New Extension」を選択
2. 「名前」からpostgisを選択(もし見つからなければPostGISを再インストール)
3. データベースの「スキーマ」- publicで関数、テーブル、トリガ、ビューが追加されていることを確認
4. テーブルspatial_ref_sysの内容を確認
PostGISエクステンションはデータベース毎に追加します
PostGISエクステンションのインストール
FOSS4G 2014 Tokyo PostGIS入門 18
データベース
PL/pgSQL
PostGIS
ロール(ユーザ) ロール(ユーザ)
データベース
PL/pgSQL
PostgreSQLの概念図
PostgreSQLサービス
PostGISエクステンションを追加(create extension)
PostGISエクステンションのインストール
FOSS4G 2014 Tokyo PostGIS入門 19
postgis
CREATE EXTENSIONpostgis
st_XXX関数が大量にできる
spatial_ref_sysテーブルをデータビューで確認
テーブルと図形の作成
FOSS4G 2014 Tokyo PostGIS入門 20
ここからはSQL文をタイプ&実行して進めます
ツールバーの「任意のSQLクエリーを実行」をクリックします
SQLの入力
FOSS4G 2014 Tokyo PostGIS入門 21
handsonのdemo@localhost:5432
主キー(serial)idを持つポイントのテーブルを作成します
「ジオメトリ型」を使用し、図形タイプと空間参照系を指定する
ラインは(MULTI)LINESTRING、ポリゴンは(MULTI)POLYGON
このテーブルの空間参照系はJGD2000緯度経度(SRID:4612)
ジオメトリ(座標)の列名はgeomにするのが一般的
テーブルの作成
FOSS4G 2014 Tokyo PostGIS入門 22
CREATE TABLE sample_point (id SERIAL PRIMARY KEY,geom GEOMETRY (POINT, 4612)
);
ちなみにPostGIS 1.xでは...
AddGeometryCoumn関数は後方互換のため残されている
ツールによっては、まだこちらが使われている
ツールが古いなどの理由で互換性が必要な場合、PostGISに同梱されているlegacy.sqlを実行する。
テーブルの作成(PostGIS 1.x)
FOSS4G 2014 Tokyo PostGIS入門 23
CREATE TABLE sample_point (id SERIAL PRIMARY KEY
);
SELECT AddGeometryColumn ('sample_point', 'the_geom', 4612, 'POINT', 2);
よく使われる空間参照系のSRID一覧
よく使われるSRID一覧
FOSS4G 2014 Tokyo PostGIS入門 24
測地系 座標系 SRID
日本測地系
緯度経度 4301
UTM座標系 51N - 55N 102151 - 102156
平面直角座標系 1 - 19系 30161 - 30179
世界測地系JGD2000
緯度経度 4612
UTM座標系 51N - 55N 3097 - 3101
平面直角座標系 1 - 19系 2443 - 2461
WGS84 緯度経度 4326
Google 球体メルカトル(m) 9009133857 (EPSG)
INSERT文で図形を作成してみます
• 文字列 'POINT(141.347 43.071)' がWKT
• 対になっているXとYはスペースで区切る
• [geom]の出力はバイナリ形式(普通の人には読めない)
• ST_asText関数により読みやすい形式にする
図形の作成
FOSS4G 2014 Tokyo PostGIS入門 25
INSERT INTO sample_point (geom) VALUES (ST_GeomFromText('POINT(141.347 43.071)', 4612)
);
SELECT geom FROM sample_point;SELECT ST_asText(geom) FROM sample_point;
空間参照系を指定するテキストをジオメトリ型に変換
ラインジオメトリを持つテーブルを作成します
図形の作成
FOSS4G 2014 Tokyo PostGIS入門 26
CREATE TABLE sample_line (id SERIAL PRIMARY KEY,geom GEOMETRY (LINESTRING, 4612)
);
INSERT INTO sample_line (geom) VALUES (ST_GeomFromText('LINESTRING(141.347 43.071, 141.349 43.075,141.342 43.075,141.345 43.071
)', 4612)); 頂点の区切りはカンマ(,)
ポリゴンジオメトリを持つテーブルを作成、図形を作成します
図形の作成
FOSS4G 2014 Tokyo PostGIS入門 27
INSERT INTO sample_polygon (geom) VALUES (ST_GeomFromText('POLYGON((141.347 43.071, 141.349 43.075, 141.342 43.075, 141.345 43.071,141.347 43.071
))', 4612)
);
始点終点は一致させる(閉じる)
CREATE TABLE sample_polygon (id SERIAL PRIMARY KEY,geom GEOMETRY (POLYGON, 4612)
);
INSERT INTO sample_polygon (geom) VALUES (ST_GeomFromText('POLYGON((141.353 43.072, 141.345 43.070, 141.351 43.076,141.353 43.072),(141.351 43.072, 141.351 43.073, 141.350 43.073, 141.351 43.072)
)', 4612));
穴あきポリゴン
ポリゴンは()が増える
右回り・左回りどちらでもよい
ジオメトリ出力関数で図形を確認してみます
図形を確認する(ジオメトリ出力)
FOSS4G 2014 Tokyo PostGIS入門 28
SELECT id, ST_asText(geom) FROM sample_polygon;→ 1, POLYGON((141.347 43.071,141.349 43.075, ...))→ 2, POLYGON((141.347 43.071,...),(141.347 43.072,...))
SELECT ST_asKML(geom) FROM sample_line;→ <LineString><coordinates>141.347,... </coordinates></LineString>
WKT表現(ポピュラー)
KML、GeoJSON表現(ジオアプリ向け)
SELECT ST_asGeoJSON(geom) FROM sample_line;→"{"type":"LineString","coordinates":[141.347,43.071], ...[141.345,43.071]]}
KML、GeoJSONとも属性値は含められないのでogr2ogrや自作プログラムで対処する
ジオメトリアクセサ関数で図形の構成を確認します
図形を確認する(ジオメトリアクセサ)
FOSS4G 2014 Tokyo PostGIS入門 29
SELECT ST_X(geom), ST_Y(geom), ST_SRID(geom) FROM sample_point;→ 141.347, 43.071, 4612
座標を取り出す
SELECT ST_asText(ST_PointN(geom, 3)) FROM sample_line;→ POINT(141.342 43.075)
N番目の図形を取り出す
SELECT ST_NRings(geom), ST_X(ST_StartPoint(ST_ExteriorRing (geom))) FROM sample_polygon;
→1, 141.347→2, 141.347
ポリゴンは少し複雑です
始点:1から始まる
外環(LINESTRING)始点(Start Point)
テキスト情報だけでは良く判らないので図化します
PostGISだけでは「絵」が作れないので他のソフトを使用します
今回はQGISを利用します
1. QGIS(Desktop)を起動する
2. 「レイヤ」-「PostGISレイヤの追加」を選択する
3. 新規の接続先を作成する
1. 名称:適当
2. ホスト:localhost
3. データベース:handson
4. ユーザ名:demo
5. 接続テストして成功ならOK
4. 戻って「接続」し、テーブルを選んで「追加」する
図化する(QGIS)
FOSS4G 2014 Tokyo PostGIS入門 30
画面はQGIS 2.4です
QGISで接続、表示する
FOSS4G 2014 Tokyo PostGIS入門 31
PostGISレイヤの追加
接続情報は前ページを参照
接続テストしてみる
名前の一覧
接続→テーブル一覧表示→選択して追加
データのインポート/エクスポート
FOSS4G 2014 Tokyo PostGIS入門 32
• デファクトスタンダードであるShapefileをインポート&エクスポートします
• 今回はPostGIS付属のshp2pgsql/pgsql2shpを使用します
• WindowsではスタートメニューのPostGIS - PostGIS 2.0 Shapefile and DBF Loader ExporterでGUIが起動できます
• CUIで使いたいときはインストールフォルダのbinにあるshp2pgsql.exe、pgsql2shp.exeを使用します
• GUIはちょっと使いにくいかも(^_^;
• ↑GUIがかなり使いにくくなってるのでCUI(コマンドプロンプト)で作業します・・・
データをインポート・エクスポート(Shapefile)
FOSS4G 2014 Tokyo PostGIS入門 33
1. コマンドプロンプトを起動し、PostgreSQLのインストールフォルダ(C:\Program Files\PostgreSQL\9.3)にあるpg_env.batを実行(binフォルダのプログラムが実行出来るようになる)
2. shp2pgsql とタイプして実行出来ることを確認
3. Shapefileのあるフォルダに移動(cd)
4. Prepareモードで実行してテーブル定義作成確認
5. Createモード(デフォルト)で実行してSQLを作成shp2pgsqlはDBにアクセスしない
6. SQLを実行してDBにデータを投入
shp2pgsqlの使い方(コマンドプロンプト)
FOSS4G 2014 Tokyo PostGIS入門 34
ファイル・フォルダの指定はエクスプローラからコマンドプロンプトにドラッグドロップすると便利です
内容 Shapefile名 テーブル名
行政区域(Polygon) N03-14_12_140401 polygon_adm
公共施設(Point) P02-06_12-g_PublicFacility point_public
道路(Line) N01-07L-2K-12_Road line_road
1. "C:\Program Files\PostgreSQL\9.3\pg_env.bat" (を実行)
2. shp2pgsql
3. cd <配布のShapefilesフォルダ>
4. shp2pgsql -p -I -S -s 4612 -W cp932 N03-14_12_140401 polygon_adm
-p Prepareモード
-I 空間インデックス作成
-S シンプルジオメトリで定義(デフォルトはマルチジオメトリ)
-s SRID ShapefileのSRID指定
-W encoding Shapefileの文字コード(通常のShapefileはcp932 or UTF-8)
5.shp2pgsql -c -D -I -S -s 4612 -W cp932 N03-14_12_140401 polygon_adm > polygon_adm.sql
-c Createモード(デフォルト)
-D データはダンプ形式(指定しないとINSERT文になるので遅い)
6. psql -U demo -d handson -f polygon_adm.sql
施設と道路データもインポートする
7. shp2pgsql -c -D -I -S -s 4612 -W cp932 P02-06_12-g_PublicFacility point_public | psql -U demo -d handson
8. shp2pgsql -c -D -I -S -s 4612 -W cp932 N01-07L-2K-12_Road line_road | psql -U demo -d handson
•-p,-cの代わりに-aで追記モードになります。同じテーブルに異なるファイルの内容を次々に入力したい場合に便利です。
•Linux(OSGeo4W)も全く同じ使用方法です
shp2pgsqlの使い方(コマンドプロンプト)
FOSS4G 2014 Tokyo PostGIS入門 35
ファイル名を指定.shpは省略しても良い
テーブル名
インデックスについては後ほど
文字コード変換(SJIS→UTF8)
パイプラインで渡しても良い
shp2pgsqlの使い方(コマンドプロンプト)
FOSS4G 2014 Tokyo PostGIS入門 36
D&D
shp2pgsql -c ...
ファイルにリダイレクト(パイプでもOK)
shp2pgsql
shp2pgsql -p ...
テーブル名にハイフンは避けたい
• PostGISからShapefileをエクスポートするには pgsql2shp が良く使われます
• テーブルまたはビューを指定、あるいはSQLクエリ()が利用できます
• 文字コードはクライアントのエンコーディングに依存します(注意が必要)
• テーブル/ビューをエクスポート
1. SET PGCLIENTENCODING=SJIS
2. pgsql2shp -u demo handson point_public
• SQLクエリを利用
• pgsql2shp -u demo -f choshi_adm handson"select * from polygon_adm where n03_007 = '12202'"
pgsql2shpの使い方(エクスポート)
FOSS4G 2014 Tokyo PostGIS入門 37
SETしないエクスポートも試してみましょう
データベースとテーブル名を指定
ファイル名を指定
銚子市の行政コードデSQLクエリを記述
XYデータをインポート(変換)
• CSVなどをPostgreSQLにインポートしてからジオメトリを作成してみます
• 今回は千葉市の避難所データを加工したCSVを使用します
• 文字コードはUTF-8
• 平面直角9系(JGD2000)に投影変換
1. ジオメトリを持たないテーブルを作成(SQL)
2. CSVをインポート(コマンドプロンプト)1. SET PGCLIENTENCODING=UTF82. psql -U demo -d handson -c "COPY hinan_point FROM STDIN CSV HEADER" < chiba-hinan.csv
データをインポート
FOSS4G 2014 Tokyo PostGIS入門 38
CREATE TABLE hinan_point (id integer PRIMARY KEY,cls text, pname text, address text, x numeric, y numeric
);
平面直角9系(JGD2000)X:東西、Y:南北
標準入力を使用する
XY列をポイントジオメトリに変換、更に緯度経度に変換します
1. 数値をポイントジオメトリに変換し、空間参照系を付与する
2. JGD2000緯度経度に投影変換する
3. 今のテーブルにジオメトリを追加する
4. ジオメトリ属性をアップデートする
5. QGISで確認する
XYからジオメトリ(投影変換)
FOSS4G 2014 Tokyo PostGIS入門 39
SELECT ST_asEWKT(ST_setSRID(ST_MakePoint(x, y), 2446)) FROM hinan_point;
平面直角(9)空間参照系の付与
SELECT ST_asEWKT(ST_Transform(ST_setSRID(ST_MakePoint(x, y), 2446), 4612))FROM hinan_point;
緯度経度座標変換(投影変換)
ALTER TABLE hinan_point ADD geom GEOMETRY(POINT, 4612);
UPDATE hinan_pointSET geom = ST_Transform(ST_setSRID(ST_MakePoint(x, y), 2446), 4612);
add しただけなのでgeomはNULL
• ST_setSRID()は空間参照系のメタ情報を付与するだけ。投影変換(座標変換)はされません
• ジオメトリ型にINSERT/UPDATEするときは自動的に投影変換されない
• 別の空間参照系に変換するにはST_Transform()を使う
• 平面直角座標系もPostGISではPOINT(東西(X) 南北(Y))。生データを扱うときは気をつけましょう
• GPSログをラインにしたいときは・・・
変換のポイント
FOSS4G 2014 Tokyo PostGIS入門 40
SELECTgps_track, ST_MakeLine(gps.geom ORDER BY gps_time) geom
FROM gps_pointsGROUP BY gps_track;
検索する
FOSS4G 2014 Tokyo PostGIS入門 41
前セクションでインポートした国土数値情報の簡単な説明
テーブル定義
FOSS4G 2014 Tokyo PostGIS入門 42
行政区域
n03_001 都道府県名
n03_002 支庁名(市はNULL)
n03_003 郡・政令市名
n03_004 市区町村名
n03_007 行政区域コード(5桁)
公共施設
p02_001 行政区域コード
p02_002 公共施設大分類
p02_003 公共施設小分類
p02_004 名称
p02_005 所在地
P02_006 管理者コード
p02_007 原典資料名
道路
n01_001 道路種別コード
n01_002 路線名
n01_003 線名
n01_004 通称
PostGISを利用することにより、データベースで行える通常の属性検索に加えて、豊富な空間検索が利用できます。
• 属性により千葉市の各区を検索し、面積を計算する
• 千葉市内の郵便局を区毎に数える(図形的に)
PostGISの検索機能
FOSS4G 2014 Tokyo PostGIS入門 43
SELECT n03_003, n03_004, n03_007, ST_Area(ST_Transform(geom, 2446)),ST_Area(ST_Transform(geom, 32654))FROM polygon_admWHERE n03_003 = '千葉市';
2446:平面直角(9)32654:UTM54
SELECTn03_004,count(*)FROM polygon_adm a, point_public pWHERE n03_003 = '千葉市'AND st_contains(a.geom, p.geom)AND p.p02_002 = '18'
GROUP BY n03_004
郵便局:p02_002 = '18'
st_contains(a, b)aがbを完全に含むならTRUE
空間インデックスの有無による検索速度を体験してみます
1. ○○市にある福祉施設をカウント
2. 空間インデックスを削除
3. ふたたび1.で検索すると遅くなっているはず
4. 空間インデックスを再作成
5. ふたたび1.で検索する
6. 1.のSELECTの前にEXPLAIN句をつけて、2.~5.を実行してみる
空間インデックスの効果を体験する
FOSS4G 2014 Tokyo PostGIS入門 44
SELECT count(*)FROM polygon_adm a, point_public pWHERE n03_004 like '%市' AND st_contains(a.geom, p.geom) AND p.p02_002 = '19'
DROP INDEX point_public_geom_gist;DROP INDEX polygon_adm_geom_gist;
CREATE INDEX point_public_geom_gist ON point_public USING GiST (geom);CREATE INDEX polygon_adm_geom_gist ON polygon_adm USING GiST (geom);
EXPLAIN SELECT count(*)FROM polygon_adm a, point_public pWHERE n03_004 like '%市' AND st_contains(a.geom, p.geom) AND p.p02_002 = '19'
加工する
FOSS4G 2014 Tokyo PostGIS入門 45
• 図形を合成してみます。このSQLそれぞれ結果が1件のみになります(合成の結果)
• ST_Collect()とST_Union()の違い
図形の集合
FOSS4G 2014 Tokyo PostGIS入門 46
SELECT n03_003, ST_Collect(geom)FROM polygon_admWHERE n03_003 = '千葉市'GROUP BY n03_003;
集合条件の指定
SELECT n03_003, ST_Union(geom)FROM polygon_admWHERE n03_003 = '千葉市'GROUP BY n03_003;
CREATE VIEW collect_polygon asSELECT max(id) id, ST_Collect(geom)FROM sample_polygon;
CREATE VIEW union_polygon asSELECT max(id) id, ST_Union(geom)FROM sample_polygon;
重複部の座標はそのまま 重複部の座標は無くなる
ある領域に含まれる部分だけを切り出してみます
• 千葉市の行政界線で道路を切り出します
1. line_roadテーブルは行政界で分割されているので、路線毎にマージされた作業用テーブルを作成します。
2. ジオメトリ間の共有部分を求めるビュー(テーブル)を作成し、Shapefileにエクスポートします。
図形の切り出し
FOSS4G 2014 Tokyo PostGIS入門 47
CREATE TABLE union_road ASSELECTn01_002 roadname, (ST_Dump(ST_LineMerge(ST_Union(geom)))).Geom geom
FROM line_roadGROUP BY n01_002;
定型文として覚えておくと便利ジオメトリが、シンプル→マルチ→マルチ→シンプルと変換される
CREATE INDEX union_line_geom_gist ON union_road USING GiST (geom);
空間インデックスも忘れずに
CREATE VIEW chiba_road ASSELECT l.roadname, p.n03_004,ST_Intersection(p.geom, l.geom) geom
FROM polygon_adm p, union_road lWHERE St_Intersects(p.geom, l.geom)AND n03_003 = '千葉市';
QGISでこのViewを参照するとエラーになってしまう・・・
QGISで表示して確認
図形の切り出し
FOSS4G 2014 Tokyo PostGIS入門 48
• 外部データのインポート/エクスポートを頻繁に行うならLinuxがお勧めです(Windows + GUIでやってみたら結構大変でした・・・)
• OSGeo4Wというパッケージを使うとWindowsでもFOSS4GツールがCUIで利用出来ます
• PostGISマニュアル日本語訳は日本特有の問題点、Tipsについても追記されているので教科書として最適です(農研機構様に感謝)
ハンズオンは以上です
お疲れ様でした!
終わりに
FOSS4G 2014 Tokyo PostGIS入門 49
top related