PostGISのGEOMのレコードを任意で囲んだPolygonデータに変更する方法をまとめてみた

もう、だいぶ前になりますが

 

・PostGISのGEOMからKMLのPolygonデータを取得する

https://it-trouble.help/postgis%e3%81%aegeom%e3%81%8b%e3%82%89kml%e3%81%aepolygon%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b/

 

・PostGISで国勢調査データをインポートを手軽に始めてみる

https://it-trouble.help/postgis%e3%81%a7%e5%9b%bd%e5%8b%a2%e8%aa%bf%e6%9f%bb%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e3%82%a4%e3%83%b3%e3%83%9d%e3%83%bc%e3%83%88%e3%82%92%e6%89%8b%e8%bb%bd%e3%81%ab%e5%a7%8b%e3%82%81%e3%81%a6/

 

で利用していたGEOMのデータが古くなって、現在のデータと変わってしまったので自分で囲った範囲のPolygonを利用したくなった。

 

どうすればよいのかなって思ってたんだけどなんとかできたのでまとめてみました。

 

手順

※QGISはバージョン3を利用

1.QGISでGoogle MAP等の地図を表示する

・Google MAP表示方法

「XYZ Title」>右クリック>「新しい接続」をクリックする

名前:Google MAP

URL:https://mt1.google.com/vt/lyrs=r&x={x}&y={y}&z={z}

 

 

そうするとGoogleMAPが表示される。最初は青い画面になるのでマウスでスクロールしてズームアウトしてみるとよい

 

 

 

 

2.レイヤー追加して、ポリゴンを作成する

「レイヤ」>「レイヤの作成」>「新規シェープファイルレイヤ」をクリックする

 

 

・下記の内容でOKをクリックする

ファイル名:任意の名前

ファイルエンコーディング:UTF-8

ジオメトリタイプ:ポリゴン

 

 

・編集モードを切り替えて、「ポリゴン地物を追加」アイコンをクリックする

 

・任意の範囲を囲む

 

3.GEOMのデータを出力する

・「レイヤ」>「名前を付けて保存」をクリックする

形式:PostgresSQL SQL dump

ファイル名:任意の名前

CRS:GEOMで利用しているコードと合わせること

ジオメトリタイプ:Polygon

GEOM_TYPE:geography

 

 

・保存したSQL DUMPから中身を取得する

 

上記の赤枠をGEOMのところに上書きすればOK

 

 

ってな感じでGISのPolygonデータを書き換えてみた。

PostGISのGEOMからKMLのPolygonデータを取得する

GEOJSONはこの前やってできたので今度はKMLでポリゴンデータを出力させたいと思います。

地図会社によって仕様も違うのでKMLも覚えておくとよいかと思います。

PostGISの関数としては、ST_AsKmlを使って書き出します。

 

クエリ

select 
ST_AsKml(ST_Transform(geom,4326))
FROM "gis" AS

念のため、4326に変換してます。

 

出力結果

<Polygon>
 <outerBoundaryIs>
  <LinearRing>
   <coordinates>139.77993836890397,35.682253867534506 139.779680869718334,35.682212064625922 139.779548587536368,35.68217003549109 139.779396858574188,35.682095710089015 139.779258852144181,35.681983293625635 139.778870831893755,35.681612957798478 139.778586974557925,35.681268371285832 139.778236888992723,35.6807173185381 139.777969328170087,35.680318550037775 139.77795476398029,35.680294318971747 139.777721337553203,35.679931972562926 139.77756217504276,35.679672613679138 139.777317819897632,35.67929209311027 139.777069754865693,35.678920619219049 139.77687417220443,35.678595681624508 139.776825639520268,35.678504923080197 139.776693048655915,35.678315079697782 139.776546017155965,35.678080935362523 139.776032947375711,35.678300260901807 139.776019985432299,35.678299761794527 139.775547644392447,35.678496992853141 139.775526303811233,35.678460998144971 139.775387649679828,35.678514520882544 139.775415211873053,35.678555060678221 139.775130839822026,35.678679812873597 139.775123269786491,35.67868244995244 139.775604616795988,35.679487613946471 139.77650216388264,35.680954425049173 139.77665873864899,35.68121029828712 139.776729706531881,35.681326277647244 139.776705934992265,35.681339188476954 139.777292109231411,35.682256713986504 139.777304481338319,35.682260768874684 139.778041140731347,35.68341842109114 139.778080795512523,35.683544525656814 139.778102822498482,35.683566612319595 139.778162123968286,35.683795362483508 139.778398190283724,35.683639068421975 139.778656446530846,35.684023923652148 139.778651885980196,35.68402702004466 139.778657172316827,35.684035472801241 139.779526055894024,35.683445923773562 139.779571064636997,35.683410910110489 139.779952790438017,35.682266936774973 139.77993836890397,35.682253867534506</coordinates>
  </LinearRing>
 </outerBoundaryIs>
</Polygon>

 

あとは、KMLのフォーマットに従ってPolygon部分に上部の内容を記述すればOKです。

 

境界線のみにしたい場合は

select 
ST_AsKml(ST_ExteriorRing(ST_Transform(geom,4326)))
FROM "gis" AS

 

境界線のみの結果

<LineString>
   <coordinates>139.77993836890397,35.682253867534506 139.779680869718334,35.682212064625922 139.779548587536368,35.68217003549109 139.779396858574188,35.682095710089015 139.779258852144181,35.681983293625635 139.778870831893755,35.681612957798478 139.778586974557925,35.681268371285832 139.778236888992723,35.6807173185381 139.777969328170087,35.680318550037775 139.77795476398029,35.680294318971747 139.777721337553203,35.679931972562926 139.77756217504276,35.679672613679138 139.777317819897632,35.67929209311027 139.777069754865693,35.678920619219049 139.77687417220443,35.678595681624508 139.776825639520268,35.678504923080197 139.776693048655915,35.678315079697782 139.776546017155965,35.678080935362523 139.776032947375711,35.678300260901807 139.776019985432299,35.678299761794527 139.775547644392447,35.678496992853141 139.775526303811233,35.678460998144971 139.775387649679828,35.678514520882544 139.775415211873053,35.678555060678221 139.775130839822026,35.678679812873597 139.775123269786491,35.67868244995244 139.775604616795988,35.679487613946471 139.77650216388264,35.680954425049173 139.77665873864899,35.68121029828712 139.776729706531881,35.681326277647244 139.776705934992265,35.681339188476954 139.777292109231411,35.682256713986504 139.777304481338319,35.682260768874684 139.778041140731347,35.68341842109114 139.778080795512523,35.683544525656814 139.778102822498482,35.683566612319595 139.778162123968286,35.683795362483508 139.778398190283724,35.683639068421975 139.778656446530846,35.684023923652148 139.778651885980196,35.68402702004466 139.778657172316827,35.684035472801241 139.779526055894024,35.683445923773562 139.779571064636997,35.683410910110489 139.779952790438017,35.682266936774973 139.77993836890397,35.682253867534506</coordinates>
</LineString>

 

PostGISで国勢調査データをインポートを手軽に始めてみる

PostGISを初めて見ようと思いましたが何が何やら・・・。そんなときは、簡単なWindowsでGUIでざくざくっと進む方法を試してみようと思います。初めてって、ちょっとしたことで躓くんですよね。

準備するもの

※PostgreSQLとPostGISのバージョンは合わせたものを利用する。

・Windows版のPostgreSQLをインストールします。

↓ダウンロードURL(Windows版)

https://www.postgresql.org/download/windows/

 

・PostGISをインストールします。

↓ダウンロードURL

http://download.osgeo.org/postgis/windows/

 

・PgAdmin4をインストール(PostgreSQLの管理用)

https://www.pgadmin.org/download/windows4.php

 

 

・インポートするデータ

今回は国勢調査データを利用します。

http://www.e-stat.go.jp

※細かいデータは割愛

 

インポート先のデータベースを準備する

・PgAdmin4を起動し、localのPostgreSQLのサーバーに接続します。それでテスト用データベースを作成します。

※PgAdmin4の動きが遅いので気を付けて操作します。

gistest2

 

PostGISを有効にするために下記のqueryを実行する

CREATE EXTENSION postgis ;
CREATE EXTENSION pgrouting ;

posgis4

 

コマンドでは「select postgis_full_version();」を実行する

posgis5

 

インポートを行う

・PostGIS Shapefile Import/Export Managerを起動します

・「View Connection details…」をクリックして、PostgreSQLへの接続情報を入力します。

 

posgis

 

・あらかじめダウンロードしておいた、国勢調査のデータを解凍するといくつかファイルがあります。そのうち、「shp」「dbf」「prj」「shx」の4つのファイルをインポート時に利用するのでセットのフォルダにおいてください。

 

・「AddFile」ボタンをクリックして、「shp」ファイルを指定します。次に、「Import」ボタンをクリックしてインポートを行います。

※SRIDは「4326」でインポートをする。(図は0となっているが4326で。)用語参照

 

 

posgis2

 

・インポートはあっという間に終わるのでそしたら「PgAdmin4」戻って、Tablesにインポートしたテーブルがあるのか確認します。

↓東京都新宿区のデータを取り込んでみました。

posgis3

 

インポートしたものをQGISで表示してみる

何がどうしてどーなるのか不明なため、とりあえずインポートしたデータが閲覧できるのか試してたいと思いQGISを利用します。

・QGISをダウンロードしてインストールする(http://www.qgis.org/ja/site/

 

・QGISの「レイヤ」>「レイヤの追加」>「PostGISレイヤの追加…」をクリックします。

gistest1-1

 

・「PostGISテーブルの追加」の「新規」クリックして、「接続先のPOSTGISの設定を登録」します。

gistest1-2

 

・「接続」ボタンをクリックして、インポートしたテーブルを選択し、「追加」ボタンをクリックします。

gistest1-3

 

追加完了すると画面上に表示されます。

gistest1-4

 

動いているって感じですね・・。

 

この後はポリゴン用のデータをクエリで取り出したいんだけど、どうするのかな・・・。

 

GeoJSONで出力する(クエリ処理)

ポリゴンをMAPで表示するときにGeoJSON形式のファイルを読み込みます。それなのでGeoJSONの形式出力をいろいろなところを参考にして試してみました。

・geom列をGeoJSON形式にしてgeometryとして出力

 

SELECT ST_AsGeoJSON(geom)::json AS geometry
FROM "h22ka13104"

↓なんかそれっぽくみえるけど。。。

gistest1-5

あれ、出力の値が想定と違う・・・。SRID:4326で出力したいのだが・・・。

→インポートの時にSRIDの指定を間違えていたので失敗していた。

 

 

PSQLのコマンドメモ

psql -t -f ファイル名.sql -U postgres テーブル名 > 出力ファイル名

 

 

緯度経度から住所変換

ST_Withinを使えば可能。取得した緯度経度の測地系に気を付ける。

 

 

町丁目をクリック→選択

gis

それっぽい感じになりました。

 

 

 

 

 

 

 

 

GIS系の用語メモ

GIS系を行うのに必要な用語をメモしていきます。(順番はいい加減)

 

GeoJSON

GeoJSON は地理的データ構造をエンコードするフォーマット。WEBの地図処理とかで呼び出したりする。ポリゴンで表示など。

項目「Point」「MultiPoint」「LineString」「MultiLineString」「Polygon」「MultiPolygon」「GeometryCollection」「Feature」および 「FeatureCollection」

↓GeoJSONの例。(途中まで)

{
"type": "FeatureCollection",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature", "properties": { "AREA": 112729.1, "PERIMETER": 1412.091, "H22KA07_": 0, "H22KA07_ID": 0, "KEN": "13", "CITY": "121", "KEN_NAME": "東京都", "SITYO_NAME": null, "GST_NAME": "足立区", "CSS_NAME": null, "HCODE": 8101, "KIHON1": "0560", "DUMMY1": "-", "KIHON2": "04", "KEYCODE1": "121056004", "KEYCODE2": "121056004", "AREA_MAX_F": "M", "KIGO_D": null, "N_KEN": null, "N_CITY": null, "N_C1": 0, "KIGO_E": null, "KIGO_I": null, "TATE": 0, "DIR": 0, "HIGHT": 50, "JIKAKU": 10, "NMOJI": 5, "MOJI": "舎人4丁目", "SEQ_NO2": 35, "KSUM": 11, "CSUM": 13, "JINKO": 1308, "SETAI": 537, "X_CODE": 139.76834, "Y_CODE": 35.81636, "KCODE1": "0560-04", "KEY_CODE": "13121056004", "H22KA08_": 0, "H22KA08_ID": 0, "H22KA09_": 0, "H22KA09_ID": 0, "H22KA10_": 0, "H22KA10_ID": 0, "H22KA11_": 0, "H22KA11_ID": 0, "H22KA12_": 0, "H22KA12_ID": 0, "H22KA13_": 36, "H22KA13_ID": 35, "H22KA14_": 0, "H22KA14_ID": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.76589447006901, 35.815886118688148 ], [ 139.76527407268324, 35.816474041642074 ], [ 139.76534109478362, 35.816560517752059 ], [ 139.76555450862287, 35.816756946246784 ], [ 139.76592110875313, 35.817133308099315 ], [ 139.76601098726658, 35.8172158180219 ], [ 139.76611019076961, 35.817306888885959 ], [ 139.7663117335197, 35.817410727229259 ], [ 139.76648459410444, 35.817437564741297 ], [ 139.76699815377583, 35.817495486421407 ], [ 139.76746042670152, 35.817503187340954 ], [ 139.7680296430818, 35.817530203967543 ], [ 139.76854158598266, 35.817531730913302 ], [ 139.76882512017042, 35.817530545459476 ], [ 139.76931308042126, 35.81749344954499 ], [ 139.76972958710317, 35.817451014904343 ], [ 139.77018222143045, 35.8173750259933 ], [ 139.77064120444956, 35.817271135529531 ], [ 139.77096537198017, 35.817174215246744 ], [ 139.77087370806458, 35.816156679324521 ], [ 139.77083618032464, 35.815812262594285 ], [ 139.77079459788948, 35.815257311246484 ], [ 139.77077919551215, 35.815129617631968 ], [ 139.77074661251717, 35.814840640032578 ], [ 139.77068517976758, 35.814910814871581 ], [ 139.77049007399171, 35.815066442644081 ], [ 139.77029499549406, 35.815186596997457 ], [ 139.77016624503878, 35.815223534118161 ], [ 139.77004129820463, 35.815240421552687 ], [ 139.76989332755093, 35.81524323069582 ], [ 139.76982981226894, 35.815253759872938 ], [ 139.76928490333881, 35.81524959778659 ], [ 139.76889366728773, 35.815267556566724 ], [ 139.76875341995995, 35.81526139014035 ], [ 139.76858797627472, 35.815275226323742 ], [ 139.76831527659638, 35.815285553829995 ], [ 139.76807913530615, 35.81525796282358 ], [ 139.76792805080711, 35.815242652804216 ], [ 139.76752144321972, 35.815206306408349 ], [ 139.76719224394441, 35.815152819239046 ], [ 139.76703827417114, 35.815144249045751 ], [ 139.7666212259337, 35.815213749837213 ], [ 139.7665428217843, 35.815278191663865 ], [ 139.76642176558491, 35.815409823767808 ], [ 139.76627857818133, 35.815545668488816 ], [ 139.76630800167496, 35.815550279677829 ], [ 139.76625271120187, 35.815610509111544 ], [ 139.76610340540543, 35.815773161888863 ], [ 139.76603933601913, 35.815824513633885 ], [ 139.76593236605495, 35.815910275738624 ], [ 139.76589447006901, 35.815886118688148 ] ] ] } },

参考

http://www.postgresonline.com/journal/archives/267-Creating-GeoJSON-Feature-Collections-with-JSON-and-PostGIS-functions.html

 

SRID

SRIDは空間参照の識別コードを示す整数値
SRID 測地系 座標系 用途
4612 JGD2000 地理座標系
4326 WGS84 地理座標系 GPS系で得られる位置
3857 WGS84 球面(半径6378137m)メルカトル図法 地図アプリケーション
900913 WGS84 球面(半径6378137m)メルカトル図法 地図アプリケーション

 

pgRouting

PostgreSQLの拡張機能で経路検索に特化したもの。

 

 

うーん、初めての人には難しいな・・・。

QGISでGoogle MAPを表示する

QGISでGoogleMAPの表示方法を悩んだので忘れないようにメモしておきます。

手順

(1)「プラグイン」>「プラグインの管理とインストール」をクリック

(2)「OpenLayers Plugin」を検索→インストール

(3)「Web」>「OpenLayersPlugin」>「Google MAPS」>「Google Streets」をクリック

qgis

 

これでGoogle MAPが表示されました。