50
PostGIS 入入 - 入入入入入入入入入入入入入入入入入 - FOSS4G 2014 Hokkaido [email protected]

FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

Embed Size (px)

Citation preview

Page 1: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

FOSS4G 2014 [email protected]

Page 2: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

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

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

• PostgreSQL と PostGIS は予めインストールしてください ( 別途資料を参照 ) 。• 本資料はクリエイティブ・コモンズ表示 - 継承 3.0 非移植ライセンスの下に提供され

ています。商用利用、改変も OK ですが、頒布するには原著作者クレジット (FOSS4G Hokkaido) を表示し、本資料と同一の許諾条件としてください。

はじめに

FOSS4G 2014 Hokkaido PostGIS 入門 2

Page 3: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

本日の配布データは以下になります• フォルダ: 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

Page 4: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

本ハンズオンは事前に以下の準備を行ってください• 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

Page 5: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

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

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

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

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

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

本セッションの内容

FOSS4G 2014 Hokkaido PostGIS 入門 5

Page 6: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

PostGIS 概説

FOSS4G 2014 Hokkaido PostGIS 入門 6

Page 7: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

Page 8: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

Page 9: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

Page 10: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

PostGIS(PostgreSQL) のメリット• オープンソース (GPL)• 標準規格への対応 (OpenGIS Consortium 、標準 SQL)• マルチプラットフォーム• ネットワーク共有が簡単便利 (TCP/IP 、トランザクショナル )• 豊富な連携ソフトウェア (GDAL/OGR など )• 情報・知見が得やすい• 拡張性、可用性、保守性に優れる☆つまり使いやすい

PostGIS(PostgreSQL) のデメリット• ファイルベースのデータは手軽 ( インストール、運用、データコピー etc)• サーバに負荷がかかり易い

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

FOSS4G 2014 Hokkaido PostGIS 入門 10

Page 11: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

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

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

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

Page 12: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

図形タイプ ( ジオメトリタイプ ) ( シングル・シンプル ) ポイント、ライン、ポリゴンマルチポイント、マルチライン、マルチポリゴンジオメトリコレクション、 TIN 、多面体サーフェイス

空間参照系 (SRID)座標系、測地系、投影法、ジオイドなどの定義SRID は QGIS などと共通spatial_ref_sys テーブルに格納されている

WKT(Well-Known Text) 形式ベクタ図形情報をテキスト形式で表現するフォーマットOpenGIS Consortium(OGC) による標準定義DB( ジオメトリ ) にはバイナリ形式 (WKB) で格納されている

PostGIS で使われる用語

FOSS4G 2014 Hokkaido PostGIS 入門 12

Page 13: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

PostGIS の準備

FOSS4G 2014 Hokkaido PostGIS 入門 13

Page 14: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

PostgreSQL/PostGIS のインストールWindows はハンズオンデイの案内ページを参照してください

https://sites.google.com/site/foss4ghokkaido/home/handson - PostgreSQL&PostGISのインストール方法

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

PostgreSQL/PostGIS のインストール

FOSS4G 2014 Hokkaido PostGIS 入門 14

Page 15: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

作業用ログインロール (ユーザ ) を追加します今回は説明の都合上、セキュリティ甘めの設定なことをご了承ください

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

Page 16: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

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

FOSS4G 2014 Hokkaido PostGIS 入門 16

ロール名 :demo

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

Page 17: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

データベース作成

FOSS4G 2014 Hokkaido PostGIS 入門 17

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

handson

Page 18: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

接続先の変更

FOSS4G 2014 Hokkaido PostGIS 入門 18

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

Page 19: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

作成したデータベースに PostGIS エクステンションを追加します1. 作成したデータベース (handson) の「 Extensions」を右クリック、「 New

Extension」を選択2. 「名前」から postgis を選択 ( もし見つからなければ PostGIS を再インストール )3. データベースの「スキーマ」 - public で関数、テーブル、トリガ、ビューが追加さ

れていることを確認4. spatial_ref_sys テーブルの内容を確認

PostGIS エクステンションはデータベース毎に追加します

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

FOSS4G 2014 Hokkaido PostGIS 入門 19

Page 20: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

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

FOSS4G 2014 Hokkaido PostGIS 入門 20

postgis

CREATE EXTENSIONpostgis

st_XXX 関数が大量にできる

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

Page 21: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

テーブルと図形の作成

FOSS4G 2014 Hokkaido PostGIS 入門 21

Page 22: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

ここからは SQL 文をタイプ & 実行して進めますツールバーの「任意の SQL クエリーを実行」をクリックします

SQL の入力

FOSS4G 2014 Hokkaido PostGIS 入門 22

handson の demo@localhost:5432

Page 23: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

Page 24: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

Page 25: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

Page 26: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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;

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

Page 27: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

図形の作成

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

Page 28: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

図形の作成

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

穴あきポリゴン

ポリゴンは () が増える

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

Page 29: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

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

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

Page 30: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

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

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)

Page 31: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

テキスト情報だけでは良く判らないので図化しますPostGIS だけでは「絵」が作れないので他のソフトを使用します今回は QGIS を利用します1. QGIS(Desktop) を起動する2. 「レイヤ」 -「 PostGIS レイヤの追加」を選択する3. 新規の接続先を作成する

1. 名称:適当2. ホスト: localhost3. データベース: handson4. ユーザ名: demo5. 接続テストして成功なら OK

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

図化する (QGIS)

FOSS4G 2014 Hokkaido PostGIS 入門 31

Page 32: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

画面は QGIS 2.2 です

QGIS で接続、表示する

FOSS4G 2014 Hokkaido PostGIS 入門 32

PostGIS レイヤの追加

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

接続テストしてみる

名前の一覧

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

Page 33: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

FOSS4G 2014 Hokkaido PostGIS 入門 33

Page 34: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

Page 35: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

Page 36: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

Page 37: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

Page 38: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

Page 39: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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)

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

Page 40: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

FOSS4G 2014 Hokkaido PostGIS 入門 40

D&D

shp2pgsql -c ...

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

shp2pgsql

shp2pgsql -p ...

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

Page 41: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

• 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 クエリを指定旭川市の行政コード

Page 42: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

検索する

FOSS4G 2014 Hokkaido PostGIS 入門 42

Page 43: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

テーブル定義

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

Page 44: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

Page 45: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

空間インデックスの有無による検索速度を体験してみます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'

Page 46: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

加工する

FOSS4G 2014 Hokkaido PostGIS 入門 46

Page 47: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

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

Page 48: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

ある領域に含まれる部分だけを切り出してみます• 札幌市の行政界線で道路を切り出します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 はなぜかエラーになってしまうので・・・

&& をつけると (少し !?)速くなる

Page 49: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

QGIS で表示して確認

図形の切り出し

FOSS4G 2014 Hokkaido PostGIS 入門 49

Page 50: FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門

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

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

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

ハンズオンは以上ですお疲れ様でした !

終わりに

FOSS4G 2014 Hokkaido PostGIS 入門 50