自作の、Spatial(GIS)関連の関数をMySQLに追加するプラグインの関数をひとつひとつ動作確認しながら紹介するシリーズ。
https://sakaik.hateblo.jp/entry/20260215/mysql_spatial_functions_plugin
STX_SquareGrid(size, geom)
指定されたgeomを覆うような矩形グリッドを MULTIPOLYGONで返す。矩形は、第1引数で与えられた長さが一辺となるように組み立てられる。原点(0,0)を基準としたグリッドになるように位置調整される。
動作紹介
- 一辺10のPOLYGON全体を覆うような、一辺4の矩形ポリゴン群を返す(0~12の範囲を 3x3に区切ることになる)
mysql> SET @g=ST_GeomFromText('POLYGON((0 0, 10 0, 10 10, 0 10, 0 0))');
mysql> SELECT ST_AsText(STX_SquareGrid(4, @g))\G
*************************** 1. row ***************************
ST_AsText(STX_SquareGrid(4, @g)):
GEOMETRYCOLLECTION(
POLYGON((0 0,4 0,4 4,0 4,0 0)),
POLYGON((4 0,8 0,8 4,4 4,4 0)),
POLYGON((8 0,12 0,12 4,8 4,8 0)),
POLYGON((0 4,4 4,4 8,0 8,0 4)),
POLYGON((4 4,8 4,8 8,4 8,4 4)),
POLYGON((8 4,12 4,12 8,8 8,8 4)),
POLYGON((0 8,4 8,4 12,0 12,0 8)),
POLYGON((4 8,8 8,8 12,4 12,4 8)),
POLYGON((8 8,12 8,12 12,8 12,8 8)))
1 row in set (0.000 sec)
↑もとの四角形全体を覆うような、一辺4の長さの矩形群が返されている。左下が(0,0)なので左辺と下辺は一致している。
- いつもこのブログで使っている35度135度付近の変な形のPOLYGONを覆うように一辺「3」の長さの矩形で覆う指示。
mysql> SET @g=ST_GeomFromText('POLYGON((35 135, 35.02 135.05, 35.05 135.02, 35.07 135.06, 35.09 135.02, 35.04 134.97, 35 135))',6668);
mysql> SELECT ST_AsText(STX_SquareGrid(3, @g));
+-----------------------------------------------------------------------------------------------------------------+
| ST_AsText(STX_Squaregrid(3, @g)) |
+-----------------------------------------------------------------------------------------------------------------+
| GEOMETRYCOLLECTION(POLYGON((33 132,33 135,36 135,36 132,33 132)),POLYGON((33 135,33 138,36 138,36 135,33 135))) |
+-----------------------------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)
↑青枠は、(35 135)から(36 136)への1度の矩形(参考情報)。ちょうど一辺がその3倍の長さの矩形が2つ返されている事が分かります。
- 一辺を短く(0.05)するよう指示したもの。元のPOLYGONを覆うように6つの矩形が返される
mysql> SELECT ST_AsText(STX_SquareGrid(0.05, @g))\G *************************** 1. row *************************** ST_AsText(STX_Squaregrid(0.05, @g)): GEOMETRYCOLLECTION( POLYGON((35 134.95000000000002,35 135.00000000000003,35.05 135.00000000000003,35.05 134.95000000000002,35 134.95000000000002)), POLYGON((35 135.00000000000003,35 135.05000000000004,35.05 135.05000000000004,35.05 135.00000000000003,35 135.00000000000003)), POLYGON((35 135.05000000000004,35 135.10000000000005,35.05 135.10000000000005,35.05 135.05000000000004,35 135.05000000000004)), POLYGON((35.05 134.95000000000002,35.05 135.00000000000003,35.099999999999994 135.00000000000003,35.099999999999994 134.95000000000002,35.05 134.95000000000002)), POLYGON((35.05 135.00000000000003,35.05 135.05000000000004,35.099999999999994 135.05000000000004,35.099999999999994 135.00000000000003,35.05 135.00000000000003)), POLYGON((35.05 135.05000000000004,35.05 135.10000000000005,35.099999999999994 135.10000000000005,35.099999999999994 135.05000000000004,35.05 135.05000000000004))) 1 row in set (0.000 sec)

(青線は先ほどと同様、一辺が1度の矩形(の一部))