MySQL では、ある座標系(空間参照系と呼びます。Spatial Reference System = SRS)で定義された空間データを、別の座標系に変換することができます。この機能は、異なるソースのデータを扱う場合や、特定の投影法で地図を可視化したい場合などに役立ちます。この記事では、異なるソースから取得した都市のデータとハイキングコースのデータ(それぞれGPS座標と平面図法の地図座標を利用)を、MySQLを使って正確に同じ地図上に表示させる方法を解説します。

SRSのサポートはMySQL8.0で導入され、現在はMySQL Community Edition、Enterprise Edition、およびHeatWave MySQLで利用できます。SRS には、地球の楕円体モデルをベースに極座標(経緯度)を定義する「地理座標系 (Geographic)」と、地図平面上に座標を投影する「投影座標系 (Projected)」の2種類があります。MySQLには5000を超えるSRSがカタログとして標準サポートされており、ユーザーが独自にSRSを定義することも可能です。MySQL 9.2.0では、新しい動的権限CREATE_SPATIAL_REFERENCE_SYSTEMが導入され、過度に危険な権限を与えなくとも、カスタムSRSの作成・置換・削除を行えるようになりました。

なぜSRS変換が重要になるのか

たとえばGPSなどで使われる、事実上の世界標準であるWGS84地理座標系(SRID 4326)で座標が記された、地球上の都市のポイントを表すデータセットがあるとします。一方、ローカルエリアのハイキングコースを示す地図は、イギリス国内で一般的に使用される平面投影系座標、British National Grid(SRID 27700)を使っている場合があります。同じ地図上に都市を表示したいとき、WGS84の座標は楕円体面上の位置を示すのに対し、British National Gridは平面上の位置を示すため、両者で表される同一地点の座標値が異なります。

ここでMySQLの空間関数ST_Transformが役立ちます。WGS84の都市座標をBritish National Gridに変換することで、ハイキングコースの地図上に正確に都市を配置できるようになります。

ハイキングマップ
ハイキングコース(オレンジ色)とイギリス北西部のレイクディストリクト周辺の地図。地図データは2024-09-24時点のOpenStreetMapから取得。

ST_Transformの仕組み

ST_Transformは主に2つの引数を取ります:

  • ジオメトリ: 変換対象となる空間オブジェクト(ポイントやライン、ポリゴンなど)
  • 変換先座標のSRID: 変換先の座標系を示すSRID

この時、関数は入力されたジオメトリと同じタイプの新しいジオメトリを返しますが、その座標は指定した変換先SRIDに対応する座標系に合わせて変換されています。

使用例

たとえば、citiesというテーブルがあり、その中にlocationという列があって、WGS84(SRID4326)で定義された都市の座標が格納されているとします。

CREATE TABLE cities (
name VARCHAR(45) PRIMARY KEY,
location GEOMETRY NOT NULL SRID 4326
)ENGINE=InnoDB;

このテーブルにいくつか都市データを挿入してみましょう。

INSERT INTO cities (name, location)
VALUES ('London', ST_Geomfromtext('POINT(51.509865 -0.118092)', 4326)),
       ('Edinburgh', ST_Geomfromtext('POINT(55.953251 -3.188267)', 4326));

次に、これらのポイントを British National Grid(SRID 27700)に変換するクエリは以下のようになります。

SELECT name, ST_AsText(ST_Transform(location, 27700)) AS location_british_national_grid
FROM cities;

このクエリでは、都市名と、ST_Transformで座標をSRID 27700に変換したジオメトリが取得できます。ST_AsText関数を使えば、変換後のジオメトリを人間が読みやすいテキスト形式で表示できます。

+--------------+-----------------------------------------------+
| name         | location_british_national_grid                |
+--------------+-----------------------------------------------+
| Edinburgh    | POINT(325899.1849114155 673995.7129374838)    |
| London       | POINT(530695.3868317431 180671.48838623578)   |
+--------------+-----------------------------------------------+

さらに今度は、イギリス国内のハイキングコースの座標(British National Grid)を、たとえばETRS89-extended(SRID 3035)などの別の投影系に変換したい場合にも、ST_Transformを使えば簡単に行えます。

以下のクエリは、ロンドンの座標(SRID 27700)を ETRS89-extended(SRID 3035)に変換する例です。

SELECT ST_AsText(ST_Transform(ST_Geomfromtext('POINT(530695.3868317431 180671.48838623578)', 27700), 3035));
+------------------------------------------------------------------------------------------------------+
| ST_AsText(ST_Transform(ST_Geomfromtext('POINT(530695.3868317431 180671.48838623578)', 27700), 3035)) |
+------------------------------------------------------------------------------------------------------+
| POINT(3621142.4074678584 3204082.1556793484)                                                         |
+------------------------------------------------------------------------------------------------------+

実用的なアプリケーション

実際にST_Transform が活躍するシーンを考えてみましょう。

Web マップは通常、Web Mercator 投影(SRID 3857)をデフォルトの SRS として使います。もしあなたのデータが別の SRS(例: WGS 84)で定義されている場合、ST_Transform を使って Web Mercator に変換すれば、正確に地図上へ可視化できます。 ローカル SRS の活用 州や国など、特定の地域向けに設計されたローカル SRS を使うと、その地域での空間解析や可視化の精度が高まります。たとえば、WGS 84 で定義されたカリフォルニア州のデータを、カリフォルニアをカバーする UTM ゾーン (たとえば UTM 10N、SRID 32610) に変換することで、より精密な空間解析や可視化が可能になります。 異なるソースのデータを統合 さまざまなソースから取得したデータを重ね合わせる場合、各データセットが別々の SRS を使っていることがあります。ST_Transform を使って共通の SRS に変換すれば、正確なオーバーレイや解析が行えます。

  1. Webマップでのデータ表示: Webマップは通常、Webメルカトル投影(SRID 3857)をデフォルトのSRSとして使います。もし使いたいデータが別のSRS(例: WGS84)で定義されている場合、ST_Transformを使ってWebメルカトルに変換すれば、正確に地図上に表示できます。
  2. ローカルSRSとの連携: 州や国など、特定の地域向けに設計されたローカルSRSは、その地域での正確な表示に特化しているため、空間解析や可視化の精度が高まります。たとえば、WGS84で定義されたカリフォルニア州のデータを、カリフォルニアをカバーするUTMゾーン (たとえば UTM 10N、SRID 32610) に変換することで、より精密な空間解析や可視化が可能になります。
  3. 異なるソースのデータを統合: さまざまなソースから取得したデータを重ね合わせる場合、各データセットが個別のSRSを使っていることがあります。ST_Transformを使って共通のSRSに変換すれば、正確なオーバーレイや解析が行えます。

ST_TransformとST_SRIDの用途の違いに注意

ST_TransformST_SRIDの用途の違いは重要です。ST_SRIDはジオメトリのSRIDを変更するだけで、座標値そのものを変換しません。実際の座標変換は行われず、座標値を保存したまま投影法の差し替えだけを行うため、座標を正しく投影変換したい場合は必ずST_Transformを使う必要があります。

まとめ

MySQL 8.0以降で利用可能なST_Transform関数は、空間データをある座標系 (SRS) から別の座標系に変換する機能を提供し、異なるソースのデータを正確に表示・解析するうえで不可欠です。特に、地球全球でよく使われるWGS84地理座標系 (SRID 4326) と、イギリス国内で用いられる地図座標系 British National Grid (SRID 27700) の間の変換のように、地理座標系と投影座標系を相互に変換するときに威力を発揮します。たとえば、WGS84で定義された都市の座標データを British National Grid 座標によるハイキングコースの地図データに合わせて変換することで、同じ地図上に正しく配置することが可能になります。こうした機能は、Webマッピングや地域分析、複数ソースのデータを統合する場面で非常に有用で、空間データを扱う際の柔軟性と正確性が向上します。これらの機能はMySQL Community Edition、Enterprise Edition、およびHeatWave MySQLで利用できます。