49
PostGIS入門 - 空間情報データベースを作ってみよう - FOSS4G 2014 Tokyo

PostGIS Handson | FOSS4G Tokyo 2014

Embed Size (px)

Citation preview

Page 1: PostGIS Handson | FOSS4G Tokyo 2014

PostGIS入門-空間情報データベースを作ってみよう -

FOSS4G 2014 Tokyo

Page 2: PostGIS Handson | FOSS4G Tokyo 2014

• 代表的な空間情報DBMSであるPostGISを使用して、構築と解析の初歩までを学びます。

• 本セッションはDBMS、GISについての基礎知識を必要とします。(質問は随時どうぞ!)

• PDF資料からコードをコピー&ペーストすると正しく動作しないことがあります。適宜タイプしなおしてください。

• 本資料はクリエイティブ・コモンズ表示-継承3.0非移植ライセンスの下に提供されています。商用利用、改変もOKですが、頒布するには原著作者クレジット(FOSS4G Tokyo)を表示し、本資料と同一の許諾条件としてください。

• 本ハンズオンは事前に以下の準備を行ってください

• PostgreSQL & PostGISのインストール

• QGISのインストール

はじめに

FOSS4G 2014 Tokyo PostGIS入門 2

Page 3: PostGIS Handson | FOSS4G Tokyo 2014

• フォルダ: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でご覧の方は各サイトからダウンロードしてください

Page 4: PostGIS Handson | FOSS4G Tokyo 2014

PostGIS概説・・・PostGISについての説明、導入するメリットなど

PostGISの準備・・・実際に使い始めるまでの説明

テーブルと図形の作成・・・基礎的なジオメトリ(図形)の作成と表示

データのインポート/エクスポート・・・CSV、Shapefileなどから大量にデータをインポート、DBから外部形式にエクスポート

検索する・・・条件指定(Where)の説明、空間インデックスの説明

加工する・・・図形の合成、切り出しをSQLで実行する

本セッションの内容

FOSS4G 2014 Tokyo PostGIS入門 4

Page 5: PostGIS Handson | FOSS4G Tokyo 2014

PostGIS概説

FOSS4G 2014 Tokyo PostGIS入門 5

Page 6: PostGIS Handson | FOSS4G Tokyo 2014

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

Page 7: PostGIS Handson | FOSS4G Tokyo 2014

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

Page 8: PostGIS Handson | FOSS4G Tokyo 2014

主な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

Page 9: PostGIS Handson | FOSS4G Tokyo 2014

PostGIS(PostgreSQL)のメリット

• オープンソース(GPL)

• 標準規格への対応(OpenGIS Consortium、標準SQL)

• マルチプラットフォーム

• ネットワーク共有が簡単便利(TCP/IP、トランザクショナル)

• 豊富な連携ソフトウェア(GDAL/OGRなど)

• 情報・知見が得やすい

• 拡張性、可用性、保守性に優れる

☆つまり使いやすい

PostGIS(PostgreSQL)のデメリット

• ファイルベースのデータは手軽(インストール、運用、データコピーetc)

• サーバに負荷がかかり易い

PostGIS(GIS DB)を使うべき理由

FOSS4G 2014 Tokyo PostGIS入門 9

Page 10: PostGIS Handson | FOSS4G Tokyo 2014

スタンダードフォーマットである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

空間インデックス サポート(汎用検索ツリー) サポート(性能は良くないとされる、アプリ毎に異なるファイル)

共有アクセス 同テーブルへの読み書き可能トランザクション、ロックが可能

高度で安全な共有は期待出来ない

Page 11: PostGIS Handson | FOSS4G Tokyo 2014

図形タイプ(ジオメトリタイプ)

(シングル・シンプル)ポイント、ライン、ポリゴン

マルチポイント、マルチライン、マルチポリゴン

ジオメトリコレクション、TIN、多面体サーフェイス

空間参照系(SRID)

座標系、測地系、投影法、ジオイドなどの定義

SRIDはQGISなどと共通

spatial_ref_sysテーブルに格納されている

WKT(Well-Known Text)形式

ベクタ図形情報をテキスト形式で表現するフォーマット

OpenGIS Consortium(OGC)による標準定義

DB(ジオメトリ)にはバイナリ形式(WKB)で格納されている

PostGISで使われる用語

FOSS4G 2014 Tokyo PostGIS入門 11

Page 12: PostGIS Handson | FOSS4G Tokyo 2014

PostGISの準備

FOSS4G 2014 Tokyo PostGIS入門 12

Page 13: PostGIS Handson | FOSS4G Tokyo 2014

PostgreSQL/PostGISのインストール

Windowsは下記ページを参照してくださいhttp://www.slideshare.net/hideo0515harada/postgresqlpostgis

Linux(*NIX)はパッケージシステム使用を推奨します。(GDAL,GEOSなどの依存関係解決のため)

PostgreSQL/PostGISのインストール

FOSS4G 2014 Tokyo PostGIS入門 13

Page 14: PostGIS Handson | FOSS4G Tokyo 2014

作業用ログインロール(ユーザ)を追加します

今回は説明の都合上、セキュリティ甘めの設定なことをご了承ください

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

Page 15: PostGIS Handson | FOSS4G Tokyo 2014

作業用ログインロール(ユーザ)の追加

ログインロール(ユーザ)を追加

FOSS4G 2014 Tokyo PostGIS入門 15

ロール名:demo

・スーパーユーザ・Can create database(データベース作成権限)

Page 16: PostGIS Handson | FOSS4G Tokyo 2014

データベースを作成(createdb)

データベース作成

FOSS4G 2014 Tokyo PostGIS入門 16

demo CREATE DATABASEWITH ENCODING=‘UTF8’OWNER=demoCONNECTION LIMIT=-1;

handson

Page 17: PostGIS Handson | FOSS4G Tokyo 2014

接続するユーザとデータベースを変更

接続先の変更

FOSS4G 2014 Tokyo PostGIS入門 17

DBメンテナンス:handsonユーザ名:demo

Page 18: PostGIS Handson | FOSS4G Tokyo 2014

作成したデータベースに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サービス

Page 19: PostGIS Handson | FOSS4G Tokyo 2014

PostGISエクステンションを追加(create extension)

PostGISエクステンションのインストール

FOSS4G 2014 Tokyo PostGIS入門 19

postgis

CREATE EXTENSIONpostgis

st_XXX関数が大量にできる

spatial_ref_sysテーブルをデータビューで確認

Page 20: PostGIS Handson | FOSS4G Tokyo 2014

テーブルと図形の作成

FOSS4G 2014 Tokyo PostGIS入門 20

Page 21: PostGIS Handson | FOSS4G Tokyo 2014

ここからはSQL文をタイプ&実行して進めます

ツールバーの「任意のSQLクエリーを実行」をクリックします

SQLの入力

FOSS4G 2014 Tokyo PostGIS入門 21

handsonのdemo@localhost:5432

Page 22: PostGIS Handson | FOSS4G Tokyo 2014

主キー(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)

);

Page 23: PostGIS Handson | FOSS4G Tokyo 2014

ちなみに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);

Page 24: PostGIS Handson | FOSS4G Tokyo 2014

よく使われる空間参照系の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)

Page 25: PostGIS Handson | FOSS4G Tokyo 2014

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;

空間参照系を指定するテキストをジオメトリ型に変換

Page 26: PostGIS Handson | FOSS4G Tokyo 2014

ラインジオメトリを持つテーブルを作成します

図形の作成

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)); 頂点の区切りはカンマ(,)

Page 27: PostGIS Handson | FOSS4G Tokyo 2014

ポリゴンジオメトリを持つテーブルを作成、図形を作成します

図形の作成

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));

穴あきポリゴン

ポリゴンは()が増える

右回り・左回りどちらでもよい

Page 28: PostGIS Handson | FOSS4G Tokyo 2014

ジオメトリ出力関数で図形を確認してみます

図形を確認する(ジオメトリ出力)

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や自作プログラムで対処する

Page 29: PostGIS Handson | FOSS4G Tokyo 2014

ジオメトリアクセサ関数で図形の構成を確認します

図形を確認する(ジオメトリアクセサ)

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)

Page 30: PostGIS Handson | FOSS4G Tokyo 2014

テキスト情報だけでは良く判らないので図化します

PostGISだけでは「絵」が作れないので他のソフトを使用します

今回はQGISを利用します

1. QGIS(Desktop)を起動する

2. 「レイヤ」-「PostGISレイヤの追加」を選択する

3. 新規の接続先を作成する

1. 名称:適当

2. ホスト:localhost

3. データベース:handson

4. ユーザ名:demo

5. 接続テストして成功ならOK

4. 戻って「接続」し、テーブルを選んで「追加」する

図化する(QGIS)

FOSS4G 2014 Tokyo PostGIS入門 30

Page 31: PostGIS Handson | FOSS4G Tokyo 2014

画面はQGIS 2.4です

QGISで接続、表示する

FOSS4G 2014 Tokyo PostGIS入門 31

PostGISレイヤの追加

接続情報は前ページを参照

接続テストしてみる

名前の一覧

接続→テーブル一覧表示→選択して追加

Page 32: PostGIS Handson | FOSS4G Tokyo 2014

データのインポート/エクスポート

FOSS4G 2014 Tokyo PostGIS入門 32

Page 33: PostGIS Handson | FOSS4G Tokyo 2014

• デファクトスタンダードである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

Page 34: PostGIS Handson | FOSS4G Tokyo 2014

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

Page 35: PostGIS Handson | FOSS4G Tokyo 2014

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)

パイプラインで渡しても良い

Page 36: PostGIS Handson | FOSS4G Tokyo 2014

shp2pgsqlの使い方(コマンドプロンプト)

FOSS4G 2014 Tokyo PostGIS入門 36

D&D

shp2pgsql -c ...

ファイルにリダイレクト(パイプでもOK)

shp2pgsql

shp2pgsql -p ...

テーブル名にハイフンは避けたい

Page 37: PostGIS Handson | FOSS4G Tokyo 2014

• 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クエリを記述

Page 38: PostGIS Handson | FOSS4G Tokyo 2014

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:南北

標準入力を使用する

Page 39: PostGIS Handson | FOSS4G Tokyo 2014

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

Page 40: PostGIS Handson | FOSS4G Tokyo 2014

• 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;

Page 41: PostGIS Handson | FOSS4G Tokyo 2014

検索する

FOSS4G 2014 Tokyo PostGIS入門 41

Page 42: PostGIS Handson | FOSS4G Tokyo 2014

前セクションでインポートした国土数値情報の簡単な説明

テーブル定義

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 通称

Page 43: PostGIS Handson | FOSS4G Tokyo 2014

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

Page 44: PostGIS Handson | FOSS4G Tokyo 2014

空間インデックスの有無による検索速度を体験してみます

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'

Page 45: PostGIS Handson | FOSS4G Tokyo 2014

加工する

FOSS4G 2014 Tokyo PostGIS入門 45

Page 46: PostGIS Handson | FOSS4G Tokyo 2014

• 図形を合成してみます。この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;

重複部の座標はそのまま 重複部の座標は無くなる

Page 47: PostGIS Handson | FOSS4G Tokyo 2014

ある領域に含まれる部分だけを切り出してみます

• 千葉市の行政界線で道路を切り出します

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を参照するとエラーになってしまう・・・

Page 48: PostGIS Handson | FOSS4G Tokyo 2014

QGISで表示して確認

図形の切り出し

FOSS4G 2014 Tokyo PostGIS入門 48

Page 49: PostGIS Handson | FOSS4G Tokyo 2014

• 外部データのインポート/エクスポートを頻繁に行うならLinuxがお勧めです(Windows + GUIでやってみたら結構大変でした・・・)

• OSGeo4Wというパッケージを使うとWindowsでもFOSS4GツールがCUIで利用出来ます

• PostGISマニュアル日本語訳は日本特有の問題点、Tipsについても追記されているので教科書として最適です(農研機構様に感謝)

ハンズオンは以上です

お疲れ様でした!

終わりに

FOSS4G 2014 Tokyo PostGIS入門 49