Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MySQL 8.0 GIS機能チュートリアル

MySQL 8.0 GIS機能チュートリアル

2019年10月13日(日)に開催された「FOSS4G 2019 KOBE.KANSAI コアデイ」での発表資料です。
https://www.osgeo.jp/events/foss4g-2019/foss4g-2019-kobe-kansai/foss4g-2019-kobe-coreday

YoshiakiYamasaki

October 13, 2019
Tweet

More Decks by YoshiakiYamasaki

Other Decks in Technology

Transcript

  1. Yoshiaki Yamasaki / 山﨑 由章 MySQL Principal Solution Engineer, Asia

    Pacific and Japan MySQL 8.0 GIS機能チュートリアル 2019/10/13 FOSS4G KOBE.KANSAI 1
  2. MySQLのGIS機能の歴史 • MySQL 5.7 • Boost.GeometryというC++のオープンソースライブラリを採用して独自実装をやめ、 InnoDBでGIS関連機能を再実装 • MySQL 8.0

    • 演算、データ変換に役立つ各種のSpatial関数の追加 • MySQL 5.7で非推奨になった関数の廃止 • Geography サポート • Spatial Data、Spatial Index、Spatial関数のSRIDサポート 5 ※Boost.Geometryコミュニティとも活発に交流し、MySQLチームからBoost.Geometryへの コントリビュートも行っている
  3. アップルップル 9 位置情報を使用したWebページの例 名古屋地区の情報を発信しているSpyMasterでは、この機能を活用 してユーザーの近くのスポット情報を表示できるようにしています。 ユーザーの現在地をJavaScriptのGeolocation APIを使って取得し、 現在地からの距離をMySQLのST_Length関数で計算しています。 MySQLのGEOMETRY型とJavaScriptのGeolocation APIの活用事例(※)

    https://speakerdeck.com/steelydylan/mysqlfalse-geometry-xing- tojavascriptfalse-geolocation-api-falsehuo-yong-shi-li ※本資料ではGLength関数を使った例が紹介されていますが、今後実装する際は ST_ Length関数を使用下さい。 (GLength関数はMySQL 5.7で非推奨になり、MySQL 8.0で廃止されました).
  4. MySQLで扱えるデータ型 • POINT:点 • 例:緯度、経度 • LINESTRING:線 • 例:ルート(道筋) •

    POLYGON:多角形 • 例:市町村の区画 • GEOMETRY:POINT、LINESTRING、POLYGONをまとめて扱える 17
  5. 空間データの表現方法 • WKT(Well-Known Text) • 幾何学オブジェクトをテキストで表現するための仕様 • WKB(Well-Known Binary) •

    幾何学オブジェクトをバイナリで表現するための仕様 • MySQLの内部表現 • WKBの先頭にSRIDを追加したもの 20
  6. WKTの例 • POINT(15 20) ※区切りはスペース • LINESTRING(0 0, 10 10,

    20 25, 50 60) • POLYGON((0 0,10 0,10 10,0 10,0 0)) ※最初の点に戻る • POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5)) ※中をくりぬくことも可能 21
  7. WKTから空間データを生成する関数 • ST_GeomFromText() • ST_PointFromText() • ST_LineStringFromText() • ST_PolygonFromText() •

    ST_MultiPointFromText() • ST_MultiLineStringFromText() • ST_MultiPolygonFromText() • ST_GeometryCollectionFromText() 22
  8. WKBから空間データを生成する関数 • ST_GeomFromWKB() • ST_PointFromWKB() • ST_LineStringFromWKB() • ST_PolygonFromWKB() •

    ST_MultiPointFromWKB() • ST_MultiLineStringFromWKB() • ST_MultiPolygonFromWKB() • ST_GeometryCollectionFromWKB() 23
  9. 使用例:ST_GeomFromText、ST_AsTextの動作確認 mysql> SELECT ST_GeomFromText('LineString(1 1,2 2,3 3)'); +---------------------------------------------------------------+ | ST_GeomFromText('LineString(1

    1,2 2,3 3)') | +---------------------------------------------------------------+ | ð? ð? @ @ @ @ | +---------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> SELECT ST_AsText(ST_GeomFromText('LineString(1 1,2 2,3 3)')); +-------------------------------------------------------+ | ST_AsText(ST_GeomFromText('LineString(1 1,2 2,3 3)')) | +-------------------------------------------------------+ | LINESTRING(1 1,2 2,3 3) | +-------------------------------------------------------+ 1 row in set (0.00 sec) 25
  10. 使用例:SRID:4326を指定して、緯度経度を格納 mysql> CREATE TABLE test(id INT AUTO_INCREMENT PRIMARY KEY, name

    VARCHAR(30), location POINT SRID 4326); Query OK, 0 rows affected (0.04 sec) mysql> INSERT INTO test(name, location) VALUES(’KIITO’, ST_GeomFromText('POINT(34.6850502 135.1987589)', 4326)); Query OK, 1 row affected (0.01 sec) mysql> SELECT id, name, ST_ASTEXT(location) FROM test; +----+-------+-------------------------------+ | id | name | ST_ASTEXT(location) | +----+-------+-------------------------------+ | 1 | KIITO | POINT(34.6850502 135.1987589) | +----+-------+-------------------------------+ 1 row in set (0.00 sec) 26 SRID:4326のAxis OrderはLat-Long なので、緯度-経度の順番で指定
  11. 使用例:2点の距離を計算 mysql> INSERT INTO test(name, location) VALUES(‘ひょうたん’, ST_GeomFromText('POINT(34.6922791 135.1918453)', 4326));

    Query OK, 1 row affected (0.01 sec) mysql> SELECT ST_Distance((SELECT location FROM test WHERE id=1), (SELECT location FROM test WHERE id=2), 'metre')/1000 AS Km FROM dual; +--------------------+ | Km | +--------------------+ | 1.0219803291719762 | +--------------------+ 1 row in set (0.00 sec) 27
  12. 備考:異なるSRIDのデータをINSERTするとエラーになる mysql> INSERT INTO test(name, location) VALUES(‘KIITO’, ST_GeomFromText('POINT(34.6850502 135.1987589)', 6668));

    ERROR 3643 (HY000): The SRID of the geometry does not match the SRID of the column 'location'. The SRID of the geometry is 6668, but the SRID of the column is 4326. Consider changing the SRID of the geometry or the SRID property of the column. 28
  13. 備考:データINSERT時にAxis Orderを明示的に指定可能 mysql> INSERT INTO test(name, location) VALUES(‘KIITO’, ST_GeomFromText(‘POINT(135.1987589 34.6850502)’,

    4326, 'axis-order=long-lat')); Query OK, 1 row affected (0.01 sec) 29 ※axis-orderオプションは、地理座標系場合のみ指定可能
  14. 参考情報:SRID:4326の定義を確認 mysql> SELECT * FROM INFORMATION_SCHEMA.ST_SPATIAL_REFERENCE_SYSTEMS WHERE SRS_ID=4326¥G *************************** 1.

    row *************************** SRS_NAME: WGS 84 SRS_ID: 4326 ORGANIZATION: EPSG ORGANIZATION_COORDSYS_ID: 4326 DEFINITION: GEOGCS["WGS 84",DATUM["World Geodetic System 1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]] ,PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199 43278,AUTHORITY["EPSG","9122"]],AXIS["Lat",NORTH],AXIS["Lon",EAST],AUTHORITY[ "EPSG","4326"]] DESCRIPTION: NULL 1 row in set (0.00 sec) 30
  15. 備考 • ST_Intersects()、ST_Overlaps()の実行速度が非常に遅いという問題に 関して、残念ながらまだ調査状況に進展はありません • Bug#96311: ST_Intersects() is very slow

    on MySQL 8.0 https://bugs.mysql.com/bug.php?id=96311 • ST_Within()で代替できるケースでは、現状はST_Within()を使用下さい (ST_Within()は高速に実行できています) 38
  16. お知らせ • 明日開催のハンズオン、参加者絶賛募集中です!! • 日時:2019年10月14日(月・祝) 14:00-17:00 • タイトル:JavaScriptとMySQLでGISを作ってみよう • 概要:MySQLのGIS機能や位置情報の取り扱いについて解説し、

    その実例としてJavaScriptでお手軽にGISを実装してみます。 • 参加費:2,000円 • 詳細:https://www.osgeo.jp/events/foss4g-2019/foss4g-2019-kobe-kansai/foss4g2019- kobe-handson 41
  17. お知らせ • (東京開催ですが) MySQLのGIS機能に焦点を当てたイベント開催予定です!! • 日時:2019年12月5日(月) 18:30-21:00頃 ※開催時間調整中 • 場所:日本オラクル株式会社

    本社 (外苑前駅直結) • 参加費:無料 • 詳細:後日connpassのOracle Code Nightグループで公開予定 https://oracle-code-tokyo-dev.connpass.com/ • 今日より時間が長いのでもう少し詳しいチュートリアルセッションを 開催することを検討中です!! 42