Ubuntu14.04にPostGISをインストールして設定する方法
序章
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以外のユーザーでサーバーにログインします。
- ssh sammy@your_ip_address
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の機能をデータベースごとにアクティブ化する必要があります。 このチュートリアルを開始する前に行ったUbuntu14.04チュートリアルでPostgreSQLをインストールして使用する方法のtest1
データベースとpostgres
ユーザーを使用します。
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)
準備は完了です。 タイプ
- \q
SQLセッションを終了し、ターミナルプロンプトに戻ります。
次に、メインユーザーアカウントに戻ります。
- su sammy
これでPostGISがインストールされたデータベースができましたが、PostgreSQLの設定を微調整してスムーズに実行できるようにしましょう。
ステップ3—GISデータベースオブジェクト用にPostgreSQLを最適化する
PostgreSQLは、統合システムから大規模な企業データベースまで、あらゆるもので実行できるように設計されていますが、すぐに使用できるように非常に保守的に構成されています。 GISデータベースオブジェクトはテキストデータと比較して大きいので、これらのオブジェクトでより適切に機能するようにPostgreSQLを構成しましょう。
postgresql.conf
ファイルを編集してPostgreSQLを設定します。 このファイルを開きます。
- sudo nano /etc/postgresql/9.3/main/postgresql.conf
空間データをサポートするために、このファイルに加える必要のある変更がいくつかあります。
まず、shared_buffers
をサーバーのRAMの約75% oに変更する必要があります。 したがって、200MB
は、512MBのRAMを搭載したサーバーに適した値です。 shared_buffers
行を見つけて、次のように変更します。
shared_buffers = 200MB # min 128kB
次に、#work_mem
で始まる行を見つけます。 この行はデフォルトでコメント化されているため、この行のコメントを解除し、その値を16MB
に増やします。
work_mem = 16MB # min 64kB
次に、#maintenance_work_mem
を見つけてコメントを外し、その値を128MB
に増やします。
maintenance_work_mem = 128MB # min 1MB
checkpoint_segments
を見つけ、コメントを外して、その値を6
に変更します。
checkpoint_segments = 6 # in logfile segments, min 1, 16MB each
最後に、#random_page_cost
を探します。 見つけたら、コメントを外し、値を2.0
に設定します。
random_page_cost = 2.0 # same scale as above
CTRL+X
を押して終了し、次にY
とENTER
を押してこのファイルへの変更を保存します。
これらの設定の詳細については、チュートリアル PostgreSQL forSpatialのチューニングを確認してください。
これらの変更を行うには、PostgreSQLを再起動します。
- sudo service postgresql restart
これでPostGISがインストールされ、PostgreSQLが構成されました。 いくつかのデータをデータベースに取り込んで、テストできるようにしましょう。
ステップ4—空間データのロード
いくつかの空間データをデータベースにロードして、このデータをPostgreSQLに取り込むためのツールとプロセスに慣れ、後でいくつかの空間クエリを実行できるようにします。
[Natural Earth]( http://www.naturalearthdata.com/ )は、さまざまな規模の全世界の基本データの優れたソースを提供します。 何よりも、このデータはパブリックドメインにあります。
ホームフォルダに移動し、nedata
という名前の新しいフォルダを作成します。 このフォルダを使用して、ダウンロードするNaturalEarthデータを保持します。
- cd ~
- mkdir nedata
次に、この新しいフォルダに移動します。
- cd nedata
自然地球から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 ファイルは、ShapeFileを構成します。 GISソフトウェアで使用される一般的な地理空間ベクトルデータ形式。 これをtest1
データベースにロードできます。
これを行うには、地理空間データ抽象化ライブラリであるGDALをインストールします。 GDALをインストールすると、OGR(OpenGIS Simple Features Reference Implementation)とコマンドogr2ogr
も取得します。 これは、ShapefileをPostGISが使用できるデータに変換するために使用するベクターデータ変換ライブラリです。
パッケージマネージャーを使用してGDALをインストールします。
- sudo apt-get install gdal-bin
次に、postgres
ユーザーに再度切り替えます。
- sudo -i -u postgres
次に、ogr2ogr
を使用して、NaturalEarthから取得したシェープファイルをPostGISテーブルに変換します。
- 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サイトにアクセスして、オプションの完全なセットを確認してください。
完全なコマンドを実行すると、次の出力が表示されます。
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: 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
データベースに再度ログインします。
- 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関数の詳細については、PostGISドキュメントのPostGISリファレンスセクションを参照してください。
結論
これで、空間クエリ用に構成された空間対応データベースができました。そのデータベースには、さらに調査するために使用できるデータがいくつかあります。
空間クエリを作成するためのより詳細なガイドについては、BoundlessPostGISチュートリアルを参照してください。