序章

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

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

前提条件

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

  • 1つのUbuntu14.04サーバー
  • sudo権限を持つroot以外のユーザー。 チュートリアルUbuntu14.04 の初期サーバーセットアップガイドでは、これをセットアップする方法について説明しています。
  • PostgreSQLデータベース。 Ubuntu14.04にPostgreSQLをインストールして使用する方法に関するガイドに従ってください。 このチュートリアルのガイドで設定するtest1データベースとユーザーを使用します。

ステップ1—PostGISをインストールする

PostGISはUbuntuのデフォルトのリポジトリには含まれていませんが、[UbuntuGIS]( https://launchpad.net/~ubuntugis/ )、多数のオープンソースを維持する外部リポジトリから取得できます。 GISパッケージ。 このリポジトリのPostGISパッケージは常に最先端のリリースではないかもしれませんが、それはよく維持されており、ソースからPostGISをコンパイルする必要がありません。 したがって、PostGISをインストールするには、このリポジトリをソースに追加してから、パッケージマネージャーを使用してインストールします。

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

  1. ssh sammy@your_ip_address

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

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

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

Output
Unstable 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を押して警告を受け入れると、ソースが追加されます。

Output
gpg: 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をインストールする前に、利用可能なパッケージのリストを更新して、新しいリポジトリのパッケージがリストに追加されるようにします。

  1. sudo apt-get update

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

  1. sudo apt-get install postgis

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

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

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

空間データを保存する前に、PostGISの機能をデータベースごとにアクティブ化する必要があります。 このチュートリアルを開始する前に行ったUbuntu14.04チュートリアルでPostgreSQLをインストールして使用する方法のtest1データベースとpostgresユーザーを使用します。

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

  1. sudo -i -u postgres

次に、test1データベースに接続します。

  1. psql -d test1

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

  1. CREATE EXTENSION postgis;

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

  1. SELECT PostGIS_version();

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

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

準備は完了です。 タイプ

  1. \q

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

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

  1. su sammy

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

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

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

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

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

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

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

/etc/postgresql/9.3/main/postgresql.conf
shared_buffers = 200MB                  # min 128kB

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

/etc/postgresql/9.3/main/postgresql.conf
work_mem = 16MB                         # min 64kB

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

/etc/postgresql/9.3/main/postgresql.conf
maintenance_work_mem = 128MB            # 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を押して終了し、次にYENTERを押してこのファイルへの変更を保存します。

これらの設定の詳細については、チュートリアル PostgreSQL forSpatialのチューニングを確認してください。

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

  1. sudo service postgresql restart

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

ステップ4—空間データのロード

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

[Natural Earth]( http://www.naturalearthdata.com/ )は、さまざまな規模の全世界の基本データの優れたソースを提供します。 何よりも、このデータはパブリックドメインにあります。

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

  1. cd ~
  1. mkdir nedata

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

  1. cd nedata

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

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

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

  1. sudo apt-get install unzip

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

  1. 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 ファイルは、ShapeFileを構成します。 GISソフトウェアで使用される一般的な地理空間ベクトルデータ形式。 これをtest1データベースにロードできます。

これを行うには、地理空間データ抽象化ライブラリであるGDALをインストールします。 GDALをインストールすると、OGR(OpenGIS Simple Features Reference Implementation)とコマンドogr2ogrも取得します。 これは、ShapefileをPostGISが使用できるデータに変換するために使用するベクターデータ変換ライブラリです。

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

  1. sudo apt-get install gdal-bin

次に、postgresユーザーに再度切り替えます。

  1. sudo -i -u postgres

次に、ogr2ogrを使用して、NaturalEarthから取得したシェープファイルをPostGISテーブルに変換します。

  1. ogr2ogr -f PostgreSQL PG:dbname=test1 -progress -nlt PROMOTE_TO_MULTI /home/sammy/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コマンドは、ファイル内の最初のいくつかのフィーチャに基づいて、ジオメトリタイプを想定します。 インポートするデータには、ポリゴンタイプとマルチパートポリゴン、またはマルチポリゴンが混在しています。 これらを同じフィールドに挿入することはできないため、すべてのフィーチャをマルチパートポリゴンにプロモートし、ジオメトリフィールドはMultiPolygonとして作成されます。

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

/home/sammy/nedata/ne_110m_admin_0_countries.shp

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

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

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

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

  1. ogrinfo -so PG:dbname=test1 ne_110m_admin_0_countries

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

Output
INFO: Open of `PG:dbname=test1' using driver `PostgreSQL' successful. Layer name: ne_110m_admin_0_countries Geometry: Multi Polygon 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データベースに再度ログインします。

  1. psql -d test1

データベース内のテーブルを一覧表示します。

  1. \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テーブルのすべての列を表示する場合は、次のコマンドを発行できます。

  1. \d ne_110m_admin_0_countries

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

 wkb_geometry | geometry(MultiPolygon,4326) |

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

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

  1. SELECT admin, ST_Y(ST_Centroid(wkb_geometry)) as latitude
  2. FROM ne_110m_admin_0_countries
  3. ORDER BY latitude DESC
  4. 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)

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

  1. \q

さまざまなPostGIS関数の詳細については、PostGISドキュメントのPostGISリファレンスセクションを参照してください。

結論

これで、空間クエリ用に構成された空間対応データベースができました。そのデータベースには、さらに調査するために使用できるデータがいくつかあります。

空間クエリを作成するためのより詳細なガイドについては、BoundlessPostGISチュートリアルを参照してください。