自作の、Spatial(GIS)関連の関数をMySQLに追加するプラグインの関数をひとつひとつ動作確認しながら紹介するシリーズ。
https://sakaik.hateblo.jp/entry/20260215/mysql_spatial_functions_plugin
STX_HexGrid(size, geom)
与えられたgeomのバウンディングボックスを覆うように、与えられた一辺のサイズの六角形を生成し、マルチポリゴンとして返す。ポリゴンそのものではなく、それを覆う矩形を覆うように、というところが気持ち悪さを感じるが、PostGISの ST_HexagonGrid()でもそのような動作らしい。
動作紹介
- 「C」の字のようなPolygonのバウンディングボックスを覆うようにHexGridのポリゴンを生成して返す
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_hexgrid(0.05, @g))\G
*************************** 1. row ***************************
ST_AsText(STX_hexgrid(0.05, @g)): GEOMETRYCOLLECTION(
POLYGON((35.03072758308055 134.97500000000002,35.07402885326977 134.95000000000002,35.07402885326977 134.9,35.03072758308055 134.875,34.98742631289132 134.9,34.98742631289132 134.95000000000002,35.03072758308055 134.97500000000002)),
POLYGON((34.98742631289132 135.05000000000004,35.03072758308055 135.02500000000003,35.03072758308055 134.97500000000002,34.98742631289132 134.95000000000002,34.9441250427021 134.97500000000002,34.9441250427021 135.02500000000003,34.98742631289132 135.05000000000004)),
POLYGON((35.074028853269766 135.05000000000004,35.11733012345899 135.02500000000003,35.11733012345899 134.97500000000002,35.074028853269766 134.95000000000002,35.03072758308054 134.97500000000002,35.03072758308054 135.02500000000003,35.074028853269766 135.05000000000004)),
POLYGON((35.03072758308055 135.12500000000003,35.07402885326977 135.10000000000002,35.07402885326977 135.05,35.03072758308055 135.025,34.98742631289132 135.05,34.98742631289132 135.10000000000002,35.03072758308055 135.12500000000003)),
POLYGON((35.11733012345899 135.12500000000003,35.16063139364822 135.10000000000002,35.16063139364822 135.05,35.11733012345899 135.025,35.074028853269766 135.05,35.074028853269766 135.10000000000002,35.11733012345899 135.12500000000003)))
- 生成するHexagonの1辺サイズを小さくすると(先ほどの5分の1)たくさんのPOLYGONに分割される。
mysql> SELECT ST_AsText(STX_hexgrid(0.01, @g))\G *************************** 1. row *************************** ST_AsText(STX_hexgrid(0.01, @g)): GEOMETRYCOLLECTION(POLYGON((35.00474682096701 134.98,35.01340707500485 134.975,35.01340707500485 134.965,35.00474682096701 134.96,34.996086566929165 134.965,34.996086566929165 134.975,35.00474682096701 134.98)),POLYGON((35.0220673290427 134.98,35.03072758308054 134.975,35.03072758308054 134.965,35.0220673290427 134.96,35.01340707500486 134.965,35.01340707500486 134.975,35.0220673290427 134.98)),POLYGON((35.03938783711839 134.98,35.04804809115623 134.975,35.04804809115623 134.965,35.03938783711839 134.96,35.03072758308055 134.965,35.03072758308055 134.975,35.03938783711839 134.98)),POLYGON((35.056708345194075 134.98,35.06536859923192 134.975,35.06536859923192 134.965,35.056708345194075 134.96,35.04804809115623 134.965,35.04804809115623 134.975,35.056708345194075 134.98)),POLYGON((35.074028853269766 134.98,35.08268910730761 134.975,35.08268910730761 134.965,35.074028853269766 134.96,35.065368599231924 134.965,35.065368599231924 134.975,35.074028853269766 134.98)),POLYGON((35.09134936134546 134.98,35.1000096153833 134.975,35.1000096153833 134.965,35.09134936134546 134.96,35.082689107307615 134.965,35.082689107307615 134.975,35.09134936134546 134.98)),POLYGON((34.996086566929165 134.99499999999998,35.00474682096701 134.98999999999998,35.00474682096701 134.98,34.996086566929165 134.975,34.98742631289132 134.98,34.98742631289132 134.98999999999998,34.996086566929165 134.99499999999998)),POLYGON((35.01340707500485 134.99499999999998,35.02206732904269 134.98999999999998,35.02206732904269 134.98,35.01340707500485 134.975,35.00474682096701 134.98,35.00474682096701 134.98999999999998,35.01340707500485 134.99499999999998)),POLYGON((35.03072758308054 134.99499999999998,35.03938783711838 134.98999999999998,35.03938783711838 134.98,35.03072758308054 134.975,35.0220673290427 134.98,35.0220673290427 134.98999999999998,35.03072758308054 134.99499999999998)),POLYGON((35.04804809115623 134.99499999999998,35.056708345194075 134.98999999999998,35.056708345194075 134.98,35.04804809115623 134.975,35.03938783711839 134.98,35.03938783711839 134.98999999999998,35.04804809115623 134.99499999999998)),POLYGON((35.06536859923192 134.99499999999998,35.07402885326976 134.98999999999998,35.07402885326976 134.98,35.06536859923192 134.975,35.056708345194075 134.98,35.056708345194075 134.98999999999998,35.06536859923192 134.99499999999998)),POLYGON((35.08268910730761 134.99499999999998,35.09134936134545 134.98999999999998,35.09134936134545 134.98,35.08268910730761 134.975,35.074028853269766 134.98,35.074028853269766 134.98999999999998,35.08268910730761 134.99499999999998)),POLYGON((35.00474682096701 135.01,35.01340707500485 135.005,35.01340707500485 134.995,35.00474682096701 134.99,34.996086566929165 134.995,34.996086566929165 135.005,35.00474682096701 135.01)),POLYGON((35.0220673290427 135.01,35.03072758308054 135.005,35.03072758308054 134.995,35.0220673290427 134.99,35.01340707500486 134.995,35.01340707500486 135.005,35.0220673290427 135.01)),POLYGON((35.03938783711839 135.01,35.04804809115623 135.005,35.04804809115623 134.995,35.03938783711839 134.99,35.03072758308055 134.995,35.03072758308055 135.005,35.03938783711839 135.01)),POLYGON((35.056708345194075 135.01,35.06536859923192 135.005,35.06536859923192 134.995,35.056708345194075 134.99,35.04804809115623 134.995,35.04804809115623 135.005,35.056708345194075 135.01)),POLYGON((35.074028853269766 135.01,35.08268910730761 135.005,35.08268910730761 134.995,35.074028853269766 134.99,35.065368599231924 134.995,35.065368599231924 135.005,35.074028853269766 135.01)),POLYGON((35.09134936134546 135.01,35.1000096153833 135.005,35.1000096153833 134.995,35.09134936134546 134.99,35.082689107307615 134.995,35.082689107307615 135.005,35.09134936134546 135.01)),POLYGON((34.996086566929165 135.02499999999998,35.00474682096701 135.01999999999998,35.00474682096701 135.01,34.996086566929165 135.005,34.98742631289132 135.01,34.98742631289132 135.01999999999998,34.996086566929165 135.02499999999998)),POLYGON((35.01340707500485 135.02499999999998,35.02206732904269 135.01999999999998,35.02206732904269 135.01,35.01340707500485 135.005,35.00474682096701 135.01,35.00474682096701 135.01999999999998,35.01340707500485 135.02499999999998)),POLYGON((35.03072758308054 135.02499999999998,35.03938783711838 135.01999999999998,35.03938783711838 135.01,35.03072758308054 135.005,35.0220673290427 135.01,35.0220673290427 135.01999999999998,35.03072758308054 135.02499999999998)),POLYGON((35.04804809115623 135.02499999999998,35.056708345194075 135.01999999999998,35.056708345194075 135.01,35.04804809115623 135.005,35.03938783711839 135.01,35.03938783711839 135.01999999999998,35.04804809115623 135.02499999999998)),POLYGON((35.06536859923192 135.02499999999998,35.07402885326976 135.01999999999998,35.07402885326976 135.01,35.06536859923192 135.005,35.056708345194075 135.01,35.056708345194075 135.01999999999998,35.06536859923192 135.02499999999998)),POLYGON((35.08268910730761 135.02499999999998,35.09134936134545 135.01999999999998,35.09134936134545 135.01,35.08268910730761 135.005,35.074028853269766 135.01,35.074028853269766 135.01999999999998,35.08268910730761 135.02499999999998)),POLYGON((35.00474682096701 135.04,35.01340707500485 135.035,35.01340707500485 135.025,35.00474682096701 135.02,34.996086566929165 135.025,34.996086566929165 135.035,35.00474682096701 135.04)),POLYGON((35.0220673290427 135.04,35.03072758308054 135.035,35.03072758308054 135.025,35.0220673290427 135.02,35.01340707500486 135.025,35.01340707500486 135.035,35.0220673290427 135.04)),POLYGON((35.03938783711839 135.04,35.04804809115623 135.035,35.04804809115623 135.025,35.03938783711839 135.02,35.03072758308055 135.025,35.03072758308055 135.035,35.03938783711839 135.04)),POLYGON((35.056708345194075 135.04,35.06536859923192 135.035,35.06536859923192 135.025,35.056708345194075 135.02,35.04804809115623 135.025,35.04804809115623 135.035,35.056708345194075 135.04)),POLYGON((35.074028853269766 135.04,35.08268910730761 135.035,35.08268910730761 135.025,35.074028853269766 135.02,35.065368599231924 135.025,35.065368599231924 135.035,35.074028853269766 135.04)),POLYGON((35.09134936134546 135.04,35.1000096153833 135.035,35.1000096153833 135.025,35.09134936134546 135.02,35.082689107307615 135.025,35.082689107307615 135.035,35.09134936134546 135.04)),POLYGON((34.996086566929165 135.05499999999998,35.00474682096701 135.04999999999998,35.00474682096701 135.04,34.996086566929165 135.035,34.98742631289132 135.04,34.98742631289132 135.04999999999998,34.996086566929165 135.05499999999998)),POLYGON((35.01340707500485 135.05499999999998,35.02206732904269 135.04999999999998,35.02206732904269 135.04,35.01340707500485 135.035,35.00474682096701 135.04,35.00474682096701 135.04999999999998,35.01340707500485 135.05499999999998)),POLYGON((35.03072758308054 135.05499999999998,35.03938783711838 135.04999999999998,35.03938783711838 135.04,35.03072758308054 135.035,35.0220673290427 135.04,35.0220673290427 135.04999999999998,35.03072758308054 135.05499999999998)),POLYGON((35.04804809115623 135.05499999999998,35.056708345194075 135.04999999999998,35.056708345194075 135.04,35.04804809115623 135.035,35.03938783711839 135.04,35.03938783711839 135.04999999999998,35.04804809115623 135.05499999999998)),POLYGON((35.06536859923192 135.05499999999998,35.07402885326976 135.04999999999998,35.07402885326976 135.04,35.06536859923192 135.035,35.056708345194075 135.04,35.056708345194075 135.04999999999998,35.06536859923192 135.05499999999998)),POLYGON((35.08268910730761 135.05499999999998,35.09134936134545 135.04999999999998,35.09134936134545 135.04,35.08268910730761 135.035,35.074028853269766 135.04,35.074028853269766 135.04999999999998,35.08268910730761 135.05499999999998)),POLYGON((35.00474682096701 135.07,35.01340707500485 135.065,35.01340707500485 135.055,35.00474682096701 135.05,34.996086566929165 135.055,34.996086566929165 135.065,35.00474682096701 135.07)),POLYGON((35.0220673290427 135.07,35.03072758308054 135.065,35.03072758308054 135.055,35.0220673290427 135.05,35.01340707500486 135.055,35.01340707500486 135.065,35.0220673290427 135.07)),POLYGON((35.03938783711839 135.07,35.04804809115623 135.065,35.04804809115623 135.055,35.03938783711839 135.05,35.03072758308055 135.055,35.03072758308055 135.065,35.03938783711839 135.07)),POLYGON((35.056708345194075 135.07,35.06536859923192 135.065,35.06536859923192 135.055,35.056708345194075 135.05,35.04804809115623 135.055,35.04804809115623 135.065,35.056708345194075 135.07)),POLYGON((35.074028853269766 135.07,35.08268910730761 135.065,35.08268910730761 135.055,35.074028853269766 135.05,35.065368599231924 135.055,35.065368599231924 135.065,35.074028853269766 135.07)),POLYGON((35.09134936134546 135.07,35.1000096153833 135.065,35.1000096153833 135.055,35.09134936134546 135.05,35.082689107307615 135.055,35.082689107307615 135.065,35.09134936134546 135.07))) 1 row in set (0.001 sec)
