MySQLのGIS機能に望むこと


[shp2mysql](https://github.com/hajime-miyauchi/shp2mysql)を開発してGISデータが取り込めるようになったので、改めてMySQLのGIS機能への要望をまとめてみた。

shp2mysqlについてはこちら
https://qiita.com/miyauchi/items/b4e810b3becf2cf07e2f

対象のMySQLは8.0.16時点。最新の8.0.18でもたぶん同じ状況。

## 概要

対応してほしい優先度順。

1. ST_Intersectsの速度改善
2. ST_Union等の集計関数版の実装
3. ST_Transformの改善

他にも細かいことはあるけど、最低限この3つは解決してもらわないとGISのバックエンドとして使うのは困難。

詳細は以降で記述するが、まとめると下記。

1. ST_Intersectsの速度改善
    * 「ポリゴンAがポリゴンBに交差するか？」を判定するST_Intersects()等を始めとした関数でインデックスが効かず速度的に実用に耐えない。
    * ポリゴン(ジオメトリ型)で判定関数がまともに動かないというのは、極論、他の型で言うと**比較演算子(=<>、BETWEEN等)がまともに動かない** のと同義である。致命的すぎる。
2. ST_Union等の集計関数版の実装
    * 他の型でいうと**SUM()、MAX()が存在しないRDB**と考えてもらえれば辛さがわかってもらえるだろうか。
3. ST_Transformの改善
    * これはもしかしたら日本固有かもしれないのだが、特に企業、行政において**投影座標のデータが多い**。行政においては投影座標のほうが多いんじゃないかという印象。
    * それら投影座標のデータをMySQLに投入してWEBシステムを作ろうと思った際に、 **地理座標への変換ができない**のは非常に辛い。

3についてはshp2mysql側で変換するという手も使えないわけではないが、場当たり的なのでできればやりたくない。

## 1. ST_Intersectsの速度改善

ST_Intersects等の空間検索関数が遅い。インデックスが使われていないと思われる。

https://qiita.com/miyauchi/items/893f12679cb21c12c454

ST_Intersectsが使えないと、例えば画面に表示する分のデータを抽出することができないためGISを開発する際に非常にこまる。というかMySQL8.0を事実上使えない。

## 2. ST_Union等の集計関数版の実装

PostGISでは独自にST_Unionの集計関数版を実装している。
これはぜひMySQLでも欲しい。

https://qiita.com/miyauchi/items/327cef3f8a61a00956bb#%E9%9B%86%E7%B4%84%E9%96%A2%E6%95%B0

## 3. ST_Transformの改善

下記記事でも坂井さんが書いているように、ST_Transformが「地理座標系どうしの変換の一部にのみ対応している」という残念な状況。

http://sakaik.hateblo.jp/entry/20181218/MySQL8013_ST_Transform_first_impression

shp2mysqlでも測地系変換はST_Transformを使うので、例えば平面直角座標系から緯度経度への変換ができない。

```SQL
INSERT INTO `h27ka23` (`key_code`,`pref`,`city`,`s_area`,`pref_name`,`city_name`,`s_name`,`kigo_e`,`hcode`,`area`,`perimeter`,`h27kaxx_`,`h27kaxx_id`,`ken`,`ken_name`,`sityo_name`,`gst_name`,`css_name`,`kihon1`,`dummy1`,`kihon2`,`keycode1`,`keycode2`,`area_max_f`,`kigo_d`,`n_ken`,`n_city`,`kigo_i`,`moji`,`kbsum`,`jinko`,`setai`,`x_code`,`y_code`,`kcode1`,geom) VALUES ('23101001005','23','101','001005','愛知県','千種区','青柳町５丁目',NULL,'8101','15584.212','549.915','2005','2004','23','愛知県',NULL,'名古屋市','千種区','0010','-','05','101001005','101001005','M',NULL,NULL,NULL,NULL,'青柳町５丁目','7','106','48','136.93901','35.16151','0010-05',ST_Transform(ST_GeomFromText('MULTIPOLYGON(((-20754.8652865945 -93080.3907545561,-20792.9170054861 -93073.7809801786,-20801.0945861811 -93071.5464888813,-20797.7526499984 -93049.7109680534,-20793.5163543657 -93049.8828324357,-20789.1198896364 -93032.5472658343,-20783.1762441217 -92992.930770668,-20780.7818079772 -92993.4464037642,-20776.8214177434 -92973.2759786547,-20781.3388232127 -92972.7446392541,-20779.1850981796 -92953.8240600531,-20783.6050128758 -92953.1209365438,-20775.9618820959 -92910.0145830367,-20766.3740435754 -92912.0536876898,-20723.9511436358 -92918.2492093462,-20674.3757353179 -92927.8431351506,-20684.3549408095 -92973.7695915831,-20689.6810410617 -92972.6289769808,-20694.7508015533 -93002.1587260088,-20691.7020383399 -93008.8070613068,-20706.9427248768 -93089.4148234653,-20754.8652865945 -93080.3907545561)))', 2449, 'axis-order=long-lat'), 4326));
```

上記のようなSQLを実行するとエラーになる。

```
 Transformation from SRID 2459 is not supported.
```

※SRID 2459はJGD2000の平面直角座標7系(愛知県等)


# この記事のライセンス
[![クリエイティブ・コモンズ・ライセンス](https://i.creativecommons.org/l/by/4.0/88x31.png)](http://creativecommons.org/licenses/by/4.0/deed.ja)
この記事は[CC BY 4.0（クリエイティブ・コモンズ 表示 4.0 国際 ライセンス）](http://creativecommons.org/licenses/by/4.0/deed.ja)の元で公開します。