Contenu connexe Similaire à MySQL8.0の「地理情報」を理解しよう入門~いまからはじめるGIS (12) MySQL8.0の「地理情報」を理解しよう入門~いまからはじめるGIS2. 速報
MySQL 8.0.13 が出ました!(2018/10/24)
そして、MySQL Cluster 8.0.13 dmr も!
「なぜ MySQL 5.7 の次が 8.0?」の疑問が、いま明らかに!
「6」は、昔、一旦出たバージョンだからスキップするよ → うんうん
「7」はMySQL Cluster で使っているからスキップするよ → ファ?
※感想には個人差があります。諸説あります。
MySQLとCluster のバージョンを棲み分けしたいのではなく、すべての
MySQLファミリーのソフトウェア群のバージョンをそろえたかったんだ!
5. MySQLのGISの歴史
• MySQL 4.1.0 (2003): MyISAM に "Spatial Extensions" 実装
http://ftp.nchu.edu.tw/MySQL/doc/refman/4.1/en/spatial-extensions.html
• MySQL 5.0.16 (2005): InnoDB にも実装
• MySQL 5.7.1 (2013): spatialデータ専用の型を実装(これまでは BLOBに保管)
Boostライブラリを利用して InnoDBに再実装
• MySQL 8.0.0 (2016): 関数名をST_* 系に統一したり関数増やした
り
地球が丸いことを知ったり、良い感じに
2018/04/19 8.0.11でGAに!
2018/10/24 8.0.13 リリース
※MySQLでは、「GIS」ではなく「Spatial(空間情報)」というキーワード
10. 点・線・面のあらわし方 (まず覚えよう)
• 点: POINT (3 5)
• 線: LINESTRING (1 2, 5 3, 7 9, 3 12)
• 面: POLYGON((1 1, 5 1, 5 8, 1 8, 1 1))
WKT (Well known text):
コンマではないことに注意
• 複数点: MULTIPOINT (3 5, 1 2, 8 3)
MULTIPOINT ((3 5), (1 2), (8 3))
• 複数線: MULTILINESTRING ((1 2, 5 3, 7 9, 3 12), (4 1, 3 3, -1 4))
• 複数面: MULTIPOLYGON (略)
必ず元の点にもどる
POLYGON((1 1, 9 1, 9 9, 1 9, 1 1),
(3 3, 5 3, 5 5, 3 5, 3 3)) 中をくり抜く
参考:
11. WKT をMySQL内部表現に変換するには、
ST_GeomFromText() 関数を使用する
mysql> SELECT ST_GeomFromText('POINT(3 5)') mygeo;
+---------------------------+
| mygeo |
+---------------------------+
| @ @ |
+---------------------------+
mysql> SELECT HEX(ST_GeomFromText('POINT(3 5)')) mygeo;
+----------------------------------------------------+
| mygeo |
+----------------------------------------------------+
| 00000000010100000000000000000008400000000000001440 |
+----------------------------------------------------+
mysql> SELECT ST_AsText(ST_GeomFromText('POINT(3 5)')) mygeo;
+------------+
| mygeo |
+------------+
| POINT(3 5) |
+------------+
12. 点・線・面のあらわし方
WKT → MySQLの内部バイナリ:
• ST_GeomFromText() 関数を使用する。
MySQLの内部バイナリ → WKT:
• ST_AsText() 関数を使用する。
mysql> SELECT ST_AsText(ST_GeomFromText('LINESTRING (1 2, 5 3, 7 9, 3 12)')) geom;
+------------------------------+
| geom |
+------------------------------+
| LINESTRING(1 2,5 3,7 9,3 12) |
+------------------------------+
Geom の代わりに Point,
LineString, Polygon などの関数が
個別にそれぞれあります
17. いろいろな地球のモデル
楕円体のままで位置を特定する「地理座標系」
• 長半径と扁平率の定義が異なる様々な地球の形がある
• それぞれにID(SRS_ID;SRID)と SRS名が付けられている
• 日本で使われる主な 地理座標系の SRS
SRS_NAME SRS_ID 備考 長半径
扁平率
の逆数
Tokyo 4301
今はほとんど使われない。
WGS84との差も大きい
6,377,397.155
m
299.1528128
JGD2000 4612 WGS84との差は小さい 6,378,137m 298.257222101
JGD2011 6668
東日本大震災の地殻変化
に対応
6,378,137m 298.257222101
WGS 84 4326 世界でよく使われる 6,378,137m 298.257223563
※とりあえず JGD2011 (6668)、WGS84 (4326) の2つの
SRS_ID(数字)は覚えておくとよさげ
18. いろいろな地球
平面の地図に落とし込む「投影座標系」
• 回転楕円体を平面の地図に落とし込む(=投影する)ルール
• 地図の中心となる緯度、経度や投影方法などの情報を持つ
• それぞれにID(SRS_ID)と SRS名が付けられている
mysql> SELECT SRS_NAME, SRS_ID, ORGANIZATION
-> FROM ST_SPATIAL_REFERENCE_SYSTEMS WHERE SRS_NAME LIKE 'JGD2011%';
+--------------------------------------------+--------+--------------+
| SRS_NAME | SRS_ID | ORGANIZATION |
+--------------------------------------------+--------+--------------+
| JGD2011 | 6668 | EPSG |
| JGD2011 / Japan Plane Rectangular CS I | 6669 | EPSG |
| JGD2011 / Japan Plane Rectangular CS II | 6670 | EPSG |
| JGD2011 / Japan Plane Rectangular CS III | 6671 | EPSG |
| JGD2011 / Japan Plane Rectangular CS IV | 6672 | EPSG |
| JGD2011 / Japan Plane Rectangular CS V | 6673 | EPSG |
| JGD2011 / Japan Plane Rectangular CS VI | 6674 | EPSG |
| JGD2011 / Japan Plane Rectangular CS VII | 6675 | EPSG |
| JGD2011 / Japan Plane Rectangular CS VIII | 6676 | EPSG |
| JGD2011 / Japan Plane Rectangular CS IX | 6677 | EPSG |
| JGD2011 / Japan Plane Rectangular CS X | 6678 | EPSG |
| JGD2011 / Japan Plane Rectangular CS XI | 6679 | EPSG |
| JGD2011 / Japan Plane Rectangular CS XII | 6680 | EPSG |
| JGD2011 / Japan Plane Rectangular CS XIII | 6681 | EPSG |
| JGD2011 / Japan Plane Rectangular CS XIV | 6682 | EPSG |
| JGD2011 / Japan Plane Rectangular CS XV | 6683 | EPSG |
| JGD2011 / Japan Plane Rectangular CS XVI | 6684 | EPSG |
| JGD2011 / Japan Plane Rectangular CS XVII | 6685 | EPSG |
| JGD2011 / Japan Plane Rectangular CS XVIII | 6686 | EPSG |
| JGD2011 / Japan Plane Rectangular CS XIX | 6687 | EPSG |
| JGD2011 / UTM zone 51N | 6688 | EPSG |
| JGD2011 / UTM zone 52N | 6689 | EPSG |
| JGD2011 / UTM zone 53N | 6690 | EPSG |
| JGD2011 / UTM zone 54N | 6691 | EPSG |
| JGD2011 / UTM zone 55N | 6692 | EPSG |
+--------------------------------------------+--------+--------------+
25 rows in set (0.00 sec)
JGD2011だけでも、こんなに!
各中心点(原点)は 測量法付随の国交省告示で
http://www.gsi.go.jp/LAW/heimencho.html
20. Japan Plane Rectangular CS
• 「日本の平面直角座標系」
• 国土交通省告示第9号で定義
• 全国を19のエリアに分割
• 位置は、各エリアの原点か
らの北、東方向への距離で
表す
• 各エリアは自治体界を境界
線とするよう定義されてい
る(機械的に長方形で区切
られているわけではない)
国土地理院サイトより
http://www.gsi.go.jp/sokuchikijun/jpc.html
21. UTM zone
• 日本近郊は zone 51N~55Nでカバーされてい
る
• Universal Transverse Mercator
• 経度6度ごとに区切った細長い帯に 1~60の番
号を付与
• 西経180度から東回りに 1から順に附番
• 本来は緯度8度ごとに更に分割するが、MySQL
では(?)、北側と南側の2つにのみ分割して
扱っている模様(だから zone 51は、51N と 51S の2
種類のみが存在する)
22. SRSの定義
GEOGCS["JGD2011"
,DATUM["Japanese Geodetic Datum 2011",
SPHEROID["GRS 1980",
6378137,
298.257222101,
AUTHORITY["EPSG","7019"]]
,AUTHORITY["EPSG","1128"]]
,PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]]
,UNIT["degree",0.017453292519943278,
AUTHORITY["EPSG","9122"]]
,AXIS["Lat",NORTH]
,AXIS["Lon",EAST]
,AUTHORITY["EPSG","6668"]]
• MySQLでは SRSの定義を INFORMATION_SCHEMA の以下のテーブル
で参照できる
ST_SPATIAL_REFERENCE_SYSTEMS
地理座標系の定義(JGD2011):
23. PROJCS["JGD2011 / Japan Plane Rectangular CS IX",
GEOGCS["JGD2011",
....]
,PROJECTION["Transverse Mercator", AUTHORITY["EPSG","9807"]]
,PARAMETER["Latitude of natural origin" , 36
,AUTHORITY["EPSG","8801"]]
,PARAMETER["Longitude of natural origin",139.833333333333
,AUTHORITY["EPSG","8802"]]
,PARAMETER["Scale factor at natural origin",0.9999
,AUTHORITY["EPSG","8805"]]
,PARAMETER["False easting" ,0 ,AUTHORITY["EPSG","8806"]]
,PARAMETER["False northing",0 ,AUTHORITY["EPSG","8807"]]
,UNIT["metre",1 ,AUTHORITY["EPSG","9001"]]
,AXIS["X",NORTH]
,AXIS["Y",EAST]
,AUTHORITY["EPSG","6677"]
]
投影座標系の定義(JGD2011 平面直角座標系 IX(東京付近)):
24. MySQLでの地理座標系の座標の表し方
■テーブルの作成。
扱う座標系が決まっている場合はSRIDを指定する。
CREATE TABLE mygeo3
(id INTEGER,
pnt POINT SRID 4326);
INSERT INTO mygeo3 VALUES (1,
ST_GeomFromText('POINT(43.057265 141.389053)', 4326));
■データの挿入。SRIDを指定する。
■SRIDがマッチしていないとエラーになる
mysql> INSERT INTO mygeo3 VALUES (1, ST_GeomFromText('POINT(43.057265 141.389053)'));
ERROR 3643 (HY000): The SRID of the geometry does not match the SRID of the column
'pnt'. The SRID of the geometry is 0, but the SRID of the column is 4326.
Consider changing the SRID of the geometry or the SRID property of the column.
33. 地理情報に興味を持ったら
• FOSS4G 2018 Okayama
• 2018/11/04-05
• https://www.osgeo.jp/events/foss4g-2018/foss4g-
2018-okayama
• FOSS4G 2018 Tokyo
• 2018/11/09-10
• https://www.osgeo.jp/events/foss4g-2018/foss4g-
2018-tokyo