MySQL8.0のaxis orderについて
投稿日: 2018年10月28月 更新日: 2018年11月08月
FOSS4G Hokkaidoでの、おざきさんの発表で話題になったPostGISとMySQL8.0でaxis order※が逆である件。
※座標系の緯度経度、XYの指定順のこと。
今度FOSS4G TOKYOでMySQLのハンズオンをやることになったのできちんと調べてみた。
WKTフォーマットのaxis orderが逆である
より正確には「ST_GeomFromText等で指定するWKT※フォーマットのaxis orderがPostGISとMySQLでは逆」である。 (もしかしたらWKBも逆であるかもしれないけど個人的にはそれはあんまり問題じゃない)
※Well-known Text
よって、PostGISとMySQLで「全ての関数において緯度経度の取扱が逆になってる」というわけではない。 つまりそれさえ意識していれば実用上はそんなに問題ではないように思う。
具体的にはST_GeomFromTextやST_AsTextなどの関数の引数、返り値が逆になる。
PostGIS: ST_GeomFromText('POINT(140 40)', 4326);
MySQL: ST_GeomFromText('POINT(40 140)', 4326);
でも、MySQLではオプションを指定することでaxis orderを指定することができる。
MySQL: ST_GeomFromText('POINT(140 40)', 4326, 'axis-order=long-lat');
上記のようにすることで、PostGISと同じaxis orderを指定することが可能である。
WKTフォーマットのaxis orderが逆である理由
WKTの仕様はOGCが標準化しているものの、axis orderについては定義していない(ように思います。まだちゃんと読んでないけど。)
むしろ、各投影法ごとのaxis orderについては別仕様であるEPSGに依っており、それによれば、今回話題となった投影法であるWGS84のaxis orderはlat-lonの順番であるようです。
そうなるとむしろ標準に準拠しているのはMySQLなのでは?という気もします。
また、WKTがaxis orderを定義していないのであれば、axis orderを指定できるMySQLのほうが理にかなった実装であるように思える。
その他のフォーマットについてはどうなのか?
例えば、GeoJSONでは仕様としてlongitude、latitudeの順に記述することを定めている。
よって、ST_GeomFromGeoJSONやST_AsGeoJSONなどの引数/返り値が異なるということは無い。
例えば、MySQLでのST_AsGeoJSONの実行結果は下記である。GeoJSONの仕様どおり、longitude、latitudeになっている。
mysql> SELECT ST_AsGeoJSON(geom) FROM mcdnald LIMIT 1;
+------------------------------------------------------------------+
| ST_AsGeoJSON(geom) |
+------------------------------------------------------------------+
| {"type": "Point", "coordinates": [141.292480489, 43.0772826618]} |
+------------------------------------------------------------------+
PostgreSQLの場合ももちろん、longitude、latitudeの順番になっている。
=# SELECT ST_AsGeoJSON(geom) FROM mcdnald2 LIMIT 1;
st_asgeojson
--------------------------------------------------------------
{"type":"Point","coordinates":[144.286384394,43.9978094904]}
名前:宮内 はじめ
Code for Nagoya名誉代表
E2D3名古屋支部長
プログラマーです。GISやデータビズが好きです。このサイトは宮内の個人的なメモです。