shp2mysqlを開発してGISデータが取り込めるようになったので、改めてMySQLのGIS機能への要望をまとめてみた。
shp2mysqlについてはこちら
https://qiita.com/miyauchi/items/b4e810b3becf2cf07e2f
対象のMySQLは8.0.16時点。最新の8.0.18でもたぶん同じ状況。
概要
対応してほしい優先度順。
- ST_Intersectsの速度改善
- ST_Union等の集計関数版の実装
- ST_Transformの改善
他にも細かいことはあるけど、最低限この3つは解決してもらわないとGISのバックエンドとして使うのは困難。
詳細は以降で記述するが、まとめると下記。
- ST_Intersectsの速度改善
- 「ポリゴンAがポリゴンBに交差するか?」を判定するST_Intersects()等を始めとした関数でインデックスが効かず速度的に実用に耐えない。
- ポリゴン(ジオメトリ型)で判定関数がまともに動かないというのは、極論、他の型で言うと比較演算子(=<>、BETWEEN等)がまともに動かない のと同義である。致命的すぎる。
- ST_Union等の集計関数版の実装
- 他の型でいうとSUM()、MAX()が存在しないRDBと考えてもらえれば辛さがわかってもらえるだろうか。
- ST_Transformの改善
- これはもしかしたら日本固有かもしれないのだが、特に企業、行政において投影座標のデータが多い。行政においては投影座標のほうが多いんじゃないかという印象。
- それら投影座標のデータをMySQLに投入してWEBシステムを作ろうと思った際に、 地理座標への変換ができないのは非常に辛い。
3についてはshp2mysql側で変換するという手も使えないわけではないが、場当たり的なのでできればやりたくない。
1. ST_Intersectsの速度改善
ST_Intersects等の空間検索関数が遅い。インデックスが使われていないと思われる。
ST_Intersectsが使えないと、例えば画面に表示する分のデータを抽出することができないためGISを開発する際に非常にこまる。というかMySQL8.0を事実上使えない。
2. ST_Union等の集計関数版の実装
PostGISでは独自にST_Unionの集計関数版を実装している。
これはぜひMySQLでも欲しい。
3. ST_Transformの改善
下記記事でも坂井さんが書いているように、ST_Transformが「地理座標系どうしの変換の一部にのみ対応している」という残念な状況。
shp2mysqlでも測地系変換はST_Transformを使うので、例えば平面直角座標系から緯度経度への変換ができない。
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','愛知県','千種区','青柳町5丁目',NULL,'8101','15584.212','549.915','2005','2004','23','愛知県',NULL,'名古屋市','千種区','0010','-','05','101001005','101001005','M',NULL,NULL,NULL,NULL,'青柳町5丁目','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系(愛知県等)
この記事のライセンス
この記事はCC BY 4.0(クリエイティブ・コモンズ 表示 4.0 国際 ライセンス)の元で公開します。