ServBay で PostGIS を使う:PostgreSQL へ地理空間機能を追加
PostGIS
は、PostgreSQL データベースを地理空間データ型、関数、インデックスに対応させる強力な拡張機能です。これにより、データベース内でポイントやライン、多角形などの地理空間情報を保存し、複雑な空間クエリや分析が実行できます。地図や位置情報サービス、位置連動型 Web アプリケーションを開発するエンジニアにとって、PostGIS は欠かせないツールです。
ServBay は macOS に特化したローカル Web 開発環境であり、PostgreSQL パッケージと共に PostGIS 拡張機能をデフォルトで同梱しています。これにより、PostGIS をローカルで利用する際のセットアップが非常に簡単になり、面倒なビルドや依存関係のインストールは不要です。
このガイドでは、ServBay 環境下で PostGIS を有効化し、プロジェクトに空間機能を素早く追加する方法を解説します。
事前準備
PostGIS を使い始める前に、以下の作業を完了していることを確認してください。
- ServBay のインストールと起動: macOS に ServBay を正常にインストール済みであること。
- PostgreSQL パッケージの有効化と起動: ServBay のコントロールパネルで、PostgreSQL パッケージが有効かつ実行中であることを確認します。未有効の場合はチェックを入れて起動してください。
- PostgreSQL への接続方法: コマンドラインツール
psql
や、TablePlus・pgAdmin などのGUIクライアントを用いて、ServBay 上の PostgreSQL データベースへ接続する手順を理解しておきましょう。デフォルトではpsql -U postgres
でローカルに接続できます。
PostGIS 拡張機能のインストールと有効化
ServBay には PostGIS 拡張ファイルがプリインストールされています。あとは、PostGIS を使いたいデータベースで「拡張機能を有効化」するだけです。
PostGIS を有効化する手順は以下の通りです。
対象の PostgreSQL データベースへ接続: ターミナルを開き、
psql
コマンドでデータベースへ接続します。your_username
はデータベースのユーザー名(例:postgres
)、your_database
は PostGIS を有効化したいデータベース名に置き換えてください。bashpsql -U your_username -d your_database
1デフォルトの
postgres
ユーザー+データベースで有効化したい場合は、次のようにシンプルに実行できます。bashpsql -U postgres
1PostGIS 拡張機能の作成: 接続後、
psql
のコマンドラインで次の SQL を実行します。sqlCREATE EXTENSION postgis;
1このコマンドは、現在接続中のデータベースへ PostGIS の必要なオブジェクト(新たなデータ型、関数、演算子など)をインストール&設定します。
PostGIS の有効化確認:
psql
コマンドラインで\dx
を実行すれば、インストール済み拡張一覧が表示されます。sql\dx
1問題なく有効になっていれば、
postgis
エントリーとそのバージョン情報がリストに現れます。List of installed extensions Name | Version | Schema | Description -----------+---------+------------+-------------------------------------------------------------- plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language postgis | 3.3.2 | public | PostGIS geometry and geography spatial types and functions (2 rows)
1
2
3
4
5
6※ PostGIS のバージョンは ServBay のバージョンによって異なる場合があります。
これで、目的の PostgreSQL データベースで PostGIS 拡張機能が有効化され、地理空間機能を使い始める準備が整いました。
PostGIS データの設定
PostGIS を有効化後、新しいテーブルで地理空間データを扱うことも、既存テーブルに空間カラムを追加することも可能です。PostGIS には主に geometry
と geography
という2種の空間データ型があります。geometry
は平面座標系での計算に、geography
は球面(地球表面)を考慮した計算に向いており、通常は緯度経度のデータ保存や計算に適しています。
地理空間カラムを含むテーブルの作成
以下は、地点情報用カラムを含む locations
テーブルを作成する例です。
テーブルの作成:
psql
もしくはGUIクライアントで以下を実行します。sqlCREATE TABLE locations ( id SERIAL PRIMARY KEY, name VARCHAR(100), geom GEOMETRY(Point, 4326) );
1
2
3
4
5GEOMETRY(Point, 4326)
:geom
カラムの型を「幾何データ型・ポイント型(SRID: 4326)」で定義します。SRID 4326 は WGS84 で、GPS や多くのオンライン地図(OpenStreetMap や Google Maps など)で使われる標準の緯度経度座標系です。- 必要に応じて他のジオメトリタイプ(
LineString
,Polygon
,MultiPoint
など)や別の SRID も利用可能です。
サンプルデータの挿入: PostGIS 関数を使い、空間オブジェクトを挿入します。
ST_GeomFromText()
は、WKT(Well-Known Text)形式からジオメトリを生成する関数です。sqlINSERT INTO locations (name, geom) VALUES ('ServBay 本社', ST_GeomFromText('POINT(116.4074 39.9042)', 4326)), -- 北京の例 ('ServBay 上海オフィス', ST_GeomFromText('POINT(121.4737 31.2304)', 4326)); -- 上海の例
1
2
3POINT(経度 緯度)
の順序は WKT 標準です。
空間インデックスの作成
大量の空間データを扱うテーブルでは、空間インデックスがクエリ性能に大きく寄与します。特に範囲検索や包含判定、近傍検索を実施する場合は必須です。PostGIS では一般的に GiST (Generalized Search Tree) インデックスが使われます。
GiST インデックスの作成:
psql
もしくはGUIクライアントで以下を実行します。sqlCREATE INDEX idx_locations_geom ON locations USING GIST (geom);
1これで
locations
テーブルのgeom
カラムに GiST インデックスが張られます。PostgreSQL のクエリエンジンはこのインデックスを自動的に活用し、高速な空間クエリを実現します。
PostGIS で地理空間クエリを行う
PostGIS には数百もの空間操作関数があります。Web アプリ開発でよく使うクエリ例を紹介します。
2点間の距離を計算する
2地点間の直線距離を求めます。
SELECT ST_Distance(
ST_GeomFromText('POINT(116.4074 39.9042)', 4326), -- 点A
ST_GeomFromText('POINT(121.4737 31.2304)', 4326) -- 点B
);
2
3
4
ST_Distance()
: 2つのジオメトリ間の距離を計算します。SRID 4326 のgeometry
型では度単位の概算値となるため、より正確にメートル単位で求めたい場合はgeography
型またはST_Distance(geography_a, geography_b, use_spheroid)
関数を利用してください。
包含関係のチェック
あるジオメトリが他方を内包しているか判定する例。たとえば、ある点が特定エリア(多角形)内にあるかを調べます。
SELECT name FROM locations
WHERE ST_Contains(
ST_GeomFromText('POLYGON((116.0 39.0, 117.0 39.0, 117.0 40.0, 116.0 40.0, 116.0 39.0))', 4326), -- 長方形の例
geom
);
2
3
4
5
ST_Contains(geometry A, geometry B)
: ジオメトリ A が B を完全に内包している場合に true を返します。
最近傍検索
特定の点から最も近いロケーションを探す例です。GiST インデックスを利用できるため非常に高速です。
SELECT name, ST_Distance(geom, ST_GeomFromText('POINT(116.4074 39.9042)', 4326)) AS distance
FROM locations
ORDER BY geom <-> ST_GeomFromText('POINT(116.4074 39.9042)', 4326) -- <->演算子で距離でソート
LIMIT 5;
2
3
4
<->
演算子は PostGIS 独自の「距離」演算子で、GiST インデックスと連携することで効率よく最近傍検索が可能です。
PostGIS で地理空間分析を行う
基本的なクエリ以外にも、PostGIS はバッファ作成・交差判定・ジオメトリの合成といった高度な分析機能を提供します。
バッファ分析
指定した距離分だけ周囲を取り囲むバッファ領域(多角形)を生成します。
SELECT ST_Buffer(geom, 0.01) -- 度単位のバッファ作成(0.01度は約1.1km)
FROM locations
WHERE name = 'ServBay 本社';
2
3
ST_Buffer(geometry, distance)
: 指定距離のバッファを生成します。geometry
型(SRID 4326) では単位は「度」です。
交差分析
2つ以上のジオメトリの重なり部分を算出し、交差領域の新しいジオメトリを返します。
SELECT ST_Intersection(
ST_GeomFromText('POLYGON((116.0 39.0, 117.0 39.0, 117.0 40.0, 116.0 40.0, 116.0 39.0))', 4326),
geom
)
FROM locations
WHERE name = 'ServBay 本社';
2
3
4
5
6
ST_Intersection(geometry A, geometry B)
: A・Bの交差部分を新たなジオメトリとして返します。
合成分析
複数のジオメトリをひとつにまとめる処理です。
SELECT ST_Union(geom)
FROM locations;
2
ST_Union(geometry set)
: 入力ジオメトリ群を合成し、単一のジオメトリとして返します。
地理空間データの可視化
PostGIS データベースに保存された地理空間データの可視化は、Web 開発でもよく求められます。デスクトップ GIS ツールや Web 用地図ライブラリが活用できます。
デスクトップ GIS ツール(例:QGIS)を使う
QGIS は人気のオープンソース GIS ソフトで、PostGIS データベースに直接接続し可視化することができます。
ServBay の PostgreSQL に接続:
- QGIS を起動
- メニューの
Layer
(レイヤ) ->Add Layer
(レイヤ追加) ->Add PostGIS Layers...
(PostGIS レイヤ追加)を選択 - 表示されたウィンドウで
New
(新規)をクリックし、接続情報を登録- Name(名前):例
ServBay PostGIS
- Host(ホスト):
localhost
または127.0.0.1
- Port(ポート):デフォルトは
5432
(ServBay も同じ) - Database(データベース):PostGIS 有効化済みのデータベース名
- Username(ユーザー名):例
postgres
- Password(パスワード):設定した場合のみ
- Name(名前):例
Test Connection
で接続確認し、OK で保存→ウィンドウ本体でConnect
(接続)をクリック
地理空間データのロード:
- 接続成功後、全テーブルが表示されます
- 空間カラムがあるテーブル(例:locations)を選択
- 必要なテーブルで
Add
(追加)→Close
(閉じる)とすれば、地図上にデータが表示されます
Web 地図ライブラリ(例:Leaflet)を使う
フロントエンドでは、JavaScript の地図ライブラリ(Leaflet, OpenLayers, Mapbox GL JS など)で、バックエンド経由で PostGIS から取得したデータを可視化できます。以下は Leaflet を使いシンプルな地図を HTML で表示する例です。バックエンド(PHP, Node.js, Python ほか。いずれも ServBay で動作可能)で PostGIS のデータを取得し、GeoJSON で返却してください。
この HTML ファイルを ServBay のウェブサイトディレクトリ(デフォルト /Applications/ServBay/www
)配下(例:/Applications/ServBay/www/postgis-map/index.html
)に保存し、postgis-map.servbay.demo
など ServBay 上のローカルサイトでアクセスしてください。
<!DOCTYPE html>
<html>
<head>
<title>ServBay PostGIS Leaflet Example</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<style>
#map { height: 400px; width: 100%; } /* 地図コンテナのサイズを設定 */
</style>
</head>
<body>
<h1>PostGIS データ可視化例(Leaflet)</h1>
<div id="map"></div>
<script>
// 地図を初期化し、センター座標・ズームレベルを設定
// サンプルは北京付近をセンターにしています
var map = L.map('map').setView([39.9042, 116.4074], 10);
// OpenStreetMap タイルレイヤを追加
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
// サンプル:マーカーを手動で追加(実際は PostGIS から動的に取得)
// このポイントは前述の『ServBay 本社』サンプルデータの位置
var marker = L.marker([39.9042, 116.4074]).addTo(map)
.bindPopup('<b>ServBay 本社</b><br>サンプル位置')
.openPopup();
// 実プロジェクトでは Ajax でバックエンドから PostGIS データ(GeoJSON)を取得して可視化してください
/*
fetch('/api/locations') // バックエンドが /api/locations で GeoJSON を返す前提
.then(response => response.json())
.then(data => {
L.geoJSON(data).addTo(map);
});
*/
</script>
</body>
</html>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
これは Leaflet のごく基本的なサンプルです。PostGIS データベースからデータを読み込むには、バックエンド側でデータベース接続し、空間データを GeoJSON へ変換し、HTTP経由でフロントエンドへ提供してください。ServBay なら PHP も Node.js も Python も利用できるので、柔軟に実装可能です。
よくある質問 (FAQ)
Q:
CREATE EXTENSION postgis;
でエラーが出る場合は?- A: 正しく PostgreSQL に接続できているか、データベースユーザーに拡張作成権限があるか(通常
postgres
ユーザーならOK)をまず確認してください。また、ServBay 側で PostgreSQL パッケージが稼働中であることも要チェック。解決できない場合は、ServBay および PostgreSQL のログを確認しましょう。
- A: 正しく PostgreSQL に接続できているか、データベースユーザーに拡張作成権限があるか(通常
Q: SRID 4326 とは?他の SRID は使える?
- A: SRID(空間参照ID)は座標系を一意に識別する番号です。4326 は WGS84 緯度経度座標系で、Web地図で広く用いられます。もちろん他の SRID(例えば投影座標系代表例: Web Mercator の 3857 など)も利用できます。データソースや用途に適した SRID を選択しましょう。Web 表示・緯度経度ベースなら 4326 または 3857 が一般的です。
Q:
geometry
型とgeography
型はどう違う?- A:
geometry
は平面直交座標での計算(ユークリッド幾何)です。geography
型は地球の曲面(球体)を考慮し、緯度経度の測地計算ができます。小範囲・高精度な地球曲率補正が要らない場合や演算速度重視ならgeometry
型、地球全体スケールや距離・面積の精確な計測にはgeography
型が推奨です。
- A:
まとめ
PostGIS は PostgreSQL に強力な地理空間データ処理機能をもたらし、位置情報アプリ構築の土台となります。ServBay 環境を使えば、macOS のローカルで PostGIS を手軽に利用開始でき、複雑なセットアップは不要です。
本記事では ServBay で PostGIS 拡張機能を有効化する手順、地理空間データの作成・管理・典型的な空間クエリ・分析、簡易ビジュアライズ方法まで紹介しました。これらの基礎を押さえれば、PostGIS を活用した本格的な地理空間 Web アプリ開発が可能です。PostGIS の公式ドキュメントには、ここで紹介しきれない多数の関数・機能が掲載されていますので、ぜひ探索してみてください。