MySQLにおける「地球の形」の定義

はじめに
前回は、MySQLにおける「地球の形」のモデルが 「ST_SPATIAL_REFERENCE_SYSTEMS」テーブルで定義されていることを紹介しました。今回は、その中から日本で使われる地球の形の定義について詳細に解説します。
日本に関する定義を見てみる
日本の地理情報データの世界では、以前より使われていた「Tokyo測地系」(日本測地系)から2002年に「世界測地系」と呼ばれる「JGD2000」を経て、「JGD2011」が現行となっています(2025年4月に「JGD2024」が公開されましたが、SRS_IDがまだ付与されていないなど、データとして実用的に利用できる状態になっているとは言いがたいため、ここではJGD2011をMySQL上の現行として紹介しています)。
これらのモデルには「SRS_ID」というIDが付与されており、MySQLを含むほとんどのGISツールではこのSRS_IDを使用してデータを取り扱います。SRS_IDは「SRID」と呼ばれることもあります。
| 名称 | SRS_ID(SRID) | 使用時期 |
|---|---|---|
| Tokyo | 4301 | ~2002年 |
| JGD2000 | 4612 | 2002年〜 |
| JGD2011 | 6668 | 2011年〜 |
MySQLにおける、これらのSRS_IDの定義を見てみましょう。MySQLでは「INFORMATION_SCHEMA」の「ST_SPATIAL_REFERENCE_SYSTEMS」テーブルに登録されているのでした。
mysql> use INFORMATION_SCHEMA; mysql> SELECT * FROM ST_SPATIAL_REFERENCE_SYSTEMS WHERE SRS_ID IN (4301, 4612, 6668); +----------+--------+--------------+--------------------------+-------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------- -----------------------------------------+-------------+ | SRS_NAME | SRS_ID | ORGANIZATION | ORGANIZATION_COORDSYS_ID | DEFINITION | DESCRIPTION | +----------+--------+--------------+--------------------------+-------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------- -----------------------------------------+-------------+ | Tokyo | 4301 | EPSG | 4301 | GEOGCS["Tokyo",DATUM["Tokyo",SPHEROID["Bessel 1841",6377397.155,299.1528128,AUTHORITY["EPSG","7004"]],TOWGS84[-147,506,687,0,0,0,0],AUTHORITY ["EPSG","6301"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.017453292519943278, AUTHORITY["EPSG","9122"]],AXIS["Lat",NORTH],AXIS["Lon",EAST],AUTHORITY["EPSG","4301"]] | NULL | | JGD2000 | 4612 | EPSG | 4612 | GEOGCS["JGD2000",DATUM["Japanese Geodetic Datum 2000",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],TOWGS84 [0,0,0,0,0,0,0],AUTHORITY["EPSG", "6612"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.017453292519943278, AUTHORITY["EPSG","9122"]],AXIS["Lat",NORTH],AXIS["Lon",EAST],AUTHORITY["EPSG","4612"]] | NULL | | JGD2011 | 6668 | EPSG | 6668 | GEOGCS["JGD2011",DATUM["Japanese Geodetic Datum 2011",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY ["EPSG","1128"]],PRIMEM ["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.017453292519943278,AUTHORITY["EPSG", "9122"]],AXIS["Lat",NORTH],AXIS["Lon",EAST],AUTHORITY["EPSG","6668"]] | NULL | +----------+--------+--------------+--------------------------+-------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------- -----------------------------------------+-------------+ 3 rows in set (0.000 sec)
とても見にくいので、mysqlクライアントコマンドの"\G"機能を使って縦表示してみましょう。ここでは「JGD2011(SRS_ID:6668)」のみを表示してみています。
mysql> SELECT * FROM ST_SPATIAL_REFERENCE_SYSTEMS WHERE SRS_ID=6668\G
*************************** 1. row ***************************
SRS_NAME: JGD2011
SRS_ID: 6668
ORGANIZATION: EPSG
ORGANIZATION_COORDSYS_ID: 6668
DEFINITION: GEOGCS["JGD2011",DATUM["Japanese Geodetic Datum 2011",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","1128"]],PRIMEM
["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.017453292519943278,AUTHORITY
["EPSG","9122"]],AXIS["Lat",NORTH],AXIS["Lon",EAST],AUTHORITY["EPSG","6668"]]
DESCRIPTION: NULL
1 row in set (0.000 sec)
JGD2011の定義
まだ、とても見やすいとは言いがたいですね。詳細な定義が記述されているDESCRIPTION列を整形してみます。
GEOGCS[
"JGD2011",
DATUM[
"Japanese Geodetic Datum 2011",
SPHEROID[
"GRS 1980",
6378137,298.257222101,
AUTHORITY["EPSG","7019"]
],
AUTHORITY["EPSG","1128"]
],
PRIMEM[
"Greenwich",
0,
AUTHORITY["EPSG","8901"]
],
UNIT[
"degree",
0.017453292519943278,
AUTHORITY["EPSG","9122"]
],
AXIS["Lat",NORTH],
AXIS["Lon",EAST],
AUTHORITY["EPSG","6668"]
]
さらに、今は意識しなくてよい項目(一部のAUTHORITY項目)を除去したものが以下になります。ずいぶんとスッキリとして、見通しが良くなりましたね。これを順に眺めていきましょう。
GEOGCS[
"JGD2011",
DATUM[
"Japanese Geodetic Datum 2011",
SPHEROID[
"GRS 1980",
6378137,
298.257222101,
],
],
PRIMEM[
"Greenwich", 0,
],
UNIT[
"degree",
0.017453292519943278,
],
AXIS["Lat",NORTH],
AXIS["Lon",EAST],
AUTHORITY["EPSG","6668"]
]
最初の「GEOGCS」というのが「地理座標系の定義ですよ」という意味です。つまり「これは丸い地球の定義です」ということです。その中に順に"JGD2011"という名前とDATUM、PRIMEM、UNIT、AXIS、そしてこの定義のコードである「AUTHORITY」が記述されています。
DATUM
"Japanese Geodetic Datum 2011"という名称であることが示された後に、SPHEROIDでこのモデルでの地球の形を示しています。"GRS 1980"という名前のモデルで、その長半径は6,378,137m(6378.137km)、扁平率は298.257222101であると示されています。扁平率とは長半径(赤道半径)よりも短半径(極半径)がどれだけ短いかを表す数値です。JGD2011の場合は赤道半径が6378.137km、極半径がそれよりも298.257222101分の1だけ短い回転楕円体をモデルとしている、ということがこの定義から分かります。
PRIMEM
本初子午線(Prime meridian)の情報を示します。私はこれをずっと「PRIme MEridian」の略だと理解して、最後の"M"の出所がないことを不思議に思っていたのですが、本稿を書くにあたり改めてよく向き合ってみたら単にPRIME Meridianであることに気づきました。
本初子午線というと日本の明石市を通る東経135度をイメージされた方もいるのではないかと思いますが、それは「日本の(時刻に関する)本初子午線」です。本初子午線という言葉自体は「基準となる子午線(経線)」という程度の意味なので、日本の時刻の話をしているときは明石市のことを指しますし、地球規模の位置の話をしているときには一般に地球上の基準となる子午線のことを指すというわけです。
MySQLでの定義を見てみると"Greenwich"で「0」と示されています。「グリニッジを基準として、その経度は0です」という内容です(この0の意味については、のちの連載でもう少し解説する予定です)。
UNIT
角度を表す単位に関する情報を示しています。degree(度)を使用し、1度は0.017453292519943278ラジアンであることが記述されています。これは2π/360の値です。
AXIS
"Lat"が北向き(NORTH)で、"Lon"が東向き(EAST)であることが示されています。Latは「Latitude」(緯度)の略、Lonは「Longitude」(経度)の略です。実際にSQLで位置情報を記述する際は(緯度 経度)の順で記述することがこの定義により決められています。
おわりに
一見複雑なST_SPATIAL_REFERENCE_SYSTEMSの定義ですが、かみ砕いてみると必要な情報がコンパクトに記述されていることが分かります。この連載ではこのあと数回、ST_SPATIAL_REFERENCE_SYSTEMSテーブルと戯れてみます。定義テーブルの魅力をとことんお楽しみください。
一定の年代より上の読者は「本初子午線(東経西経ゼロ度)はイギリスのグリニッジ天文台を通っている」と習ったことを覚えていると思います。もう少し詳しい方は「天文台にある観測機器(子午環)を通る」ということをご存じだったかもしれません。
実はそれ、古い情報なのです。
その後の精密な測量の結果少しずれていることが分かり、現在の本初子午線は子午環の約102.5m東側を通っている線として決められているのです。経度は恣意的に決定するものなので「それでも天文台の子午環を本初子午線とする」という選択肢もあったものと思いますが、「それまでに積み重ねられた膨大な測量結果との整合」という課題への対応としてこのようになったのではないかと推測しています。


