foss4g 2014 hokkaidoハンズオン - postgis入門
TRANSCRIPT
PostGIS 入門- 空間情報データベースを作ってみよう -
FOSS4G 2014 [email protected]
• 代表的な空間情報 DBMS である PostGIS を使用して、構築と解析の初歩までを学びます。
• 本セッションは DBMS 、 GIS についての基礎知識を必要とします。( 質問は随時どうぞ !)
• PDF 資料からコードをコピー & ペーストすると正しく動作しないことがあります。適宜タイプしなおしてください。
• PostgreSQL と PostGIS は予めインストールしてください ( 別途資料を参照 ) 。• 本資料はクリエイティブ・コモンズ表示 - 継承 3.0 非移植ライセンスの下に提供され
ています。商用利用、改変も OK ですが、頒布するには原著作者クレジット (FOSS4G Hokkaido) を表示し、本資料と同一の許諾条件としてください。
はじめに
FOSS4G 2014 Hokkaido PostGIS 入門 2
本日の配布データは以下になります• フォルダ: docs
• PostGIS 入門 .pdf ( 本文書 )• PostGIS 2.2.0dev マニュアル日本語訳 .pdf• PostgreSQL&PostGIS のインストール .pdf ( 事前準備マニュアル )• QGIS2.2_Install.pdf ( 事前準備マニュアル )
• フォルダ: data• N01-07L-01-01.0a_GML.zip 、 N03-130401_01_GML.zip 、 P02-
06_01_GML.zip( 国土数値情報データ。次ページで説明 )• hinan_20140623.csv ( 室蘭市避難所一覧 CSV 。次ページで説明 )• muroran_hinan_csv.sql ( 避難所 CSV のインポート SQL)
• フォルダ: shapefiles• 前記 zip を展開したデータ
• フォルダ: tools • 使用しない予定ですが、インストール漏れなどの際にお使いください
配布データについて
FOSS4G 2014 Hokkaido PostGIS 入門 3
本ハンズオンは事前に以下の準備を行ってください• PostgreSQL & PostGIS のインストール• QGIS のインストール• 国土数値情報から Shapefile を取得する ( 北海道地区 )
• 行政区域 (H25) N03-130401_01_GML.zip• 公共施設 (H18) P02-06_01_GML.zip• 道路 ( 統一フォーマット H7) N01-07L-01-01.0a_GML.zip
• むろらんオープンデータライブラリから次のデータを取得する• 避難場所 CSV (hinan_20140623.csv)
← 講習では SQL ファイルで配布します
事前準備について
FOSS4G 2014 Hokkaido PostGIS 入門 4
PostGIS 概説・・・ PostGIS についての説明、導入するメリットなど
PostGIS の準備・・・実際に使い始めるまでの説明
テーブルと図形の作成・・・基礎的なジオメトリ ( 図形 ) の作成と表示
データのインポート / エクスポート・・・ CSV 、 Shapefile などから大量にデータをインポート、 DB から外部形式にエクスポート
検索する・・・条件指定 (Where) の説明、空間インデックスの説明
加工する・・・図形の合成、切り出しを SQL で実行する
本セッションの内容
FOSS4G 2014 Hokkaido PostGIS 入門 5
PostGIS 概説
FOSS4G 2014 Hokkaido PostGIS 入門 6
PostGIS とは ?オープンソースの DBMS である PostgreSQL で地理空間情報を扱うための拡張機能(PostgreSQL Extension) 。Refractions Research 社により GPL ライセンスでリリースされている。地理空間情報の管理、編集、検索、演算を SQL で行うことができる。PHP 、 Java 、 Python など DB へのインターフェイスを持つ言語からも特別な拡張無しに利用できる。今では MapServer 、 GeoServer 、 QGIS 、 GRASS などの OSS GIS ツールの他、ArcGIS 、 SIS などの商用 GIS のバックエンドとしても利用できる。2012 年の 1.5 から 2.0 へのバージョンアップでは、モジュールからエクステンションに変更 (PostgreSQL 9.1 以降が対応 ) 、地理データ列の定義方法変更、非推奨関数の多数削除など大きな変更が加えられた。
PostGIS とは
FOSS4G 2014 Hokkaido PostGIS 入門 7
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 Hokkaido PostGIS 入門 8
主な DBMS の GIS 拡張PostGISPostgreSQL標準の幾何データ対応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 Hokkaido PostGIS 入門 9
PostGIS(PostgreSQL) のメリット• オープンソース (GPL)• 標準規格への対応 (OpenGIS Consortium 、標準 SQL)• マルチプラットフォーム• ネットワーク共有が簡単便利 (TCP/IP 、トランザクショナル )• 豊富な連携ソフトウェア (GDAL/OGR など )• 情報・知見が得やすい• 拡張性、可用性、保守性に優れる☆つまり使いやすい
PostGIS(PostgreSQL) のデメリット• ファイルベースのデータは手軽 ( インストール、運用、データコピー etc)• サーバに負荷がかかり易い
PostGIS(GIS DB) を使うべき理由
FOSS4G 2014 Hokkaido PostGIS 入門 10
スタンダードフォーマットである Shapefile との比較
Shapefile との比較
FOSS4G 2014 Hokkaido PostGIS 入門 11
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 Hokkaido PostGIS 入門 12
PostGIS の準備
FOSS4G 2014 Hokkaido PostGIS 入門 13
PostgreSQL/PostGIS のインストールWindows はハンズオンデイの案内ページを参照してください
https://sites.google.com/site/foss4ghokkaido/home/handson - PostgreSQL&PostGISのインストール方法
Linux(*NIX) はパッケージシステム使用を推奨します。(GDAL,GEOS などの依存関係解決のため )
PostgreSQL/PostGIS のインストール
FOSS4G 2014 Hokkaido PostGIS 入門 14
作業用ログインロール (ユーザ ) を追加します今回は説明の都合上、セキュリティ甘めの設定なことをご了承ください
1. pgAdminⅢ を起動 ( インストール資料の p17 を参照 )2. 「ログインロール」を右クリック、「新しいログインロール」を選択3. 名前とパスワードを入力。今回は demo を作成
( スーパーユーザー特権と、データベース作成特権を与える )4. pgAdminⅢ で「データベース」を右クリック、「新しいデータベース」を選択5. 名前は handson 、オーナーは demo 、他はデフォルトのまま注 )運用では他の設定を変更しても構いません
6. pgAdminⅢ の接続を切断し (Dissconnet server) 、サーバ (localhost) を右クリックし、「プロパティ」を選択
7. 「 DB メンテナンス」を handson 、「ユーザ名」を demo に変更
ログインロール (ユーザ ) を追加
FOSS4G 2014 Hokkaido PostGIS 入門 15
作業用ログインロール (ユーザ ) の追加
ログインロール (ユーザ ) を追加
FOSS4G 2014 Hokkaido PostGIS 入門 16
ロール名 :demo
・スーパーユーザ・ Can create database( データベース作成権限 )
データベースを作成 (createdb)
データベース作成
FOSS4G 2014 Hokkaido PostGIS 入門 17
demo CREATE DATABASEWITH ENCODING=‘UTF8’OWNER=demoCONNECTION LIMIT=-1;
handson
接続するユーザとデータベースを変更
接続先の変更
FOSS4G 2014 Hokkaido PostGIS 入門 18
DB メンテナンス :handsonユーザ名 :demo
作成したデータベースに PostGIS エクステンションを追加します1. 作成したデータベース (handson) の「 Extensions」を右クリック、「 New
Extension」を選択2. 「名前」から postgis を選択 ( もし見つからなければ PostGIS を再インストール )3. データベースの「スキーマ」 - public で関数、テーブル、トリガ、ビューが追加さ
れていることを確認4. spatial_ref_sys テーブルの内容を確認
PostGIS エクステンションはデータベース毎に追加します
PostGIS エクステンションのインストール
FOSS4G 2014 Hokkaido PostGIS 入門 19
PostGIS エクステンションを追加 (create extension)
PostGIS エクステンションのインストール
FOSS4G 2014 Hokkaido PostGIS 入門 20
postgis
CREATE EXTENSIONpostgis
st_XXX 関数が大量にできる
spatial_ref_sys テーブルをデータビューで確認
テーブルと図形の作成
FOSS4G 2014 Hokkaido PostGIS 入門 21
ここからは SQL 文をタイプ & 実行して進めますツールバーの「任意の SQL クエリーを実行」をクリックします
SQL の入力
FOSS4G 2014 Hokkaido PostGIS 入門 22
handson の demo@localhost:5432
主キー (serial)id を持つポイントのテーブルを作成します
「ジオメトリ型」を使用し、図形タイプと空間参照系を指定するラインは (MULTI)LINESTRING 、ポリゴンは (MULTI)POLYGONこのテーブルの空間参照系は JGD2000緯度経度 (SRID:4612)ジオメトリ (座標 ) の列名は geom にするのが一般的
テーブルの作成
FOSS4G 2014 Hokkaido PostGIS 入門 23
CREATE TABLE sample_point ( id SERIAL PRIMARY KEY, geom GEOMETRY (POINT, 4612));
ちなみに PostGIS 1.x では ...
AddGeometryCoumn関数は後方互換のため残されているツールによっては、まだこちらが使われているツールが古いなどの理由で互換性が必要な場合、 PostGIS に同梱されている
legacy.sql を実行する。
テーブルの作成 (PostGIS 1.x)
FOSS4G 2014 Hokkaido PostGIS 入門 24
CREATE TABLE sample_point ( id SERIAL PRIMARY KEY);
SELECT AddGeometryColumn ('sample_point', 'the_geom', 4612, 'POINT', 2);
よく使われる空間参照系の SRID 一覧
よく使われる SRID 一覧
FOSS4G 2014 Hokkaido PostGIS 入門 25
測地系 座標系 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 Hokkaido PostGIS 入門 26
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 Hokkaido PostGIS 入門 27
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 Hokkaido PostGIS 入門 28
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 Hokkaido PostGIS 入門 29
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 Hokkaido PostGIS 入門 30
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. ホスト: localhost3. データベース: handson4. ユーザ名: demo5. 接続テストして成功なら OK
4. 戻って「接続」し、テーブルを選んで「追加」する
図化する (QGIS)
FOSS4G 2014 Hokkaido PostGIS 入門 31
画面は QGIS 2.2 です
QGIS で接続、表示する
FOSS4G 2014 Hokkaido PostGIS 入門 32
PostGIS レイヤの追加
接続情報は前ページを参照
接続テストしてみる
名前の一覧
接続→テーブル一覧表示→選択して追加
データのインポート / エクスポート
FOSS4G 2014 Hokkaido PostGIS 入門 33
XY データをインポート ( 変換 )• CSV などを PostgreSQL にインポート (ex. COPY コマンド ) してからジオメトリを
作成してみます
• 今回は配布データの muroran_hinan_csv.sql(pg_dump で生成 ) で通常テーブルを作成クエリーツールのファイル - 開くから SQL を読みこんで実行
• むろらんオープンデータライブラリから災害時の避難場所 (CSV) をテーブル muroran_hinan_csv にインポート ( 一部加工済み ) した結果
データをインポート
FOSS4G 2014 Hokkaido PostGIS 入門 34
平面直角 12系( JGD2000)X:東西、 Y:南北
XY 列をポイントジオメトリに変換、更に緯度経度に変換します1. 数値をポイントジオメトリに変換し、空間参照系を付与する
2. JGD2000緯度経度に投影変換する
3. 今のテーブルにジオメトリ追加する
4. ジオメトリ属性をアップデート
XY からジオメトリ (投影変換 )
FOSS4G 2014 Hokkaido PostGIS 入門 35
SELECT ST_setSRID(ST_MakePoint(x, y), 2454) FROM muroran_hinan_csv;
平面直角 (12)空間参照系の付与
SELECT ST_Transform(ST_setSRID(ST_MakePoint(x, y), 2454), 4612)FROM muroran_hinan_csv;
緯度経度座標変換 (投影変換 )
ALTER TABLE muroran_hinan_csv ADD geom GEOMETRY(POINT, 4612);
UPDATE muroran_hinan_csv SET geom = ST_Transform(ST_setSRID(ST_MakePoint(x, y), 2454), 4612);
• ST_setSRID() は空間参照系のメタ情報を付与するだけ。投影変換 (座標変換 ) はされません
• ジオメトリ型に INSERT/UPDATE するときは自動的に投影変換されない• 別の空間参照系に変換するには ST_Transform() を使う• 平面直角座標系も PostGIS では POINT(東西 (X) 南北 (Y)) 。生データを扱うときは気をつけましょう
• GPSログをラインにしたいときは・・・
変換のポイント
FOSS4G 2014 Hokkaido PostGIS 入門 36
SELECT gps_track, ST_MakeLine(gps.geom ORDER BY gps_time) geom FROM gps_pointsGROUP BY gps_track;
• デファクトスタンダードである 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 Hokkaido PostGIS 入門 37
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 Hokkaido PostGIS 入門 38
ファイル・フォルダの指定はエクスプローラからコマンドプロンプトに
ドラッグドロップすると便利です
内容 Shapefile名 テーブル名行政区域 (Polygon) N03-13_01_130401 polygon_adm
公共施設 (Point) P02-06_01-g_PublicFacility point_public
道路 (Line) N01-07L-2K-01_Road line_road
1. "C:\Program Files\PostgreSQL\9.3\pg_env.bat" ( を実行 )2. shp2pgsql3. cd < 配布の Shapefiles フォルダ >4. shp2pgsql -p -I -S -s 4612 -W cp932 N03-13_01_130401 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-13_01_130401 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_01-g_PublicFacility point_public | psql -U demo -d handson8.shp2pgsql -c -D -I -S -s 4612 -W cp932 N01-07L-2K-01_Road line_road | psql -U demo -d handson
•-p,-c の代わりに -a で追記モードになります。同じテーブルに異なるファイルの内容を次々に入力したい場合に便利です。•Linux(OSGeo4W) も全く同じ使用方法です
shp2pgsql の使い方 ( コマンドプロンプト )
FOSS4G 2014 Hokkaido PostGIS 入門 39
ファイル名を指定.shp は省略しても良い
テーブル名
インデックスについては後ほど
文字コード変換 (SJIS→UTF8)
パイプラインで渡しても良い
shp2pgsql の使い方 ( コマンドプロンプト )
FOSS4G 2014 Hokkaido PostGIS 入門 40
D&D
shp2pgsql -c ...
ファイルにリダイレクト(パイプでも OK)
shp2pgsql
shp2pgsql -p ...
テーブル名にハイフンは避けたい
• PostGIS から Shapefile をエクスポートするには pgsql2shp が良く使われます• テーブルまたはビューを指定、あるいは SQL クエリ () が利用できます• 文字コードはクライアントのエンコーディングに依存します (注意が必要 )
• テーブル /ビューをエクスポート1. SET PGCLIENTENCODING=SJIS2. pgsql2shp -u demo handson point_public
• SQL クエリを利用• pgsql2shp -u demo -f asahikawa handson "select * from polygon_adm where
n03_007 = '01204'"
pgsql2shp の使い方 ( エクスポート )
FOSS4G 2014 Hokkaido PostGIS 入門 41
SET しないエクスポートも試してみましょう
データベースとテーブル名を指定
ファイル名を指定
データベースと SQL クエリを指定旭川市の行政コード
検索する
FOSS4G 2014 Hokkaido PostGIS 入門 42
前セクションでインポートした国土数値情報の簡単な説明
テーブル定義
FOSS4G 2014 Hokkaido PostGIS 入門 43
行政区域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 Hokkaido PostGIS 入門 44
SELECT n03_003, n03_004, n03_007, ST_Area(ST_Transform(geom, 2454)), ST_Area(ST_Transform(geom, 32654))FROM polygon_admWHERE n03_003 = '札幌市 ';
2454:平面直角 (12)32654:UTM54
SELECT n03_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 Hokkaido PostGIS 入門 45
SELECT count(*)FROM polygon_adm a, point_public pWHERE n03_004 like '%町 ' AND st_contains(a.geom, p.geom) AND p.p02_002 = '18'
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 = '18'
加工する
FOSS4G 2014 Hokkaido PostGIS 入門 46
• 図形を合成してみます。この SQLそれぞれ結果が 1 件のみになります ( 合成の結果 )
• ST_Collect() と ST_Union() の違い
図形の集合
FOSS4G 2014 Hokkaido PostGIS 入門 47
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 Hokkaido PostGIS 入門 48
CREATE TABLE union_road ASSELECT n01_002 roadname, (ST_Dump(ST_LineMerge(ST_Union(geom)))).Geom geomFROM line_roadGROUP BY n01_002;
定型文として覚えておくと便利ジオメトリが、シンプル→マルチ→マルチ→シンプルと変換される
CREATE INDEX union_line_geom_gist ON union_road USING GiST (geom);
空間インデックスも忘れずに
CREATE VIEW sapporo_road ASSELECT l.roadname, p.n03_004,ST_Intersection(p.geom, l.geom) geomFROM polygon_adm p, union_road lWHERE p.geom && l.geom AND St_Intersects(p.geom, l.geom) AND n03_003 = '札幌市 ';
QGIS はなぜかエラーになってしまうので・・・
&& をつけると (少し !?)速くなる
QGIS で表示して確認
図形の切り出し
FOSS4G 2014 Hokkaido PostGIS 入門 49
• 外部データのインポート / エクスポートを頻繁に行うなら Linux がお勧めです(Windows + GUI でやってみたら結構大変でした・・・ )
• OSGeo4W というパッケージを使うと Windows でも FOSS4G ツールが CUI で利用出来ます
• PostGIS マニュアル日本語訳は日本特有の問題点、 Tips についても追記されているので教科書として最適です (農研機構様に感謝 )
ハンズオンは以上ですお疲れ様でした !
終わりに
FOSS4G 2014 Hokkaido PostGIS 入門 50