SlideShare ist ein Scribd-Unternehmen logo
1 von 49
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 : 
千葉市のオープンデータ「避難場所・避難所・広域避難場所・津波避難ビル一覧」CSV 
http://www.city.chiba.jp/somu/kikikanri/hinanbasyoichiran.html 
の座標を投影変換したCSV 
• command.txt : この資料のSQL、コマンドを記載 
• フォルダ:shapefiles 
• 前記zipを展開したデータ 
配布データについて 
Slideshareでご覧の方は 
各サイトからダウンロードしてください 
FOSS4G 2014 Tokyo PostGIS入門3
 PostGIS概説 
・・・PostGISについての説明、導入するメリットなど 
 PostGISの準備 
・・・実際に使い始めるまでの説明 
 テーブルと図形の作成 
・・・基礎的なジオメトリ(図形)の作成と表示 
 データのインポート/エクスポート 
・・・CSV、Shapefileなどから大量にデータをインポート、DBから外部形式にエクスポート 
 検索する 
・・・条件指定(Where)の説明、空間インデックスの説明 
 加工する 
・・・図形の合成、切り出しをSQLで実行する 
本セッションの内容 
FOSS4G 2014 Tokyo PostGIS入門4
PostGIS概説 
FOSS4G 2014 Tokyo PostGIS入門5
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以降が対応)、地理データ列の定義方法変更、非推奨関数の多数削除など大きな変更が加え 
られた。 
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)のメリット 
PostGIS(GIS DB)を使うべき理由 
• オープンソース(GPL) 
• 標準規格への対応(OpenGIS Consortium、標準SQL) 
• マルチプラットフォーム 
• ネットワーク共有が簡単便利(TCP/IP、トランザクショナル) 
• 豊富な連携ソフトウェア(GDAL/OGRなど) 
• 情報・知見が得やすい 
• 拡張性、可用性、保守性に優れる 
☆つまり使いやすい 
PostGIS(PostgreSQL)のデメリット 
• ファイルベースのデータは手軽(インストール、運用、データコピーetc) 
• サーバに負荷がかかり易い 
FOSS4G 2014 Tokyo PostGIS入門9
スタンダードフォーマットであるShapefileとの比較 
Shapefileとの比較 
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 
空間インデックスサポート(汎用検索ツリー) サポート(性能は良くないとされる、アプ 
リ毎に異なるファイル) 
共有アクセス同テーブルへの読み書き可能 
トランザクション、ロックが可能 
高度で安全な共有は期待出来ない 
FOSS4G 2014 Tokyo PostGIS入門10
図形タイプ(ジオメトリタイプ) 
 (シングル・シンプル)ポイント、ライン、ポリゴン 
 マルチポイント、マルチライン、マルチポリゴン 
 ジオメトリコレクション、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
作業用ログインロール(ユーザ)の追加 
ログインロール(ユーザ)を追加 
ロール名:demo 
・スーパーユーザ 
・Can create database 
(データベース作成権限) 
FOSS4G 2014 Tokyo PostGIS入門15
データベースを作成(createdb) 
データベース作成 
handson 
demo CREATE DATABASE 
WITH ENCODING=‘UTF8’ 
OWNER=demo 
CONNECTION LIMIT=-1; 
FOSS4G 2014 Tokyo PostGIS入門16
接続するユーザとデータベースを変更 
接続先の変更 
DBメンテナンス:handson 
ユーザ名:demo 
FOSS4G 2014 Tokyo PostGIS入門17
PostGISエクステンションのインストール 
作成したデータベースにPostGISエクステンションを追加します 
1. 作成したデータベース(handson)の「Extensions」を右クリック、「New Extension」を選択 
2. 「名前」からpostgisを選択(もし見つからなければPostGISを再インストール) 
3. データベースの「スキーマ」- publicで関数、テーブル、トリガ、ビューが追加されていることを確認 
4. テーブルspatial_ref_sysの内容を確認 
 PostGISエクステンションはデータベース毎に追加します 
PostgreSQLサービス 
ロール(ユーザ) ロール(ユーザ) 
データベース 
PL/pgSQL 
PostGIS 
データベース 
PL/pgSQL 
PostgreSQLの概念図 
FOSS4G 2014 Tokyo PostGIS入門18
PostGISエクステンションを追加(create extension) 
PostGISエクステンションのインストール 
postgis 
CREATE EXTENSION 
postgis 
st_XXX 関数が大量にできる 
spatial_ref_sysテーブル 
をデータビューで確認 
FOSS4G 2014 Tokyo PostGIS入門19
テーブルと図形の作成 
FOSS4G 2014 Tokyo PostGIS入門20
ここからはSQL文をタイプ&実行して進めます 
ツールバーの「任意のSQLクエリーを実行」をクリックします 
SQLの入力 
handsonのdemo@localhost:5432 
FOSS4G 2014 Tokyo PostGIS入門21
主キー(serial)idを持つポイントのテーブルを作成します 
CREATE TABLE sample_point ( 
id SERIAL PRIMARY KEY, 
geom GEOMETRY (POINT, 4612) 
); 
 「ジオメトリ型」を使用し、図形タイプと空間参照系を指定する 
 ラインは(MULTI)LINESTRING、ポリゴンは(MULTI)POLYGON 
 このテーブルの空間参照系はJGD2000緯度経度(SRID:4612) 
 ジオメトリ(座標)の列名はgeomにするのが一般的 
テーブルの作成 
FOSS4G 2014 Tokyo PostGIS入門22
ちなみにPostGIS 1.xでは... 
CREATE TABLE sample_point ( 
id SERIAL PRIMARY KEY 
); 
SELECT AddGeometryColumn ('sample_point', 'the_geom', 4612, 'POINT', 2); 
 AddGeometryCoumn関数は後方互換のため残されている 
 ツールによっては、まだこちらが使われている 
 ツールが古いなどの理由で互換性が必要な場合、PostGISに同梱されているlegacy.sqlを実行 
する。 
テーブルの作成(PostGIS 1.x) 
FOSS4G 2014 Tokyo PostGIS入門23
よく使われる空間参照系のSRID一覧 
よく使われるSRID一覧 
測地系座標系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) 900913 
3857 (EPSG) 
FOSS4G 2014 Tokyo PostGIS入門24
INSERT文で図形を作成してみます 
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; 
• 文字列'POINT(141.347 43.071)' がWKT 
• 対になっているXとYはスペースで区切る 
• [geom]の出力はバイナリ形式(普通の人には読めない) 
• ST_asText関数により読みやすい形式にする 
図形の作成 
FOSS4G 2014 Tokyo PostGIS入門25
ラインジオメトリを持つテーブルを作成します 
図形の作成 
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入門26
ポリゴンジオメトリを持つテーブルを作成、図形を作成します 
図形の作成 
CREATE TABLE sample_polygon ( 
id SERIAL PRIMARY KEY, 
geom GEOMETRY (POLYGON, 4612) 
); 
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) 
); 
始点終点は一致させる(閉じる) 
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入門27
ジオメトリ出力関数で図形を確認してみます 
図形を確認する(ジオメトリ出力) 
WKT表現(ポピュラー) 
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,...)) 
KML、GeoJSON表現(ジオアプリ向け) 
SELECT ST_asKML(geom) FROM sample_line; 
→ <LineString><coordinates>141.347,... </coordinates></LineString> 
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入門28
ジオメトリアクセサ関数で図形の構成を確認します 
図形を確認する(ジオメトリアクセサ) 
座標を取り出す 
SELECT ST_X(geom), ST_Y(geom), ST_SRID(geom) FROM sample_point; 
→ 141.347, 43.071, 4612 
N番目の図形を取り出す 
SELECT ST_asText(ST_PointN(geom, 3)) FROM sample_line; 
→ POINT(141.342 43.075) 
ポリゴンは少し複雑です 
始点:1から始まる 
SELECT ST_NRings(geom), ST_X(ST_StartPoint(ST_ExteriorRing (geom))) 
FROM sample_polygon; 
→1, 141.347 
→2, 141.347 
始点(Start Point) 外環(LINESTRING) 
FOSS4G 2014 Tokyo PostGIS入門29
テキスト情報だけでは良く判らないので図化します 
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で接続、表示する 
PostGISレイヤの追加 
接続情報は 
前ページを参照 
接続テストしてみる 
名前の一覧 
接続→テーブル一覧表示→選択して追加 
FOSS4G 2014 Tokyo PostGIS入門31
データのインポート/エクスポート 
FOSS4G 2014 Tokyo PostGIS入門32
データをインポート・エクスポート(Shapefile) 
• デファクトスタンダードであるShapefileをインポート&エクスポートします 
• 今回はPostGIS付属のshp2pgsql/pgsql2shpを使用します 
• WindowsではスタートメニューのPostGIS - PostGIS 2.0 Shapefile and DBF Loader 
ExporterでGUIが起動できます 
• CUIで使いたいときはインストールフォルダのbinにあるshp2pgsql.exe、pgsql2shp.exeを使用し 
ます 
• GUIはちょっと使いにくいかも(^_^; 
• ↑GUIがかなり使いにくくなってるのでCUI(コマンドプロンプト)で作業します・・・ 
FOSS4G 2014 Tokyo PostGIS入門33
1. コマンドプロンプトを起動し、PostgreSQLのインストールフォルダ(C:Program 
FilesPostgreSQL9.3)にあるpg_env.batを実行 
(binフォルダのプログラムが実行出来るようになる) 
2. shp2pgsql とタイプして実行出来ることを確認 
3. Shapefileのあるフォルダに移動(cd) 
4. Prepareモードで実行してテーブル定義作成確認 
5. Createモード(デフォルト)で実行してSQLを作成 
shp2pgsqlはDBにアクセスしない 
6. SQLを実行してDBにデータを投入 
shp2pgsqlの使い方(コマンドプロンプト) 
ファイル・フォルダの指定は 
エクスプローラからコマンドプロンプトに 
ドラッグドロップすると便利です 
内容Shapefile名テーブル名 
行政区域(Polygon) N03-14_12_140401 polygon_adm 
公共施設(Point) P02-06_12-g_PublicFacility point_public 
道路(Line) N01-07L-2K-12_Road line_road 
FOSS4G 2014 Tokyo PostGIS入門34
1. "C:Program FilesPostgreSQL9.3pg_env.bat" (を実行) 
2. shp2pgsql 
3. cd <配布のShapefilesフォルダ> 
文字コード変換(SJIS→UTF8) 
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) 
テーブル名 
ファイル名を指定 
.shpは省略しても良い 
インデックスについては後ほど 
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
shp2pgsqlの使い方(コマンドプロンプト) 
D&D 
shp2pgsql 
shp2pgsql -c ... 
ファイルにリダイレクト 
(パイプでもOK) 
テーブル名にハイフンは 
避けたい 
shp2pgsql -p ... 
FOSS4G 2014 Tokyo PostGIS入門36
pgsql2shpの使い方(エクスポート) 
• PostGISからShapefileをエクスポートするにはpgsql2shp が良く使われます 
• テーブルまたはビューを指定、あるいはSQLクエリ()が利用できます 
• 文字コードはクライアントのエンコーディングに依存します(注意が必要) 
• テーブル/ビューをエクスポート 
SETしないエクスポートも 
試してみましょう 
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'" 
デSQLクエリを記述銚子市の行政コード 
FOSS4G 2014 Tokyo PostGIS入門37
XYデータをインポート(変換) 
• CSVなどをPostgreSQLにインポートしてからジオメトリを作成してみます 
• 今回は千葉市の避難所データを加工したCSVを使用します 
• 文字コードはUTF-8 
• 平面直角9系(JGD2000)に投影変換 
1. ジオメトリを持たないテーブルを作成(SQL) 
CREATE TABLE hinan_point ( 
id integer PRIMARY KEY, 
cls text, pname text, address text, x numeric, y numeric 
); 
2. CSVをインポート(コマンドプロンプト) 
データをインポート 
1. SET PGCLIENTENCODING=UTF8 
2. psql -U demo -d handson -c "COPY hinan_point FROM STDIN CSV HEADER" < chiba-hinan.csv 
標準入力を使用する 
平面直角9系(JGD2000) 
X:東西、Y:南北 
FOSS4G 2014 Tokyo PostGIS入門38
XY列をポイントジオメトリに変換、更に緯度経度に変換します 
1. 数値をポイントジオメトリに変換し、空間参照系を付与する 
SELECT ST_asEWKT(ST_setSRID(ST_MakePoint(x, y), 2446)) FROM hinan_point; 
空間参照系の付与平面直角(9) 
2. JGD2000緯度経度に投影変換する 
SELECT ST_asEWKT(ST_Transform(ST_setSRID(ST_MakePoint(x, y), 2446), 4612)) 
FROM hinan_point; 
座標変換(投影変換) 緯度経度 
3. 今のテーブルにジオメトリを追加する 
ALTER TABLE hinan_point ADD geom GEOMETRY(POINT, 4612); 
4. ジオメトリ属性をアップデートする 
add しただけなので 
geomはNULL 
UPDATE hinan_point 
SET geom = ST_Transform(ST_setSRID(ST_MakePoint(x, y), 2446), 4612); 
5. QGISで確認する 
XYからジオメトリ(投影変換) 
FOSS4G 2014 Tokyo PostGIS入門39
• ST_setSRID()は空間参照系のメタ情報を付与するだけ。投影変換(座標変換)はされません 
• ジオメトリ型にINSERT/UPDATEするときは自動的に投影変換されない 
• 別の空間参照系に変換するにはST_Transform()を使う 
• 平面直角座標系もPostGISではPOINT(東西(X) 南北(Y))。 
生データを扱うときは気をつけましょう 
• GPSログをラインにしたいときは・・・ 
変換のポイント 
SELECT 
gps_track, 
ST_MakeLine(gps.geom ORDER BY gps_time) geom 
FROM gps_points 
GROUP BY gps_track; 
FOSS4G 2014 Tokyo PostGIS入門40
検索する 
FOSS4G 2014 Tokyo PostGIS入門41
前セクションでインポートした国土数値情報の簡単な説明 
テーブル定義 
行政区域 
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 通称 
FOSS4G 2014 Tokyo PostGIS入門42
PostGISを利用することにより、データベースで行える通常の属性検索に加えて、豊富な空間検索が利 
用できます。 
• 属性により千葉市の各区を検索し、面積を計算する 
SELECT n03_003, n03_004, n03_007, 
ST_Area(ST_Transform(geom, 2446)), 
ST_Area(ST_Transform(geom, 32654)) 
FROM polygon_adm 
WHERE n03_003 = '千葉市'; 
2446:平面直角(9) 
32654:UTM54 
• 千葉市内の郵便局を区毎に数える(図形的に) 
PostGISの検索機能 
SELECT 
n03_004, 
count(*) 
FROM polygon_adm a, point_public p 
WHERE n03_003 = '千葉市' 
郵便局:p02_002 = '18' 
AND st_contains(a.geom, p.geom) 
AND p.p02_002 = '18' 
GROUP BY n03_004 
st_contains(a, b) 
aがbを完全に含むならTRUE 
FOSS4G 2014 Tokyo PostGIS入門43
空間インデックスの有無による検索速度を体験してみます 
1. ○○市にある福祉施設をカウント 
SELECT count(*) 
FROM polygon_adm a, point_public p 
WHERE n03_004 like '%市' AND st_contains(a.geom, p.geom) AND p.p02_002 = '19' 
2. 空間インデックスを削除 
DROP INDEX point_public_geom_gist; 
DROP INDEX polygon_adm_geom_gist; 
3. ふたたび1.で検索すると遅くなっているはず 
4. 空間インデックスを再作成 
空間インデックスの効果を体験する 
CREATE INDEX point_public_geom_gist ON point_public USING GiST (geom); 
CREATE INDEX polygon_adm_geom_gist ON polygon_adm USING GiST (geom); 
5. ふたたび1.で検索する 
6. 1.のSELECTの前にEXPLAIN句をつけて、2.~5.を実行してみる 
EXPLAIN SELECT count(*) 
FROM polygon_adm a, point_public p 
WHERE n03_004 like '%市' AND st_contains(a.geom, p.geom) AND p.p02_002 = '19' 
FOSS4G 2014 Tokyo PostGIS入門44
加工する 
FOSS4G 2014 Tokyo PostGIS入門45
• 図形を合成してみます。このSQLそれぞれ結果が1件のみになります(合成の結果) 
SELECT n03_003, ST_Collect(geom) 
FROM polygon_adm 
WHERE n03_003 = '千葉市' 
GROUP BY n03_003; 
集合条件の指定 
• ST_Collect()とST_Union()の違い 
図形の集合 
SELECT n03_003, ST_Union(geom) 
FROM polygon_adm 
WHERE n03_003 = '千葉市' 
GROUP BY n03_003; 
CREATE VIEW collect_polygon as 
SELECT max(id) id, ST_Collect(geom) 
FROM sample_polygon; 
CREATE VIEW union_polygon as 
SELECT max(id) id, ST_Union(geom) 
FROM sample_polygon; 
重複部の座標はそのまま重複部の座標は無くなる 
FOSS4G 2014 Tokyo PostGIS入門46
図形の切り出し 
ある領域に含まれる部分だけを切り出してみます 
• 千葉市の行政界線で道路を切り出します 
1. line_roadテーブルは行政界で分割されているので、路線毎にマージされた作業用テーブルを作成 
します。 
CREATE TABLE union_road AS 
SELECT 
定型文として覚えておくと便利 
ジオメトリが、シンプル→マルチ→マルチ→シンプルと変換される 
n01_002 roadname, 
(ST_Dump(ST_LineMerge(ST_Union(geom)))).Geom geom 
FROM line_road 
GROUP BY n01_002; 
空間インデックスも忘れずに 
CREATE INDEX union_line_geom_gist ON union_road USING GiST (geom); 
2. ジオメトリ間の共有部分を求めるビュー(テーブル)を作成し、Shapefileにエクスポートします。 
CREATE VIEW chiba_road AS 
SELECT 
l.roadname, p.n03_004, 
ST_Intersection(p.geom, l.geom) geom 
FROM polygon_adm p, union_road l 
WHERE St_Intersects(p.geom, l.geom) 
AND n03_003 = '千葉市'; 
QGISでこのViewを参照すると 
エラーになってしまう・・・ 
FOSS4G 2014 Tokyo PostGIS入門47
QGISで表示して確認 
図形の切り出し 
FOSS4G 2014 Tokyo PostGIS入門48
• 外部データのインポート/エクスポートを頻繁に行うならLinuxがお勧めです 
(Windows + GUIでやってみたら結構大変でした・・・) 
• OSGeo4Wというパッケージを使うとWindowsでもFOSS4GツールがCUIで利用出来ます 
• PostGISマニュアル日本語訳は日本特有の問題点、Tipsについても追記されているので 
教科書として最適です(農研機構様に感謝) 
ハンズオンは以上です 
お疲れ様でした! 
終わりに 
FOSS4G 2014 Tokyo PostGIS入門49

Weitere ähnliche Inhalte

Was ist angesagt?

PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介Insight Technology, Inc.
 
外部データラッパによる PostgreSQL の拡張
外部データラッパによる PostgreSQL の拡張外部データラッパによる PostgreSQL の拡張
外部データラッパによる PostgreSQL の拡張Shigeru Hanada
 
ソーシャルゲームログ解析基盤のMongoDB活用事例
ソーシャルゲームログ解析基盤のMongoDB活用事例ソーシャルゲームログ解析基盤のMongoDB活用事例
ソーシャルゲームログ解析基盤のMongoDB活用事例知教 本間
 
Do postgres-dream-of-graph-database
Do postgres-dream-of-graph-databaseDo postgres-dream-of-graph-database
Do postgres-dream-of-graph-databaseToshi Harada
 
[9.5新機能]追加されたgroupbyの使い方
[9.5新機能]追加されたgroupbyの使い方[9.5新機能]追加されたgroupbyの使い方
[9.5新機能]追加されたgroupbyの使い方Kosuke Kida
 
Pgunconf 20121212-postgeres fdw
Pgunconf 20121212-postgeres fdwPgunconf 20121212-postgeres fdw
Pgunconf 20121212-postgeres fdwToshi Harada
 
Hackers Champloo 2016 postgresql-9.6
Hackers Champloo 2016 postgresql-9.6Hackers Champloo 2016 postgresql-9.6
Hackers Champloo 2016 postgresql-9.6Toshi Harada
 
pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)
pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)
pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)Masahiko Sawada
 
Jpug study-pq 20170121
Jpug study-pq 20170121Jpug study-pq 20170121
Jpug study-pq 20170121Kosuke Kida
 
Lt ingaoho-jsonb+postgeres fdw
Lt ingaoho-jsonb+postgeres fdwLt ingaoho-jsonb+postgeres fdw
Lt ingaoho-jsonb+postgeres fdwToshi Harada
 
PostgreSQLでスケールアウト
PostgreSQLでスケールアウトPostgreSQLでスケールアウト
PostgreSQLでスケールアウトMasahiko Sawada
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編Miki Shimogai
 
PGCon.jp 2014 jsonb-datatype-20141205
PGCon.jp 2014 jsonb-datatype-20141205PGCon.jp 2014 jsonb-datatype-20141205
PGCon.jp 2014 jsonb-datatype-20141205Toshi Harada
 
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PostgreSQLではじめるOSS開発@OSC 2014 HiroshimaPostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PostgreSQLではじめるOSS開発@OSC 2014 HiroshimaShigeru Hanada
 
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~Sotaro Kimura
 
Postgre sql9.3新機能紹介
Postgre sql9.3新機能紹介Postgre sql9.3新機能紹介
Postgre sql9.3新機能紹介Daichi Egawa
 
20130203 OSS-DB Exam Silver 技術解説無料セミナー
20130203 OSS-DB Exam Silver 技術解説無料セミナー20130203 OSS-DB Exam Silver 技術解説無料セミナー
20130203 OSS-DB Exam Silver 技術解説無料セミナーKazuko Itoda
 

Was ist angesagt? (20)

pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)pg_bigmを用いた全文検索のしくみ(前編)
pg_bigmを用いた全文検索のしくみ(前編)
 
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
PostgreSQLの新バージョン -PostgreSQL9.4- のご紹介
 
外部データラッパによる PostgreSQL の拡張
外部データラッパによる PostgreSQL の拡張外部データラッパによる PostgreSQL の拡張
外部データラッパによる PostgreSQL の拡張
 
ソーシャルゲームログ解析基盤のMongoDB活用事例
ソーシャルゲームログ解析基盤のMongoDB活用事例ソーシャルゲームログ解析基盤のMongoDB活用事例
ソーシャルゲームログ解析基盤のMongoDB活用事例
 
OSC2015nagoya
OSC2015nagoyaOSC2015nagoya
OSC2015nagoya
 
Do postgres-dream-of-graph-database
Do postgres-dream-of-graph-databaseDo postgres-dream-of-graph-database
Do postgres-dream-of-graph-database
 
[9.5新機能]追加されたgroupbyの使い方
[9.5新機能]追加されたgroupbyの使い方[9.5新機能]追加されたgroupbyの使い方
[9.5新機能]追加されたgroupbyの使い方
 
Pgunconf 20121212-postgeres fdw
Pgunconf 20121212-postgeres fdwPgunconf 20121212-postgeres fdw
Pgunconf 20121212-postgeres fdw
 
Hackers Champloo 2016 postgresql-9.6
Hackers Champloo 2016 postgresql-9.6Hackers Champloo 2016 postgresql-9.6
Hackers Champloo 2016 postgresql-9.6
 
pg_trgmと全文検索
pg_trgmと全文検索pg_trgmと全文検索
pg_trgmと全文検索
 
pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)
pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)
pg_bigm(ピージー・バイグラム)を用いた全文検索のしくみ(後編)
 
Jpug study-pq 20170121
Jpug study-pq 20170121Jpug study-pq 20170121
Jpug study-pq 20170121
 
Lt ingaoho-jsonb+postgeres fdw
Lt ingaoho-jsonb+postgeres fdwLt ingaoho-jsonb+postgeres fdw
Lt ingaoho-jsonb+postgeres fdw
 
PostgreSQLでスケールアウト
PostgreSQLでスケールアウトPostgreSQLでスケールアウト
PostgreSQLでスケールアウト
 
SQLチューニング入門 入門編
SQLチューニング入門 入門編SQLチューニング入門 入門編
SQLチューニング入門 入門編
 
PGCon.jp 2014 jsonb-datatype-20141205
PGCon.jp 2014 jsonb-datatype-20141205PGCon.jp 2014 jsonb-datatype-20141205
PGCon.jp 2014 jsonb-datatype-20141205
 
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PostgreSQLではじめるOSS開発@OSC 2014 HiroshimaPostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
PostgreSQLではじめるOSS開発@OSC 2014 Hiroshima
 
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
 
Postgre sql9.3新機能紹介
Postgre sql9.3新機能紹介Postgre sql9.3新機能紹介
Postgre sql9.3新機能紹介
 
20130203 OSS-DB Exam Silver 技術解説無料セミナー
20130203 OSS-DB Exam Silver 技術解説無料セミナー20130203 OSS-DB Exam Silver 技術解説無料セミナー
20130203 OSS-DB Exam Silver 技術解説無料セミナー
 

Andere mochten auch

Activitat 11 prezi
Activitat 11 preziActivitat 11 prezi
Activitat 11 prezidmagret
 
Competency of the Month: TAKES RESPONSIBILITY FOR THOROUGHNESS AND ACCURACY O...
Competency of the Month: TAKES RESPONSIBILITY FOR THOROUGHNESS AND ACCURACY O...Competency of the Month: TAKES RESPONSIBILITY FOR THOROUGHNESS AND ACCURACY O...
Competency of the Month: TAKES RESPONSIBILITY FOR THOROUGHNESS AND ACCURACY O...Talent Management LLC
 
Competency Snapshot: Coaches Direct Reports
Competency Snapshot: Coaches Direct ReportsCompetency Snapshot: Coaches Direct Reports
Competency Snapshot: Coaches Direct ReportsTalent Management LLC
 
Competency of the Month: Production approach
Competency of the Month: Production approachCompetency of the Month: Production approach
Competency of the Month: Production approachTalent Management LLC
 
Competency of the Month: Seeking interpersonal opportunities
Competency of the Month: Seeking interpersonal opportunitiesCompetency of the Month: Seeking interpersonal opportunities
Competency of the Month: Seeking interpersonal opportunitiesTalent Management LLC
 
Agileload - load testing tool for better web performance
Agileload - load testing tool for better web performanceAgileload - load testing tool for better web performance
Agileload - load testing tool for better web performanceAgileload testing
 
2013_DS5_FinalReview_11N1085_まざりあう人々
2013_DS5_FinalReview_11N1085_まざりあう人々2013_DS5_FinalReview_11N1085_まざりあう人々
2013_DS5_FinalReview_11N1085_まざりあう人々11n1085
 
Infection preverntion
Infection preverntionInfection preverntion
Infection preverntionMfisher420
 
Competency of the Month: Develops comprehensive knowledge
Competency of the Month: Develops comprehensive knowledgeCompetency of the Month: Develops comprehensive knowledge
Competency of the Month: Develops comprehensive knowledgeTalent Management LLC
 
Competency Snapshot: Commits time and effort to achieve results
Competency Snapshot: Commits time and effort to achieve resultsCompetency Snapshot: Commits time and effort to achieve results
Competency Snapshot: Commits time and effort to achieve resultsTalent Management LLC
 

Andere mochten auch (20)

Activitat 11 prezi
Activitat 11 preziActivitat 11 prezi
Activitat 11 prezi
 
「COOLMOSS」
「COOLMOSS」「COOLMOSS」
「COOLMOSS」
 
Competency of the Month: TAKES RESPONSIBILITY FOR THOROUGHNESS AND ACCURACY O...
Competency of the Month: TAKES RESPONSIBILITY FOR THOROUGHNESS AND ACCURACY O...Competency of the Month: TAKES RESPONSIBILITY FOR THOROUGHNESS AND ACCURACY O...
Competency of the Month: TAKES RESPONSIBILITY FOR THOROUGHNESS AND ACCURACY O...
 
Competency Snapshot: Coaches Direct Reports
Competency Snapshot: Coaches Direct ReportsCompetency Snapshot: Coaches Direct Reports
Competency Snapshot: Coaches Direct Reports
 
Rmalberdi
RmalberdiRmalberdi
Rmalberdi
 
Assessment criteria
Assessment criteriaAssessment criteria
Assessment criteria
 
Endurance
EnduranceEndurance
Endurance
 
presentation
presentationpresentation
presentation
 
Competency of the Month: Production approach
Competency of the Month: Production approachCompetency of the Month: Production approach
Competency of the Month: Production approach
 
Competency Snapshot: Image building
Competency Snapshot: Image buildingCompetency Snapshot: Image building
Competency Snapshot: Image building
 
Competency of the Month: Seeking interpersonal opportunities
Competency of the Month: Seeking interpersonal opportunitiesCompetency of the Month: Seeking interpersonal opportunities
Competency of the Month: Seeking interpersonal opportunities
 
Agileload - load testing tool for better web performance
Agileload - load testing tool for better web performanceAgileload - load testing tool for better web performance
Agileload - load testing tool for better web performance
 
Mendel
MendelMendel
Mendel
 
presentation
presentation presentation
presentation
 
Ability to learn the business
Ability to learn the businessAbility to learn the business
Ability to learn the business
 
2013_DS5_FinalReview_11N1085_まざりあう人々
2013_DS5_FinalReview_11N1085_まざりあう人々2013_DS5_FinalReview_11N1085_まざりあう人々
2013_DS5_FinalReview_11N1085_まざりあう人々
 
Li Executive Introduction
Li Executive IntroductionLi Executive Introduction
Li Executive Introduction
 
Infection preverntion
Infection preverntionInfection preverntion
Infection preverntion
 
Competency of the Month: Develops comprehensive knowledge
Competency of the Month: Develops comprehensive knowledgeCompetency of the Month: Develops comprehensive knowledge
Competency of the Month: Develops comprehensive knowledge
 
Competency Snapshot: Commits time and effort to achieve results
Competency Snapshot: Commits time and effort to achieve resultsCompetency Snapshot: Commits time and effort to achieve results
Competency Snapshot: Commits time and effort to achieve results
 

Ähnlich wie PostGIS Handson | FOSS4G Tokyo 2014

FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門
FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門
FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門Hideo Harada
 
pgGeocoderのご紹介
pgGeocoderのご紹介pgGeocoderのご紹介
pgGeocoderのご紹介Ko Nagase
 
Osc shimane-2016-do-postgres-dream-of-graph-database
Osc shimane-2016-do-postgres-dream-of-graph-databaseOsc shimane-2016-do-postgres-dream-of-graph-database
Osc shimane-2016-do-postgres-dream-of-graph-databaseToshi Harada
 
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 TokyoYoshiyuki Asaba
 
20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCache20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCacheKohei KaiGai
 
Extending PostgreSQL - PgDay 2012 Japan
Extending PostgreSQL - PgDay 2012 JapanExtending PostgreSQL - PgDay 2012 Japan
Extending PostgreSQL - PgDay 2012 JapanShigeru Hanada
 
JTF2021w F3 postgresql frontline
JTF2021w F3 postgresql frontlineJTF2021w F3 postgresql frontline
JTF2021w F3 postgresql frontlineHaruka Takatsuka
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackkimukou_26 Kimukou
 
QGISセミナー・中級編 Ver. 2.4版
QGISセミナー・中級編 Ver. 2.4版QGISセミナー・中級編 Ver. 2.4版
QGISセミナー・中級編 Ver. 2.4版FOSS4G_MEXT
 
QGISセミナー中級編(V2.4)
QGISセミナー中級編(V2.4)QGISセミナー中級編(V2.4)
QGISセミナー中級編(V2.4)IWASAKI NOBUSUKE
 
Postgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etcPostgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etckasaharatt
 
160705-03 RTミドルウエア講習会・名城大
160705-03 RTミドルウエア講習会・名城大160705-03 RTミドルウエア講習会・名城大
160705-03 RTミドルウエア講習会・名城大openrtm
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputingNoboru Irieda
 
ET2016 組込みシステムに適した コンポーネントシステムTECSの最新状況
ET2016 組込みシステムに適したコンポーネントシステムTECSの最新状況ET2016 組込みシステムに適したコンポーネントシステムTECSの最新状況
ET2016 組込みシステムに適した コンポーネントシステムTECSの最新状況Takuya Azumi
 
FOSS4G 2012 Tokyo GRASSハンズオン(GRASSを用いた衛星・GISデータ処理の基礎)
FOSS4G 2012 Tokyo GRASSハンズオン(GRASSを用いた衛星・GISデータ処理の基礎)FOSS4G 2012 Tokyo GRASSハンズオン(GRASSを用いた衛星・GISデータ処理の基礎)
FOSS4G 2012 Tokyo GRASSハンズオン(GRASSを用いた衛星・GISデータ処理の基礎)IWASAKI NOBUSUKE
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介Shinya Okano
 
NoSQLデータベースと位置情報
NoSQLデータベースと位置情報NoSQLデータベースと位置情報
NoSQLデータベースと位置情報Koji Ichiwaki
 
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012Shigeru Hanada
 

Ähnlich wie PostGIS Handson | FOSS4G Tokyo 2014 (20)

FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門
FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門
FOSS4G 2014 Hokkaidoハンズオン - PostGIS入門
 
pgGeocoderのご紹介
pgGeocoderのご紹介pgGeocoderのご紹介
pgGeocoderのご紹介
 
Osc shimane-2016-do-postgres-dream-of-graph-database
Osc shimane-2016-do-postgres-dream-of-graph-databaseOsc shimane-2016-do-postgres-dream-of-graph-database
Osc shimane-2016-do-postgres-dream-of-graph-database
 
Qgislecture 0
Qgislecture 0Qgislecture 0
Qgislecture 0
 
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
位置情報を使ったサービス「スマポ」をPostgreSQLで作ってみた db tech showcase 2013 Tokyo
 
PostgreSQL 12の話
PostgreSQL 12の話PostgreSQL 12の話
PostgreSQL 12の話
 
20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCache20210511_PGStrom_GpuCache
20210511_PGStrom_GpuCache
 
Extending PostgreSQL - PgDay 2012 Japan
Extending PostgreSQL - PgDay 2012 JapanExtending PostgreSQL - PgDay 2012 Japan
Extending PostgreSQL - PgDay 2012 Japan
 
JTF2021w F3 postgresql frontline
JTF2021w F3 postgresql frontlineJTF2021w F3 postgresql frontline
JTF2021w F3 postgresql frontline
 
Twitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hackTwitter sphere of #twitter4j #twtr_hack
Twitter sphere of #twitter4j #twtr_hack
 
QGISセミナー・中級編 Ver. 2.4版
QGISセミナー・中級編 Ver. 2.4版QGISセミナー・中級編 Ver. 2.4版
QGISセミナー・中級編 Ver. 2.4版
 
QGISセミナー中級編(V2.4)
QGISセミナー中級編(V2.4)QGISセミナー中級編(V2.4)
QGISセミナー中級編(V2.4)
 
Postgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etcPostgre sql9.3 newlockmode_and_etc
Postgre sql9.3 newlockmode_and_etc
 
160705-03 RTミドルウエア講習会・名城大
160705-03 RTミドルウエア講習会・名城大160705-03 RTミドルウエア講習会・名城大
160705-03 RTミドルウエア講習会・名城大
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
ET2016 組込みシステムに適した コンポーネントシステムTECSの最新状況
ET2016 組込みシステムに適したコンポーネントシステムTECSの最新状況ET2016 組込みシステムに適したコンポーネントシステムTECSの最新状況
ET2016 組込みシステムに適した コンポーネントシステムTECSの最新状況
 
FOSS4G 2012 Tokyo GRASSハンズオン(GRASSを用いた衛星・GISデータ処理の基礎)
FOSS4G 2012 Tokyo GRASSハンズオン(GRASSを用いた衛星・GISデータ処理の基礎)FOSS4G 2012 Tokyo GRASSハンズオン(GRASSを用いた衛星・GISデータ処理の基礎)
FOSS4G 2012 Tokyo GRASSハンズオン(GRASSを用いた衛星・GISデータ処理の基礎)
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介
 
NoSQLデータベースと位置情報
NoSQLデータベースと位置情報NoSQLデータベースと位置情報
NoSQLデータベースと位置情報
 
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
PostgreSQL 9.2 新機能 - 新潟オープンソースセミナー2012
 

PostGIS Handson | FOSS4G Tokyo 2014

  • 2. • 代表的な空間情報DBMSであるPostGISを使用して、構築と解析の初歩までを学びます。 • 本セッションはDBMS、GISについての基礎知識を必要とします。 (質問は随時どうぞ!) • PDF資料からコードをコピー&ペーストすると正しく動作しないことがあります。適宜タイプしなおしてくだ さい。 • 本資料はクリエイティブ・コモンズ表示-継承3.0非移植ライセンスの下に提供されています。 商用利用、改変もOKですが、頒布するには原著作者クレジット(FOSS4G Tokyo)を表示し、本資 料と同一の許諾条件としてください。 • 本ハンズオンは事前に以下の準備を行ってください • PostgreSQL & PostGISのインストール • QGISのインストール はじめに FOSS4G 2014 Tokyo PostGIS入門2
  • 3. • フォルダ: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 : 千葉市のオープンデータ「避難場所・避難所・広域避難場所・津波避難ビル一覧」CSV http://www.city.chiba.jp/somu/kikikanri/hinanbasyoichiran.html の座標を投影変換したCSV • command.txt : この資料のSQL、コマンドを記載 • フォルダ:shapefiles • 前記zipを展開したデータ 配布データについて Slideshareでご覧の方は 各サイトからダウンロードしてください FOSS4G 2014 Tokyo PostGIS入門3
  • 4.  PostGIS概説 ・・・PostGISについての説明、導入するメリットなど  PostGISの準備 ・・・実際に使い始めるまでの説明  テーブルと図形の作成 ・・・基礎的なジオメトリ(図形)の作成と表示  データのインポート/エクスポート ・・・CSV、Shapefileなどから大量にデータをインポート、DBから外部形式にエクスポート  検索する ・・・条件指定(Where)の説明、空間インデックスの説明  加工する ・・・図形の合成、切り出しをSQLで実行する 本セッションの内容 FOSS4G 2014 Tokyo PostGIS入門4
  • 5. PostGIS概説 FOSS4G 2014 Tokyo PostGIS入門5
  • 6. 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以降が対応)、地理データ列の定義方法変更、非推奨関数の多数削除など大きな変更が加え られた。 FOSS4G 2014 Tokyo PostGIS入門6
  • 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 Tokyo PostGIS入門7
  • 8. 主な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
  • 9. PostGIS(PostgreSQL)のメリット PostGIS(GIS DB)を使うべき理由 • オープンソース(GPL) • 標準規格への対応(OpenGIS Consortium、標準SQL) • マルチプラットフォーム • ネットワーク共有が簡単便利(TCP/IP、トランザクショナル) • 豊富な連携ソフトウェア(GDAL/OGRなど) • 情報・知見が得やすい • 拡張性、可用性、保守性に優れる ☆つまり使いやすい PostGIS(PostgreSQL)のデメリット • ファイルベースのデータは手軽(インストール、運用、データコピーetc) • サーバに負荷がかかり易い FOSS4G 2014 Tokyo PostGIS入門9
  • 10. スタンダードフォーマットであるShapefileとの比較 Shapefileとの比較 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 空間インデックスサポート(汎用検索ツリー) サポート(性能は良くないとされる、アプ リ毎に異なるファイル) 共有アクセス同テーブルへの読み書き可能 トランザクション、ロックが可能 高度で安全な共有は期待出来ない FOSS4G 2014 Tokyo PostGIS入門10
  • 11. 図形タイプ(ジオメトリタイプ)  (シングル・シンプル)ポイント、ライン、ポリゴン  マルチポイント、マルチライン、マルチポリゴン  ジオメトリコレクション、TIN、多面体サーフェイス 空間参照系(SRID)  座標系、測地系、投影法、ジオイドなどの定義  SRIDはQGISなどと共通  spatial_ref_sysテーブルに格納されている WKT(Well-Known Text)形式  ベクタ図形情報をテキスト形式で表現するフォーマット  OpenGIS Consortium(OGC)による標準定義  DB(ジオメトリ)にはバイナリ形式(WKB)で格納されている PostGISで使われる用語 FOSS4G 2014 Tokyo PostGIS入門11
  • 12. PostGISの準備 FOSS4G 2014 Tokyo PostGIS入門12
  • 13. PostgreSQL/PostGISのインストール  Windowsは下記ページを参照してください http://www.slideshare.net/hideo0515harada/postgresqlpostgis  Linux(*NIX)はパッケージシステム使用を推奨します。 (GDAL,GEOSなどの依存関係解決のため) PostgreSQL/PostGISのインストール FOSS4G 2014 Tokyo PostGIS入門13
  • 14. 作業用ログインロール(ユーザ)を追加します 今回は説明の都合上、セキュリティ甘めの設定なことをご了承ください 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
  • 15. 作業用ログインロール(ユーザ)の追加 ログインロール(ユーザ)を追加 ロール名:demo ・スーパーユーザ ・Can create database (データベース作成権限) FOSS4G 2014 Tokyo PostGIS入門15
  • 16. データベースを作成(createdb) データベース作成 handson demo CREATE DATABASE WITH ENCODING=‘UTF8’ OWNER=demo CONNECTION LIMIT=-1; FOSS4G 2014 Tokyo PostGIS入門16
  • 18. PostGISエクステンションのインストール 作成したデータベースにPostGISエクステンションを追加します 1. 作成したデータベース(handson)の「Extensions」を右クリック、「New Extension」を選択 2. 「名前」からpostgisを選択(もし見つからなければPostGISを再インストール) 3. データベースの「スキーマ」- publicで関数、テーブル、トリガ、ビューが追加されていることを確認 4. テーブルspatial_ref_sysの内容を確認  PostGISエクステンションはデータベース毎に追加します PostgreSQLサービス ロール(ユーザ) ロール(ユーザ) データベース PL/pgSQL PostGIS データベース PL/pgSQL PostgreSQLの概念図 FOSS4G 2014 Tokyo PostGIS入門18
  • 19. PostGISエクステンションを追加(create extension) PostGISエクステンションのインストール postgis CREATE EXTENSION postgis st_XXX 関数が大量にできる spatial_ref_sysテーブル をデータビューで確認 FOSS4G 2014 Tokyo PostGIS入門19
  • 22. 主キー(serial)idを持つポイントのテーブルを作成します CREATE TABLE sample_point ( id SERIAL PRIMARY KEY, geom GEOMETRY (POINT, 4612) );  「ジオメトリ型」を使用し、図形タイプと空間参照系を指定する  ラインは(MULTI)LINESTRING、ポリゴンは(MULTI)POLYGON  このテーブルの空間参照系はJGD2000緯度経度(SRID:4612)  ジオメトリ(座標)の列名はgeomにするのが一般的 テーブルの作成 FOSS4G 2014 Tokyo PostGIS入門22
  • 23. ちなみにPostGIS 1.xでは... CREATE TABLE sample_point ( id SERIAL PRIMARY KEY ); SELECT AddGeometryColumn ('sample_point', 'the_geom', 4612, 'POINT', 2);  AddGeometryCoumn関数は後方互換のため残されている  ツールによっては、まだこちらが使われている  ツールが古いなどの理由で互換性が必要な場合、PostGISに同梱されているlegacy.sqlを実行 する。 テーブルの作成(PostGIS 1.x) FOSS4G 2014 Tokyo PostGIS入門23
  • 24. よく使われる空間参照系のSRID一覧 よく使われるSRID一覧 測地系座標系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) 900913 3857 (EPSG) FOSS4G 2014 Tokyo PostGIS入門24
  • 25. INSERT文で図形を作成してみます 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; • 文字列'POINT(141.347 43.071)' がWKT • 対になっているXとYはスペースで区切る • [geom]の出力はバイナリ形式(普通の人には読めない) • ST_asText関数により読みやすい形式にする 図形の作成 FOSS4G 2014 Tokyo PostGIS入門25
  • 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入門26
  • 27. ポリゴンジオメトリを持つテーブルを作成、図形を作成します 図形の作成 CREATE TABLE sample_polygon ( id SERIAL PRIMARY KEY, geom GEOMETRY (POLYGON, 4612) ); 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) ); 始点終点は一致させる(閉じる) 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入門27
  • 28. ジオメトリ出力関数で図形を確認してみます 図形を確認する(ジオメトリ出力) WKT表現(ポピュラー) 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,...)) KML、GeoJSON表現(ジオアプリ向け) SELECT ST_asKML(geom) FROM sample_line; → <LineString><coordinates>141.347,... </coordinates></LineString> 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入門28
  • 29. ジオメトリアクセサ関数で図形の構成を確認します 図形を確認する(ジオメトリアクセサ) 座標を取り出す SELECT ST_X(geom), ST_Y(geom), ST_SRID(geom) FROM sample_point; → 141.347, 43.071, 4612 N番目の図形を取り出す SELECT ST_asText(ST_PointN(geom, 3)) FROM sample_line; → POINT(141.342 43.075) ポリゴンは少し複雑です 始点:1から始まる SELECT ST_NRings(geom), ST_X(ST_StartPoint(ST_ExteriorRing (geom))) FROM sample_polygon; →1, 141.347 →2, 141.347 始点(Start Point) 外環(LINESTRING) FOSS4G 2014 Tokyo PostGIS入門29
  • 30. テキスト情報だけでは良く判らないので図化します PostGISだけでは「絵」が作れないので他のソフトを使用します 今回はQGISを利用します 1. QGIS(Desktop)を起動する 2. 「レイヤ」-「PostGISレイヤの追加」を選択する 3. 新規の接続先を作成する 1. 名称:適当 2. ホスト:localhost 3. データベース:handson 4. ユーザ名:demo 5. 接続テストして成功ならOK 4. 戻って「接続」し、テーブルを選んで「追加」する 図化する(QGIS) FOSS4G 2014 Tokyo PostGIS入門30
  • 31. 画面はQGIS 2.4です QGISで接続、表示する PostGISレイヤの追加 接続情報は 前ページを参照 接続テストしてみる 名前の一覧 接続→テーブル一覧表示→選択して追加 FOSS4G 2014 Tokyo PostGIS入門31
  • 33. データをインポート・エクスポート(Shapefile) • デファクトスタンダードであるShapefileをインポート&エクスポートします • 今回はPostGIS付属のshp2pgsql/pgsql2shpを使用します • WindowsではスタートメニューのPostGIS - PostGIS 2.0 Shapefile and DBF Loader ExporterでGUIが起動できます • CUIで使いたいときはインストールフォルダのbinにあるshp2pgsql.exe、pgsql2shp.exeを使用し ます • GUIはちょっと使いにくいかも(^_^; • ↑GUIがかなり使いにくくなってるのでCUI(コマンドプロンプト)で作業します・・・ FOSS4G 2014 Tokyo PostGIS入門33
  • 34. 1. コマンドプロンプトを起動し、PostgreSQLのインストールフォルダ(C:Program FilesPostgreSQL9.3)にあるpg_env.batを実行 (binフォルダのプログラムが実行出来るようになる) 2. shp2pgsql とタイプして実行出来ることを確認 3. Shapefileのあるフォルダに移動(cd) 4. Prepareモードで実行してテーブル定義作成確認 5. Createモード(デフォルト)で実行してSQLを作成 shp2pgsqlはDBにアクセスしない 6. SQLを実行してDBにデータを投入 shp2pgsqlの使い方(コマンドプロンプト) ファイル・フォルダの指定は エクスプローラからコマンドプロンプトに ドラッグドロップすると便利です 内容Shapefile名テーブル名 行政区域(Polygon) N03-14_12_140401 polygon_adm 公共施設(Point) P02-06_12-g_PublicFacility point_public 道路(Line) N01-07L-2K-12_Road line_road FOSS4G 2014 Tokyo PostGIS入門34
  • 35. 1. "C:Program FilesPostgreSQL9.3pg_env.bat" (を実行) 2. shp2pgsql 3. cd <配布のShapefilesフォルダ> 文字コード変換(SJIS→UTF8) 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) テーブル名 ファイル名を指定 .shpは省略しても良い インデックスについては後ほど 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
  • 36. shp2pgsqlの使い方(コマンドプロンプト) D&D shp2pgsql shp2pgsql -c ... ファイルにリダイレクト (パイプでもOK) テーブル名にハイフンは 避けたい shp2pgsql -p ... FOSS4G 2014 Tokyo PostGIS入門36
  • 37. pgsql2shpの使い方(エクスポート) • PostGISからShapefileをエクスポートするにはpgsql2shp が良く使われます • テーブルまたはビューを指定、あるいはSQLクエリ()が利用できます • 文字コードはクライアントのエンコーディングに依存します(注意が必要) • テーブル/ビューをエクスポート SETしないエクスポートも 試してみましょう 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'" デSQLクエリを記述銚子市の行政コード FOSS4G 2014 Tokyo PostGIS入門37
  • 38. XYデータをインポート(変換) • CSVなどをPostgreSQLにインポートしてからジオメトリを作成してみます • 今回は千葉市の避難所データを加工したCSVを使用します • 文字コードはUTF-8 • 平面直角9系(JGD2000)に投影変換 1. ジオメトリを持たないテーブルを作成(SQL) CREATE TABLE hinan_point ( id integer PRIMARY KEY, cls text, pname text, address text, x numeric, y numeric ); 2. CSVをインポート(コマンドプロンプト) データをインポート 1. SET PGCLIENTENCODING=UTF8 2. psql -U demo -d handson -c "COPY hinan_point FROM STDIN CSV HEADER" < chiba-hinan.csv 標準入力を使用する 平面直角9系(JGD2000) X:東西、Y:南北 FOSS4G 2014 Tokyo PostGIS入門38
  • 39. XY列をポイントジオメトリに変換、更に緯度経度に変換します 1. 数値をポイントジオメトリに変換し、空間参照系を付与する SELECT ST_asEWKT(ST_setSRID(ST_MakePoint(x, y), 2446)) FROM hinan_point; 空間参照系の付与平面直角(9) 2. JGD2000緯度経度に投影変換する SELECT ST_asEWKT(ST_Transform(ST_setSRID(ST_MakePoint(x, y), 2446), 4612)) FROM hinan_point; 座標変換(投影変換) 緯度経度 3. 今のテーブルにジオメトリを追加する ALTER TABLE hinan_point ADD geom GEOMETRY(POINT, 4612); 4. ジオメトリ属性をアップデートする add しただけなので geomはNULL UPDATE hinan_point SET geom = ST_Transform(ST_setSRID(ST_MakePoint(x, y), 2446), 4612); 5. QGISで確認する XYからジオメトリ(投影変換) FOSS4G 2014 Tokyo PostGIS入門39
  • 40. • ST_setSRID()は空間参照系のメタ情報を付与するだけ。投影変換(座標変換)はされません • ジオメトリ型にINSERT/UPDATEするときは自動的に投影変換されない • 別の空間参照系に変換するにはST_Transform()を使う • 平面直角座標系もPostGISではPOINT(東西(X) 南北(Y))。 生データを扱うときは気をつけましょう • GPSログをラインにしたいときは・・・ 変換のポイント SELECT gps_track, ST_MakeLine(gps.geom ORDER BY gps_time) geom FROM gps_points GROUP BY gps_track; FOSS4G 2014 Tokyo PostGIS入門40
  • 41. 検索する FOSS4G 2014 Tokyo PostGIS入門41
  • 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 通称 FOSS4G 2014 Tokyo PostGIS入門42
  • 43. PostGISを利用することにより、データベースで行える通常の属性検索に加えて、豊富な空間検索が利 用できます。 • 属性により千葉市の各区を検索し、面積を計算する SELECT n03_003, n03_004, n03_007, ST_Area(ST_Transform(geom, 2446)), ST_Area(ST_Transform(geom, 32654)) FROM polygon_adm WHERE n03_003 = '千葉市'; 2446:平面直角(9) 32654:UTM54 • 千葉市内の郵便局を区毎に数える(図形的に) PostGISの検索機能 SELECT n03_004, count(*) FROM polygon_adm a, point_public p WHERE n03_003 = '千葉市' 郵便局:p02_002 = '18' AND st_contains(a.geom, p.geom) AND p.p02_002 = '18' GROUP BY n03_004 st_contains(a, b) aがbを完全に含むならTRUE FOSS4G 2014 Tokyo PostGIS入門43
  • 44. 空間インデックスの有無による検索速度を体験してみます 1. ○○市にある福祉施設をカウント SELECT count(*) FROM polygon_adm a, point_public p WHERE n03_004 like '%市' AND st_contains(a.geom, p.geom) AND p.p02_002 = '19' 2. 空間インデックスを削除 DROP INDEX point_public_geom_gist; DROP INDEX polygon_adm_geom_gist; 3. ふたたび1.で検索すると遅くなっているはず 4. 空間インデックスを再作成 空間インデックスの効果を体験する CREATE INDEX point_public_geom_gist ON point_public USING GiST (geom); CREATE INDEX polygon_adm_geom_gist ON polygon_adm USING GiST (geom); 5. ふたたび1.で検索する 6. 1.のSELECTの前にEXPLAIN句をつけて、2.~5.を実行してみる EXPLAIN SELECT count(*) FROM polygon_adm a, point_public p WHERE n03_004 like '%市' AND st_contains(a.geom, p.geom) AND p.p02_002 = '19' FOSS4G 2014 Tokyo PostGIS入門44
  • 45. 加工する FOSS4G 2014 Tokyo PostGIS入門45
  • 46. • 図形を合成してみます。このSQLそれぞれ結果が1件のみになります(合成の結果) SELECT n03_003, ST_Collect(geom) FROM polygon_adm WHERE n03_003 = '千葉市' GROUP BY n03_003; 集合条件の指定 • ST_Collect()とST_Union()の違い 図形の集合 SELECT n03_003, ST_Union(geom) FROM polygon_adm WHERE n03_003 = '千葉市' GROUP BY n03_003; CREATE VIEW collect_polygon as SELECT max(id) id, ST_Collect(geom) FROM sample_polygon; CREATE VIEW union_polygon as SELECT max(id) id, ST_Union(geom) FROM sample_polygon; 重複部の座標はそのまま重複部の座標は無くなる FOSS4G 2014 Tokyo PostGIS入門46
  • 47. 図形の切り出し ある領域に含まれる部分だけを切り出してみます • 千葉市の行政界線で道路を切り出します 1. line_roadテーブルは行政界で分割されているので、路線毎にマージされた作業用テーブルを作成 します。 CREATE TABLE union_road AS SELECT 定型文として覚えておくと便利 ジオメトリが、シンプル→マルチ→マルチ→シンプルと変換される n01_002 roadname, (ST_Dump(ST_LineMerge(ST_Union(geom)))).Geom geom FROM line_road GROUP BY n01_002; 空間インデックスも忘れずに CREATE INDEX union_line_geom_gist ON union_road USING GiST (geom); 2. ジオメトリ間の共有部分を求めるビュー(テーブル)を作成し、Shapefileにエクスポートします。 CREATE VIEW chiba_road AS SELECT l.roadname, p.n03_004, ST_Intersection(p.geom, l.geom) geom FROM polygon_adm p, union_road l WHERE St_Intersects(p.geom, l.geom) AND n03_003 = '千葉市'; QGISでこのViewを参照すると エラーになってしまう・・・ FOSS4G 2014 Tokyo PostGIS入門47
  • 49. • 外部データのインポート/エクスポートを頻繁に行うならLinuxがお勧めです (Windows + GUIでやってみたら結構大変でした・・・) • OSGeo4Wというパッケージを使うとWindowsでもFOSS4GツールがCUIで利用出来ます • PostGISマニュアル日本語訳は日本特有の問題点、Tipsについても追記されているので 教科書として最適です(農研機構様に感謝) ハンズオンは以上です お疲れ様でした! 終わりに FOSS4G 2014 Tokyo PostGIS入門49