前書き

PostGISは、PostgreSQLリレーショナルデータベースの空間拡張です。 PostGISを使用すると、ジオメトリおよび地理データタイプを使用して空間データを保存し、空間関数で空間クエリを実行して面積、距離、長さ、および境界を決定し、データに空間インデックスを作成して空間クエリを高速化できます。

このガイドでは、PostGISをインストールし、空間データ用にPostgreSQLを構成し、いくつかの空間オブジェクトをデータベースにロードし、基本的なクエリを実行します。

前提条件

このガイドを始める前に、次のものが必要です。

  • Ubuntu 14.04サーバー1台

  • sudo特権を持つ非rootユーザー。 チュートリアルhttps://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04[Ubuntu 14.04の初期サーバーセットアップガイド]は、これを設定する方法を説明しています。

  • PostgreSQLデータベース。 https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu-14-04 [Ubuntu 14.04にPostgreSQLをインストールして使用する方法]のガイドに従ってください。 このチュートリアルでは、このガイドで設定する「+ test1 +」データベースとユーザーを使用します。

ステップ1-PostGISのインストール

PostGISはUbuntuのデフォルトリポジトリに含まれていませんが、https://launchpad.net/%7Eubuntugis/ [UbuntuGIS]から入手できます。これは、多数のオープンソースGISパッケージを保持する外部リポジトリです。 このリポジトリ内のPostGISパッケージは常に最新のリリースではないかもしれませんが、適切に維持され、ソースからPostGISをコンパイルする必要がなくなります。 したがって、PostGISをインストールするには、このリポジトリをソースに追加し、パッケージマネージャーでインストールします。

非rootユーザーでサーバーにログインします。

ssh @

Ubuntu 14.04を使用しているため、リポジトリの不安定なブランチが必要になります。 次のコマンドを実行して、リポジトリをソースに追加します。

sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable

次の出力が表示されます。

OutputUnstable releases of Ubuntu GIS packages. These releases are more bleeding edge and while generally they should work well, they dont receive the same amount of quality assurance as our stable releases do.
More info: https://launchpad.net/~ubuntugis/+archive/ubuntu/ubuntugis-unstable
Press [ENTER] to continue or ctrl-c to cancel adding it

`+ ENTER +`を押して警告を承認すると、ソースが追加されます:

Outputgpg: keyring `/tmp/tmpintg192h/secring.gpg' created
gpg: keyring `/tmp/tmpintg192h/pubring.gpg' created
gpg: requesting key 314DF160 from hkp server keyserver.ubuntu.com
gpg: /tmp/tmpintg192h/trustdb.gpg: trustdb created
gpg: key 314DF160: public key "Launchpad ubuntugis-stable" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
OK

PostGISをインストールする前に、利用可能なパッケージのリストを更新して、新しいリポジトリからのパッケージがリストに追加されるようにします。

sudo apt-get update

ソースが更新されたら、PostGISをインストールします。

sudo apt-get install postgis

PostGISを必要な依存関係とともにインストールするように求められたら、「+ Y +」を入力します。

これで、PostgreSQLに接続してPostGISを統合できます。

ステップ2-PostGISで空間機能を有効にする

空間データを保存する前に、PostGIS機能をデータベースごとにアクティブにする必要があります。 https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu-の `+ test1 `データベースと ` postgres +`ユーザーを操作します14-04 [Ubuntu 14.04にPostgreSQLをインストールして使用する方法]チュートリアルは、このチュートリアルを開始する前に実行しました。

`+ sudo `コマンドを使用して、 ` postgres +`ユーザーに切り替えます。

sudo -i -u postgres

次に、 `+ test1 +`データベースに接続します:

psql -d test1

次に、データベースでPostGIS拡張機能を有効にします。

CREATE EXTENSION postgis;

すべてが正しく機能したことを確認しましょう。 次のコマンドを実行してください。

SELECT PostGIS_version();

次の出力が表示されます。

Output            postgis_version
---------------------------------------
2.2 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
(1 row)

準備は整いました。 Type

\q

SQLセッションを終了して、ターミナルプロンプトに戻ります。

次に、メインユーザーアカウントに切り替えます。

su

PostGISがインストールされたデータベースが作成されましたが、PostgreSQLの設定を微調整して、スムーズに実行できるようにします。

ステップ3-GISデータベースオブジェクト用にPostgreSQLを最適化する

PostgreSQLは、統合システムから大規模な企業データベースまであらゆるもので動作するように設計されていますが、すぐに使用できるように非常に保守的に構成されています。 GISデータベースオブジェクトは、テキストデータに比べて大きいため、これらのオブジェクトで動作するようにPostgreSQLを設定してみましょう。

`+ postgresql.conf +`ファイルを編集してPostgreSQLを設定します。 このファイルを開きます:

sudo nano /etc/postgresql/9.3/main/postgresql.conf

空間データをサポートするには、このファイルにいくつかの変更を加える必要があります。

まず、 `+ shared_buffers `をサーバーのRAMの約75%に変更する必要があります。 したがって、「 200MB 」は512MBのRAMを搭載したサーバーに適した値です。 ` shared_buffers +`行を見つけて、次のように変更します。

/etc/postgresql/9.3/main/postgresql.conf

shared_buffers =                   # min 128kB

次に、 `#work_mem +`で始まる行を見つけます。 この行はデフォルトでコメント化されているため、この行のコメントを外し、値を「 16MB +」に増やします:

/etc/postgresql/9.3/main/postgresql.conf

work_mem =                          # min 64kB

次に、「#maintenance_work_mem +」を見つけてコメントを外し、値を「 128MB +」に増やします。

/etc/postgresql/9.3/main/postgresql.conf

maintenance_work_mem =             # min 1MB

`+ checkpoint_segments `を見つけてコメントを外し、値を ` 6 +`に変更します。

/etc/postgresql/9.3/main/postgresql.conf

checkpoint_segments = 6         # in logfile segments, min 1, 16MB each

最後に、「#random_page_cost +」を探します。 見つかったらコメントを外し、値を「+2.0」に設定します。

/etc/postgresql/9.3/main/postgresql.conf

random_page_cost = 2.0                 # same scale as above

`+ CTRL + X `を押して終了し、次に ` Y `と ` ENTER +`を押してこのファイルへの変更を保存します。

これらの設定の詳細については、チュートリアルhttp://workshops.boundlessgeo.com/postgis-intro/tuning.html[Tuning PostgreSQL for Spatial]をご覧ください。

これらの変更を行うには、PostgreSQLを再起動します。

sudo service postgresql restart

これで、PostGISがインストールされ、PostgreSQLが構成されました。 いくつかのデータをデータベースに入れて、テストできるようにします。

ステップ4-空間データの読み込み

データベースにいくつかの空間データをロードして、このデータをPostgreSQLに取り込むためのツールとプロセスに精通し、後で空間クエリを実行できるようにします。

Natural Earthは、さまざまなスケールで全世界の基本データの優れたソースを提供します。 とりわけ、このデータはパブリックドメインにあります。

ホームフォルダーに移動し、「+ nedata +」という新しいフォルダーを作成します。 このフォルダーを使用して、ダウンロードするNatural Earthデータを保持します。

cd ~
mkdir nedata

次に、この新しいフォルダーに移動します。

cd nedata

Natural Earthから1:110mの国のデータセットをダウンロードします。 `+ wget +`を使用して、そのファイルをサーバーにプルダウンします。

wget http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_countries.zip

ダウンロードしたファイルは圧縮されているため、パッケージマネージャーからインストールできる `+ unzip +`コマンドが必要です。 次のコマンドでインストールしてください。

sudo apt-get install unzip

次に、ファイルを解凍します。

unzip ne_110m_admin_0_countries.zip

これで、フォルダーに6つの追加ファイルが追加されます。

  • + ne_110m_admin_0_countries.README.html

  • + ne_110m_admin_0_countries.VERSION.txt +

  • + ne_110m_admin_0_countries.dbf +

  • + ne_110m_admin_0_countries.prj +

  • + ne_110m_admin_0_countries.shp +

  • + ne_110m_admin_0_countries.shx +

  • .dbf 。prj 。shp 、および .shp *ファイルは、http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/Shapefile_file_extensions/を構成します。 005600000003000000 / [ShapeFile]、GISソフトウェアで使用される一般的な地理空間ベクトルデータ形式。 これを「+ test1 +」データベースにロードできます。

これを行うために、地理空間データ抽象化ライブラリhttp://www.gdal.org/[GDAL]をインストールします。 GDALをインストールすると、OGR(OpenGIS Simple Features Reference Implementation)とコマンド `+ ogr2ogr +`も取得されます。 これは、シェープファイルをPostGISが使用できるデータに変換するために使用するベクターデータ変換ライブラリです。

パッケージマネージャーを使用してGDALをインストールします。

sudo apt-get install gdal-bin

次に、 `+ postgres`ユーザーに再び切り替えます。

sudo -i -u postgres

次のように、 `+ ogr2ogr +`を使用して、Natural Earthから取得したShapefileをPostGISテーブルに変換します。

ogr2ogr -f PostgreSQL PG:dbname=test1 -progress -nlt PROMOTE_TO_MULTI /home//nedata/ne_110m_admin_0_countries.shp

そのコマンドを分解して、各オプションを詳細に見てみましょう。 まず、このオプションを指定します。

-f PostgreSQL

このスイッチは、出力ファイルタイプがPostgreSQLテーブルであることを示します。

次に、このオプションがあります:

PG:dbname=test1

これにより、データベースへの接続文字列が設定されます。 ここではデータベース名を指定していますが、別のユーザー、ホスト、ポートを使用する場合は、次のようにオプションを指定できます。

PG:"dbname='databasename' host='addr' port='5432' user='x' password='y'"

オプションのリストの次はこれです:

-progress

このオプションは進行状況バーを表示するため、プロセスを視覚化できます。

次に、この引数を渡します。

-nlt PROMOTE_TO_MULTI

PostgreSQLはオブジェクトタイプに厳しいです。 `+ ogr2ogr +`コマンドは、ファイル内の最初のいくつかの機能に基づいてジオメトリタイプを仮定します。 インポートするデータには、* Polygon タイプとマルチパートポリゴン、または MultiPolygons が混在しています。 これらは同じフィールドに挿入できないため、すべてのフィーチャをマルチパートポリゴンにプロモートし、ジオメトリフィールドは MultiPolygon *として作成されます。

最後に、入力ファイルへのパスを指定します。

/home//nedata/ne_110m_admin_0_countries.shp

ogr2ogr Webサイトにアクセスして、オプションの完全なセットを確認してください。

完全なコマンドを実行すると、次の出力が表示されます。

Output0...10...20...30...40...50...60...70...80...90...100 - done.

`+ ogrinfo +`コマンドを使用して、データがインポートされたことを確認できます。 次のコマンドを実行してください。

ogrinfo -so PG:dbname=test1 ne_110m_admin_0_countries

これにより、次の出力が表示されます。

OutputINFO: Open of `PG:dbname=test1'
     using driver `PostgreSQL' successful.

Layer name:
Geometry:
Feature Count: 177
Extent: (-180.000000, -90.000000) - (180.000000, 83.645130)
Layer SRS WKT:
GEOGCS["WGS 84",
   DATUM["WGS_1984",
       SPHEROID["WGS 84",6378137,298.257223563,
           AUTHORITY["EPSG","7030"]],
       AUTHORITY["EPSG","6326"]],
   PRIMEM["Greenwich",0,
       AUTHORITY["EPSG","8901"]],
   UNIT["degree",0.0174532925199433,
       AUTHORITY["EPSG","9122"]],
   AUTHORITY["EPSG","4326"]]
FID Column = ogc_fid
Geometry Column = wkb_geometry
scalerank: Integer (4.0)
featurecla: String (30.0)

...

region_wb: String (254.0)
name_len: Real (16.6)
long_len: Real (16.6)
abbrev_len: Real (16.6)
tiny: Real (16.6)
homepart: Real (16.6)

データベースには空間データがありますので、それを使用して問題を解決する方法を見てみましょう。

ステップ5-空間データのクエリ

世界で最も北にある10か国を見つけるように求められたとします。 PostGISとインポートしたデータを使用すると簡単です。

`+ test1 +`データベースに再度ログインします。

psql -d test1

データベース内のテーブルをリストします。

\dt

これにより、2つのテーブルが返されます。

Output                   List of relations
Schema |           Name            | Type  |  Owner
--------+---------------------------+-------+----------
public | ne_110m_admin_0_countries | table | postgres
public | spatial_ref_sys           | table | postgres
(2 rows)

「+ ne_110m_admin_0_countries 」テーブルを使用します。このテーブルには、質問への回答に役立つデータが含まれています。 このテーブルには、国の名前を含む「 admin 」列と、幾何学的データを含む「 wkb_gemoetry 」列があります。 ` ne_110m_admin_0_countries +`テーブルのすべての列を表示したい場合、次のコマンドを発行できます。

\d ne_110m_admin_0_countries

列とそのデータ型が表示されます。 `+ wbk_geometry +`カラムのデータ型は次のようになります。

wkb_geometry | geometry(MultiPolygon,4326) |

`+ wbk_geometry `列にはポリゴンが含まれています。 国とその不規則な境界線を扱っているため、データベースの各国に緯度の単一の値はありません。 各国の緯度を取得するには、まずPostGISの ` ST_Centroid `関数を使用して各国の重心を見つけます。 次に、 ` ST_Y +`関数を使用して重心のY値を抽出します。 その値を緯度として使用できます。

実行するクエリは次のとおりです。

SELECT admin, ST_Y(ST_Centroid(wkb_geometry)) as latitude
FROM ne_110m_admin_0_countries
ORDER BY latitude DESC
LIMIT 10;

最も北にある国の緯度が最も高いため、結果を降順で並べます。

そのクエリを実行すると、最も北の上位10か国が表示されます。

Output   admin   |    latitude
-----------+------------------
Greenland | 74.7704876939899
Norway    | 69.1568563971328
Iceland   |  65.074276335291
Finland   | 64.5040939185674
Sweden    | 62.8114849680803
Russia    | 61.9808407507127
Canada    | 61.4690761453491
Estonia   |  58.643695240707
Latvia    | 56.8071751342793
Denmark   | 56.0639344617945
(10 rows)

答えが得られたので、次のコマンドでデータベースを終了できます。

\q

PostGISドキュメントのhttp://postgis.net/docs/reference.html[PostGISリファレンス]セクションで、さまざまなPostGIS関数の詳細を見つけることができます。

結論

これで、空間クエリ用に構成された空間的に有効化されたデータベースがあり、そのデータベースにいくつかのデータがあり、さらなる調査に使用できます。

空間クエリの作成に関する詳細なガイドについては、http://workshops.boundlessgeo.com/postgis-intro/index.html [Boundless PostGIS Tutorial]を参照してください。