mita2 database life

主にMySQLに関するメモです

MySQL GISのSRID 0(直行座標)を理解する

MySQLで20年ほど遊んでいますが・・・知らないことも、まだまだあります。 GIS(Geographic Information System、地理・空間情報) はそのうちの1つです。ということで、ほとんど触れたことのない、GISを入門してみます。

なお、このエントリーは MySQL 8.0 を前提としています。

デフォルトのSRIDは0(直行座標)

デフォルトは SRID 0です。 SRID0 は直行座標(Cartesian plane=デカルト座標)です。実際の地球ではなく、数学の授業で出てきたようなXY座標上の地点を表します。

SRID 0 represents an infinite flat Cartesian plane with no units assigned to its axes.

https://dev.mysql.com/doc/refman/8.0/en/spatial-function-argument-handling.html

ST_Distance 関数を使って、直行座標であることを確認してみます。

原点(0,0) から (10, 0) の距離は、10です。

mysql> SET @a = ST_GeomFromText('POINT(0 0)', 0);
Query OK, 0 rows affected (0.00 sec)

mysql> SET @b = ST_GeomFromText('POINT(0 10)', 0);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT ST_Distance(@a, @b);
+---------------------+
| ST_Distance(@a, @b) |
+---------------------+
|                  10 |
+---------------------+
1 row in set (0.00 sec)

原点(0,0) から (10, 10) の距離は、14.142135.. (ルート2 * 10)です。

mysql> SET @c = ST_GeomFromText('POINT(10 10)', 0);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT ST_Distance(@a, @c);
+---------------------+
| ST_Distance(@a, @c) |
+---------------------+
|  14.142135623730951 |
+---------------------+
1 row in set (0.00 sec)

SRID 4326を指定すると、地球上の緯度・経度になりST_Distanceの結果(距離)は SRID0 とは大きく異なる値になりました。

mysql> SET @g1 = ST_GeomFromText('POINT(0 0)', 4326);
Query OK, 0 rows affected (0.00 sec)

mysql> SET @g2 = ST_GeomFromText('POINT(10 10)', 4326);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT ST_Distance(@g1, @g2);
+-----------------------+
| ST_Distance(@g1, @g2) |
+-----------------------+
|    1565092.2768577514 |
+-----------------------+
1 row in set (0.00 sec)

SRID0は地球上の緯度・経度ではないので、経度としてはありえない座標(経度は180度まで)でも指定できます。

-- ref) https://sakaik.hateblo.jp/entry/20191229/mysql_gis_axis_order_srid_0
mysql> SET @d = ST_GeomFromText('POINT(190 10)', 0);
Query OK, 0 rows affected (0.00 sec)

-- SRID を指定して、地球上の地点を表すとエラー
mysql> SET @d = ST_GeomFromText('POINT(10 190)', 4326);
ERROR 3616 (22S02): Longitude 190.000000 is out of range in function st_geomfromtext. It must be within (-180.000000, 180.000000].

ところで、ST_Distance 関数では距離を表す単位を変更できるそうです。デフォルトの単位はメートルです。

next4us-ti.hatenablog.com

SRID0 で 単位を指定してみます。抽象的な座標には単位が存在しないため、単位が変換できない旨のエラーが出ますね。

mysql> SELECT ST_Distance(@a, @c, 'centimetre');
ERROR 3882 (SU001): The geometry passed to function st_distance is in SRID 0, which doesn't specify a length unit. Can't convert to 'centimetre'.

あわせて読みたい

sakaik さんのGIS関連のエントリーが非常に参考になります

sakaik.hateblo.jp