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
関数では距離を表す単位を変更できるそうです。デフォルトの単位はメートルです。
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関連のエントリーが非常に参考になります