周辺知識から理解するMySQL の GIS機能 ~ClubMySQL #4

4.7K Views

August 31, 18

スライド概要

2018年8月31日に開催した ClubMySQL #4 での発表資料です。MySQLの話をしたり、MySQLの話をしなかったりしました。
MySQLで扱える「位置」の情報について、その数字の持つ意味を理解するために必要な基礎的な情報が伝われば幸いです。


初出URL:https://www.slideshare.net/sakaik/mysql-gis-clubmysql-4

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Club MySQL #4 周辺知識から理解する MySQL の GIS機能 https://clubmysql.connpass.com/event/96393/ 2018/08/31 日本MySQLユーザ会 坂井 恵(@sakaik)

2.

自己紹介 • 坂井 恵(さかいけい) • Twitter: @sakaik • 日本MySQLユーザ会 副代表(雑用係) • とある魚座A型男子 • MySQL:#エンジョイ勢 #機能派

3.

自己紹介 最近インタビュー記事が掲載されました。ご笑覧ください。 https://employment.en-japan.com/engineerhub/entry/2018/06/22/110000 私の知らない人だ。。。

4.

MySQL 8.0 が出ました (2018年4月19日) • Full InnoDB 化 • ドキュメントストア(X Protocol、MySQL Shell) • JSON • 文字コード関連 • Window関数 • CTE • GIS 参考:MySQL 8.0 よくある質問と回答例: 『MySQL 8.0.11 (GA)がリリースされました』もご覧ください http://sakaik.hateblo.jp/entry/20180420/mysql_8.0.11_ga_released

5.

私がここでGISの話をする目的 MySQLのGIS機能について MySQLユーザ会のこれまでとこれから(2011,とみたまさひろ)より https://www.slideshare.net/tmtm/mysql-6956074 よろしくおねがいする次第です!

6.

今は昔 に似ている 今のMySQLの状況はとっても初期のMySQLの 雰囲気に似ている MySQL 8.0 :新機能満載 「ちょっと試してみた」 「こんな動きするんだ。知ってる?」 → これだけでもブログのネタになります。 みんなもまだ知らないから、「へぇぇ」「そうなんだー」と言って もらえる可能性も高くなります →おいしいのでみなさんもGISお試し&情報発信をぜひ。

7.

今日一番伝えたかったことは、 もう、伝えた! ご清聴 ありがとう ございました

8.

Club MySQL #4 でははじめましょう :-) 周辺知識から理解する MySQL の GIS機能 2018/08/31 日本MySQLユーザ会 坂井 恵(@sakaik)

9.

免責事項 本日お話する内容は、発表者の個人的な調査と学習に基 づき公表するものです。発表者自身も本発表分野につい て学習中であり、本発表中には不正確な内容が含まれて いる可能性があることを、発表者は排除しません。本内 容はノーコミットメントとして公表するものですから、 本内容を重大な経営上の意思判断を行う唯一の情報源と はなさらないでください。 お願い事項 本内容に誤りを見つけたとき、または、本内容をきっか けとして調査なされた結果等の情報がある場合は、ぜひ ブログなどでその情報を他の方に知らせてください。そ の際よろしければ、Twitter で @sakaik にメンショ ンを飛ばしていただけると私も気づけるので嬉しいです。

10.

What is 'GIS' ? • GIS: Geographic Information System (地理情報システム) • MySQL内では spatial (空間の;空間情報)というキーワード • MySQL: spatial 用の型たちと関数群が用意されている • MySQL: 要するに (x, y) 座標のデータを扱えるもの • MySQL: (緯度 経度)の情報も扱える(たぶんこっちが今後広がる使い方?)

11.

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 GAに!

12.

MySQLの Spatial 機能を理 解する 3つの基礎知識 1. 型に関する知識 2. 関数に関する知識 3. 地球に関する知識

13.

1. spatial の型に関する知識 空間情報(Spatial) をあらわす3つの形態 •点 •線 •面 (POINT) (LINESTRING) そのほか、これらの集合である MULTIPOINT MULTILINESTRING MULTIPOLYGON GEOMETRYCOLLECTION もあります。 (POLYGON) ひっくるめて 幾何(形状) (GEOMETRY)

14.

Spatial、3つの表現 テキスト/バイナリ/MySQL内部バイナリ表現 • テキスト:Well known text (WKT) • バイナリ:Well known binary (WKB) • 内部バイナリ: WKB にSRID情報を追加した もの ※ここからは基本的に、WKT を使って話を進めます。

15.

点・線・面のあらわし方 WKT (Well known text): (まず覚えよう) コンマではないことに注意 • 点: POINT (3 5) • 線: LINESTRING (1 2, 5 3, 7 9, 3 12) • 面: POLYGON((1 1, 5 1, 5 8, 1 8, 1 1)) 必ず元の点にもどる POLYGON((1 1, 9 1, 9 9, 1 9, 1 1), (3 3, 5 3, 5 5, 3 5, 3 3)) 中をくり抜く 参考: • 複数点: 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 (略)

16.

WKT と 内部バイナリ 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) | +------------+

17.

点・線・面のあらわし方 WKT → MySQLの内部バイナリ: • ST_GeomFromText() 関数を使用する。 MySQLの内部バイナリ → WKT: Geom の代わりに Point, LineString, Polygon などの関数が それぞれあります • ST_AsText() 関数を使用する。 mysql> SELECT ST_AsText(ST_GeomFromText('LINESTRING (1 2, 5 3, +------------------------------+ | geom | +------------------------------+ | LINESTRING(1 2,5 3,7 9,3 12) | +------------------------------+ 7 9, 3 12)')) geom;

18.

2. Spatial 関数に関する知識 • 約90個の関数(8.0.12時点) 形式の変換をするもの ST_[gtype]From[fmt] : 16個 ※ gtype: Geom, Point, Line, Polygon, およびそれぞれのMulti. ※ fmt: WKT, WKB MySQL固有のもの(値の初期化): 8個 値を抽出するもの: 22個 値を比較するもの: 20個 ほか

19.

MySQLのspatial関数群 形式の変換に関する関数 ST_GeomFromText(), ST_GeometryFromText() ST_PointFromText() ST_LineFromText(), ST_LineStringFromText() ST_PolyFromText(), ST_PolygonFromText() ST_GeomCollFromText(), ST_GeometryCollectionFromText(), ST_GeomCollFromText() ST_MPointFromText(), ST_MultiPointFromText() ST_MLineFromText(), ST_MultiLineStringFromText() ST_MPolyFromText(), ST_MultiPolygonFromText() ST_GeomFromWKB(), ST_GeometryFromWKB() ST_PointFromWKB() ST_LineFromWKB(), ST_LineStringFromWKB() ST_PolyFromWKB(), ST_PolygonFromWKB() ST_GeomCollFromWKB(), ST_GeometryCollectionFromWKB() ST_MPointFromWKB(), ST_MultiPointFromWKB() ST_MLineFromWKB(), ST_MultiLineStringFromWKB() ST_MPolyFromWKB(), ST_MultiPolygonFromWKB() ST_AsBinary(), ST_AsWKB() ST_AsText(), ST_AsWKT()

20.

MySQLのspatial関数群 要素の抜き出し等に関する関数 ST_Latitude() Return latitude of Point Property(Point) Return longitude of Point Property(Point) Return X coordinate of Point Property(Point) ST_Y() Return Y coordinate of Point Property(Point) ST_EndPoint() End Point of LineString Property(Line) Return length of LineString Property(Line) Return number of points in LineString Property(Line) Return N-th point from LineString Property(Line) ST_StartPoint() Start Point of LineString Property(Line) ST_Area() Return Polygon or MultiPolygon area Property(Poly) Return centroid as a point Property(Poly) Return exterior ring of Polygon Property(Poly) ST_InteriorRingN() ST_NumInteriorRing(), ST_NumInteriorRings() Return N-th interior ring of Polygon Property(Poly) Return number of interior rings in Polygon Property(Poly) ST_GeometryN() Return N-th geometry from geometry collection Property(Coll) Return number of geometries in geometry collection Property(Coll) ST_Longitude() ST_X() ST_Length() ST_NumPoints() ST_PointN() ST_Centroid() ST_ExteriorRing() ST_NumGeometries()

21.

MySQLのspatial関数群 比較に関する関数 ST_Contains() Whether one geometry contains another Compare(ST) Whether one geometry crosses another Compare(ST) Whether one geometry is disjoint from another Compare(ST) Whether one geometry is equal to another Compare(ST) Whether one geometry intersects another Compare(ST) Whether a geometry is closed and simple Compare(ST) Whether a geometry is simple Compare(ST) Whether a geometry is valid Compare(ST) Whether one geometry overlaps another Compare(ST) Whether one geometry touches another Compare(ST) ST_Within() Whether one geometry is within another Compare(ST) MBRContains() Whether MBR of one geometry contains MBR of another Compare(MBR) Whether one MBR is covered by another Compare(MBR) Whether one MBR covers another Compare(MBR) Whether MBRs of two geometries are disjoint Compare(MBR) Whether MBRs of two geometries are equal Compare(MBR) Whether MBRs of two geometries intersect Compare(MBR) Whether MBRs of two geometries overlap Compare(MBR) Whether MBRs of two geometries touch Compare(MBR) Whether MBR of one geometry is within MBR of another Compare(MBR) ST_Crosses() ST_Disjoint() ST_Equals() ST_Intersects() ST_IsClosed() ST_IsSimple() ST_IsValid() ST_Overlaps() ST_Touches() MBRCoveredBy() MBRCovers() MBRDisjoint() MBREquals() MBRIntersects() MBROverlaps() MBRTouches() MBRWithin()

22.

MySQLのspatial関数群 その他の便利な関数 ST_Distance() The distance of one geometry from another Convenience Minimum distance on earth between two geometries Convenience Rectangle around two points Convenience Return simplified geometry Convenience Return validated geometry Convenience ST_SwapXY() Return argument with X/Y coordinates swapped Convert ST_Buffer() Return geometry of points within given distance from geometry Operator Produce strategy option for ST_Buffer() Operator Return convex hull of geometry Operator Return point set difference of two geometries Operator Return point set intersection of two geometries Operator Return point set symmetric difference of two geometries Operator Transform coordinates of geometry Operator Return point set union of two geometries Operator Dimension of geometry Property Return MBR of geometry Property Return name of geometry type Property Placeholder function Property Return spatial reference system ID for geometry Property ST_Distance_Sphere() ST_MakeEnvelope() ST_Simplify() ST_Validate() ST_Buffer_Strategy() ST_ConvexHull() ST_Difference() ST_Intersection() ST_SymDifference() ST_Transform() ST_Union() ST_Dimension() ST_Envelope() ST_GeometryType() ST_IsEmpty() ST_SRID()

23.

MySQLのspatial関数群 GeoHash / GeoJSONに関する関数 ST_GeoHash() Produce a geohash value GeoHash Return latitude from geohash value GeoHash Return longitude from geohash value GeoHash ST_PointFromGeoHash() Convert geohash value to POINT value GeoHash ST_AsGeoJSON() Generate GeoJSON object from geometry GeoJSON Generate geometry from GeoJSON object GeoJSON ST_LatFromGeoHash() ST_LongFromGeoHash() ST_GeomFromGeoJSON() MySQL固有のデータ生成関数 Point() LineString() Polygon() MultiPoint() MultiLineString() MultiPolygon() GeomCollection() GeometryCollection() Construct Point from coordinates Create Construct LineString from Point values Create Construct Polygon from LineString arguments Create Construct MultiPoint from Point values Create Contruct MultiLineString from LineString values Create Construct MultiPolygon from Polygon values Create Construct geometry collection from geometries Create Construct geometry collection from geometries Create

24.

MySQLのspatial関数の例(1) • 1.414 + 1.414 + 1 = 3.828 mysql> SELECT ST_Length(ST_GeomFromText('LINESTRING(1 1, 2 2, 3 1, 4 1)')) len; +--------------------+ | len | +--------------------+ | 3.8284271247461903 | +--------------------+ • POINTから要素を抽出する関数 mysql> SELECT ST_X(ST_PointFromText('POINT(13.8 +------+ | x | +------+ | 13.8 | +------+ 9.5)')) AS x;

25.

MySQLのspatial関数の例(2) データの用意 mysql> CREATE TABLE myp (id INTEGER, p POINT); mysql> mysql> mysql> mysql> mysql> mysql> INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO myp myp myp myp myp myp VALUES VALUES VALUES VALUES VALUES VALUES (1, (2, (3, (4, (5, (6, ST_PointFromText('POINT(2 ST_PointFromText('POINT(3 ST_PointFromText('POINT(4 ST_PointFromText('POINT(5 ST_PointFromText('POINT(6 ST_PointFromText('POINT(7 mysql> SELECT id, ST_AsText(p) FROM myp; +------+--------------+ | id | ST_AsText(p) | +------+--------------+ | 1 | POINT(2 1) | | 2 | POINT(3 2) | | 3 | POINT(4 6) | | 4 | POINT(5 2) | | 5 | POINT(6 1) | | 6 | POINT(7 4) | +------+--------------+ 1)')); 2)')); 6)')); 2)')); 1)')); 4)'));

26.

MySQLのspatial関数の例(2) データの用意 mysql> CREATE TABLE myp (id INTEGER, p POINT); mysql> mysql> mysql> mysql> mysql> mysql> INSERT INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO INTO myp myp myp myp myp myp VALUES VALUES VALUES VALUES VALUES VALUES (1, (2, (3, (4, (5, (6, ST_PointFromText('POINT(2 ST_PointFromText('POINT(3 ST_PointFromText('POINT(4 ST_PointFromText('POINT(5 ST_PointFromText('POINT(6 ST_PointFromText('POINT(7 mysql> SELECT id, ST_AsText(p) FROM myp; +------+--------------+ | id | ST_AsText(p) | +------+--------------+ | 1 | POINT(2 1) | | 2 | POINT(3 2) | | 3 | POINT(4 6) | | 4 | POINT(5 2) | | 5 | POINT(6 1) | | 6 | POINT(7 4) | +------+--------------+ 1)')); 2)')); 6)')); 2)')); 1)')); 4)'));

27.

MySQLのspatial関数の例(2) ■「含まれている」の調査 mysql> SELECT id, ST_AsText(p) AS p FROM myp -> WHERE ST_Contains( ST_PolygonFromText('POLYGON((0 0, 5 1, 6 3, 1 3, 0 0))'), p); +------+------------+ | id | p | +------+------------+ | 1 | POINT(2 1) | | 2 | POINT(3 2) | | 4 | POINT(5 2) | +------+------------+

28.

MySQLのspatial関数の例(3) ■MBR MBR: Minimum Bounding Rectangle (最小外接矩形) ST_Envelope() 関数 mysql> SELECT ST_AsText( ST_Envelope( ST_GeomFromText('LINESTRING(1 1, 8 3)') ) ) AS mbr1; +--------------------------------+ | mbr1 | +--------------------------------+ | POLYGON((1 1,8 1,8 3,1 3,1 1)) | +--------------------------------+ ST_Envelope()

29.

ここまでのまとめ • 点と線と面を理解する。マルチもあるよ。 • WKT と MySQL内部バイナリがあることを知る • WKT と MySQL内部バイナリの行き来を自由に できるようになる • いろいろな関数があるので、マニュアルを見てみ よう https://dev.mysql.com/doc/refman/8.0/en/spatial-analysisfunctions.html

31.

3.地球に関する知識 ここまでの話 直交座標系 地球 ※地球上の位置は、まず緯度と経度であらわす

32.

3. 地球に関する知識 さぁ 地球について 語ろう MySQLを捨てて

33.

「地球」を知っていますか? • 大きさは? • どんな形? • 半径だいたい 6,400キロ • 回転楕円体。極径が赤道径が よりも、約300分の1、短い 実は、「地球の形」はひとつではありません! それが「空間参照系」。 さらに、地図(=平面)へ投影する手法もたくさんある

34.

いろいろな地球のモデル 楕円体のままで位置を特定する「地理座標系」 • 長半径と扁平率の定義が異なる様々な地球の形がある • それぞれにID(SRS_ID;SRID)と SRS名が付けられている • 日本で使われる主な 地理座標系の SRS SRS_NAME SRS_ID Tokyo 4301 JGD2000 4612 JGD2011 6668 WGS 84 4326 備考 長半径 扁平率 の逆数 今はほとんど使われない。6,377,397.155 299.1528128 m WGS84との差も大きい 東日本大震災の地殻変化 に対応 6,378,137m 298.257222101 6,378,137m 298.257222101 世界でよく使われる 6,378,137m 298.257223563 WGS84との差は小さい ※とりあえず JGD2011 (6668)、WGS84 (4326) の2つの SRS_ID(数字)は覚えておくとよさげ

35.
[beta]
いろいろな地球

平面の地図に落とし込む「投影座標系」

• 回転楕円体を平面の地図に落とし込む(=投影する)ルール
• 地図の中心となる緯度、経度や投影方法などの情報を持つ
• それぞれにID(SRS_ID)と SRS名が付けられている

JGD2011だけでも、こんなに!
mysql> SELECT SRS_NAME, SRS_ID, ORGANIZATION
-> FROM ST_SPATIAL_REFERENCE_SYSTEMS WHERE SRS_NAME LIKE 'JGD2011%';
各中心点(原点)は 測量法付随の国交省告示で
+--------------------------------------------+--------+--------------+
http://www.gsi.go.jp/LAW/heimencho.html
| SRS_NAME
| SRS_ID | ORGANIZATION |
+--------------------------------------------+--------+--------------+
| JGD2011
| 6668 | EPSG
|
| JGD2011 / Japan Plane Rectangular CS I
| 6669 | EPSG
|
| JGD2011 / |Japan Plane Rectangular CS XIII | 6681 | EPSG
|
| JGD2011 / Japan Plane Rectangular CS II
| 6670 | EPSG
| JGD2011 / |Japan Plane Rectangular CS XIV | 6682 | EPSG
|
| JGD2011 / Japan Plane Rectangular CS III | 6671 | EPSG
| JGD2011 / |Japan Plane Rectangular CS XV
| 6683 | EPSG
|
| JGD2011 / Japan Plane Rectangular CS IV
| 6672 | EPSG
| JGD2011 / |Japan Plane Rectangular CS XVI | 6684 | EPSG
|
| JGD2011 / Japan Plane Rectangular CS V
| 6673 | EPSG
| JGD2011 / |Japan Plane Rectangular CS XVII | 6685 | EPSG
|
| JGD2011 / Japan Plane Rectangular CS VI
| 6674 | EPSG
|
JGD2011
/
Japan
Plane
Rectangular
CS
XVIII
|
6686
|
EPSG
|
| JGD2011 / Japan Plane Rectangular CS VII | 6675 | EPSG
|
|
JGD2011
/
Japan
Plane
Rectangular
CS
XIX
|
6687
|
EPSG
|
| JGD2011 / Japan Plane Rectangular CS VIII | 6676 | EPSG
|
| JGD2011 / |UTM zone 51N
| 6688 | EPSG
|
| JGD2011 / Japan Plane Rectangular CS IX
| 6677 | EPSG
| JGD2011 / |UTM zone 52N
| 6689 | EPSG
|
| JGD2011 / Japan Plane Rectangular CS X
| 6678 | EPSG
| JGD2011 / |UTM zone 53N
| 6690 | EPSG
|
| JGD2011 / Japan Plane Rectangular CS XI
| 6679 | EPSG
| JGD2011 / |UTM zone 54N
| 6691 | EPSG
|
| JGD2011 / Japan Plane Rectangular CS XII | 6680 | EPSG
| JGD2011 / UTM zone 55N
| 6692 | EPSG
|
+--------------------------------------------+--------+--------------+
25 rows in set (0.00 sec)

36.

SRSの定義 • MySQLでは SRSの定義を INFORMATION_SCHEMA の以下のテーブル(ビュー)で参照できる ST_SPATIAL_REFERENCE_SYSTEMS mysql> SELECT * FROM ST_SPATIAL_REFERENCE_SYSTEMS WHERE SRS_ID=6668¥G *************************** 1. row *************************** SRS_NAME: JGD2011 SRS_ID: 6668 ORGANIZATION: EPSG ORGANIZATION_COORDSYS_ID: 6668 DEFINITION: GEOGCS["JGD2011",DATUM["Japanese Geodetic Datum 2011",SPHEROID["GRS 1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","1128"]],PRIMEM["Gre enwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.017453292519943278,AUTHORITY["EPSG","91 22"]],AXIS["Lat",NORTH],AXIS["Lon",EAST],AUTHORITY["EPSG","6668"]] DESCRIPTION: NULL

37.

SRSの定義 • DEFINITION 列を整形してみる 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"]] GEOGCS: 地理座標系。 投影座標系の場合は PROJCS AXIS: Lat(緯度)、Lon(経度)の順で定義されているの で、WKTで表現する時もこの順で。 CS: Coordinate System (座標系)

38.

MySQLでの地理座標系の座標の表し方 ■テーブルの作成。SRIDを指定する。 CREATE TABLE mygeo3 (id INTEGER, pnt POINT SRID 4326); ■データの挿入。SRIDを指定する。 INSERT INTO mygeo3 VALUES (1, ST_GeomFromText('POINT(43.057265 141.389053)', 4326)); ■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. SRIDがちゃうで。カラムで 4326 言うてるんやから、0なんて呉れたら、 あかんて。(指定しない時は 0 が与えられたものとして動作する)

39.

緯度経度で関数の利用 2点間の距離を測る mysql> SELECT ST_Distance_Sphere( -> ST_GeomFromText('POINT(43.057265 141.389053)', 4326), -> ST_GeomFromText('POINT(43.064167 141.346945)', 4326) ) dist; +--------------------+ | dist | +--------------------+ | 3505.9915447964927 | +--------------------+ 1 row in set (0.02 sec) 札幌のコンベンションセンターから、北海道庁まで、 約 3.5km だと計算された

40.

緯度経度のお話 • 緯度・経度について、本当に知っていますか? • 基準となる点は? • 測り方は? • 緯度・経度を与えれば正確に位置が決まる?

41.

まず、地球の形 • 回転楕円体 で近似 • JGD2011 では、GRS 1980 を採用 • JGD2011 では、赤道半径、 6378137 m • JGD2011 では、扁平率、 298.257222101 分の1 (これだけ赤道半径が短い) • JGD2011 では、本初子午線をグリニッジ(付近) に

42.

緯度・経度 • 南北方向の位置と東西方向の位置の2つを指定 することで、場所を特定 • 南北方向の位置: 緯度 • 東西方向の位置: 経度 • 南北方向の基準: 赤道 • 東西方向の基準:本初子午線(便宜上決める)

43.

緯度経度: 本初子午線 • 便宜上決めた、経度ゼロとなる基準線 • 北極と南極を結ぶ • Q: グリニッジ天文台だと思ってるでしょ? • →今は102.5mほど東に(知ってるよね) • Q: 基準は当然グリニッジだけだと思うでしょ? • →パリ子午線とか、アテネ子午線とか、リスボン子午 線とか、ブリュッセル子午線とか、ジャカルタ子午線 とか etc • Q: ちなみに「子午線」って名前、(つづく)

44.

緯度経度: 「子午線」 • 「子午線」って名前を見て何かピンときますか? • 「子午(しご)」→「子(ね)」と「午(うま)」 • そう。北と南なのですよ。 • 余談ですが、お昼の12時のこと。「正午」 • では夜中の12時は? • 「正子(しょうし)」 • ちなみに、朝6時(「正卯」しょうう)、夕方6時(「正酉」しょうゆう) ニッポンっておもしろい!!

45.

緯度経度: 先ほどの本初子午線ですが • MySQL:ST_SPATIAL_REFERENCE SYSTEMS の定義よ り加工抜粋 PRIMEM["Athens", 23.716337499999998, PRIMEM["Bern" ,7.439583333333334, PRIMEM["Bogota" ,-74.08091666666667, PRIMEM["Brussels" ,4.3679749999999995, PRIMEM["Ferro" , -17.677777777777774, PRIMEM["Greenwich" ,0, PRIMEM["Jakarta" ,106.80771944444443, PRIMEM["Lisbon", -9.131906111111112, PRIMEM["Madrid", -3.6879388888888895, PRIMEM["Oslo", 10.722916666666666, PRIMEM["Paris" ,2.5969213, PRIMEM["Rome" ,12.452333333333332, PRIMEM["Stockholm" ,18.058277777777775, 歴史上、いろいろ な「経度ゼロ度」 があったことがわ かります

46.

日本での測量 • 緯度経度といえば、これ

47.

三角点 • 測量の基準となる点 • 国土地理院が設置/管理 • 主に一等から四等まである • 一等三角点は全国に約330か所 (一辺が30~50km程度の三角形を描くよう) • 名前は三角点だけど四角い (三角測量をするための点です)

48.

三角測量 • 三角形の合同条件 (=一意に特定する条件) 「一辺と両端角が等しい」を利用 • ひとつの三角点から、残り2つの 三角点を見て、その間の角を測る • その成果が、右図 (一等三角点網) 図:http://www.hinet.bosai.go.jp/about_earthquake/secA.1.html より加工引用

49.

三角測量 • 一辺の長さと、両端の角が決まれば、新しい一 点の位置を特定できる ↓ • 一等三角点の一辺は、およそ30~50km ↓ • 最初の一辺ってどうやって決める!? (30kmもの距離を正確に測るのは困難!) ↓ • そこで、「基線測量」

50.

三角測量:基線 • 一辺5kmほどの距離を正確に測り(これくらいの距離 なら、昔でも頑張って測れる)、それを広げていく • 最初の基線: 相模野基線 • 最初の大三角形(右図): 鹿野山(千葉県) 丹沢山(神奈川県) 麻布台(東京都) を結ぶ三角形 地図データ (C)2018 Google, ZENRIN

51.

三角測量:相模野基線 地図データ (C)2018 Google, ZENRIN 地図データ (C)2018 Google, ZENRIN 最初の短い線を底辺とする三角形を両脇に作り、 新たな点を定める。 次にそれらの点を結ぶ(少し長くなった)線を 底辺として新たな2つの点を決定・・・と続け ていく。 →「増大」といいます 地図データ (C)2018 Google, ZENRIN

52.

三角測量:相模野基線 地図データ (C)2018 Google, ZENRIN これでめでたく、 最初の大三角形が決定! 地図データ (C)2018 Google, ZENRIN 地図データ (C)2018 Google, ZENRIN

53.

三角測量:基線 相模野基線が作り出す最初の大三角形の「東 京」の点は、どこ? ↓ • 「日本経緯度原点」です!

54.

日本経緯度原点の説明板内容 「日本経緯度原点は、わが国における経度と緯度を測定する基準と なる点である。明治25年(1892年)に東京天文台の子午環(特殊な望遠 鏡)の中心を日本経緯度原点と定め、その経度、緯度、および方位 角を原点数値として決定した。 大正12年(1923年)の関東地震では子午環が崩壊したため、日本経 緯度原点の位置に金属標を設置した。 平成13年(2001年)の測量法改正により、測量の基準として世界測 地系を採用した。この改正に伴い、新たな原点数値を世界測地系に 基づき決定した。 その後、平成23年3月11日の東北地方太平洋沖地震による地殻変 動に伴い、日本経緯度原点が東へ27センチメートル移動したため、 原点数値を以下の値に改正した。 原点数値 経度 東経 139°44'28.8869" 緯度 北緯 35° 39'29.1572" 方位角 32° 20'46.209"

55.

三角測量:基線 • 相模野基線を含め、全国(現在の日本の領土内)に 14個 の基線がある • 東京から離れると、誤差が蓄積するので、それを 補正するため • 札幌にもある。→行ってきました!

56.

三角測量:札幌基線 2018年7月、丘珠空港に 降り立ってから札幌南端 /北端の基線三角点を巡 り、札幌駅にたどり着く までの私の足跡 青色:バス 黄緑色:電車 ピンク:徒歩 地図データ (C)2018 Google, ZENRIN

57.

三角測量:札幌基線 札幌南端 札幌北端

58.

札幌北端 説明の看板は作ってくれているのですが、、、、 誰に見せているんだろう感(笑)

59.

(札幌の話ここまで)

60.

三角測量:基線 • 冒頭に見せた三角点。 • 浜松にあります。 • どんなところにあると思いますか。

61.

三角測量:基線 • こんなところにあります! セブンイレブン浜松神原町店

62.

浜松のマチナカの一等三角点 • 一等三角点は、一般に遠くを見通せる場所に設置 • 浜松の駅近くに用事があったので、地図を眺めてい たら、市内に一等三角点があることを発見 • どう見ても、山とか高台とかではなさそう • しかも、これ、コンビニの駐車場にある!? • これは見てみなければ! とレンタカー借りて行っ てきました

63.

浜松のマチナカの一等三角点 • あとで調べたら、これも「基線」のひとつでした • 「三方ヶ原基線」の南端点 • 相模野基線の次に設定された、日本で2番目の基線

64.

三角点の話・おしまい

65.

「高さ」の話

66.

高さ(標高)ってなんだろう • 実はMySQLには「高さ」を扱う特別の仕組み はないので、別カラムに数値を格納する形で取 り扱うことになる • 高さって実は結構複雑 • GPS等の衛星(GNSS)であっという間に高さが 分かるんじゃない?(わかりません!)

67.

高さ(標高)ってなんだろう • 「水は高いところから低いところに流れる」 • GNSSで分かるのは、モデルとする回転楕円体 の表面からの距離 →実際の地球は、モデル通りではなく、かなり デコボコ • 「山もあるし、海だって深いところあるし、デコボコ してるよな」→そういう話じゃありません

68.

日本における標高の基準 • 日本では、東京湾の平均海水面の高さをゼロ メートルとしている • 平均海水面を、欲しいタイミングでいつでも見 るのは困難なので、一度頑張って測ったら、そ れをもとに他の場所に基準を移しておく →日本水準原点 • それがあるのが東京の国会議事堂の前の公園内

69.

水準原点:日本における標高の基準 24.3900m

70.

水準原点:日本における標高の基準 裏側 「國帝本日大」

71.

水準原点:日本における標高の基準 • 真ん中の鉄扉を開けたところに、日本の標高の 基準となる 24.3900m の基準線がある。 • この扉は、年に1日だけ、開く (例年「測量の日」の少し前の5月) 当日披露し損なってしまったけ ど、こちらも過去2回ほど高さが 変わっています。 最初に水準原点が作られたのが 明治24年5月。そのときの水準点 高が、24.5000m。偶然と見るか あるいは・・・?

72.

水準原点:日本における標高の基準 • 真ん中の鉄扉を開けたところに、日本の標高の 基準となる 24.3900m の基準線がある。 • この扉は、年に1日だけ、開く (例年「測量の日」の少し前の5月)

73.

水準原点:日本における標高の基準 • 本点の他に周囲に予備として5つの副点(付属 点)

74.

話戻して 標高ってなんだろう • 「地球ってデコボコ」という話までした • 「水は低→高に流れてはいけない」も説明した ■「標高ゼロメートル」の考え方 • もし海水が陸に邪魔されずに好きに入り込めたら (あるいはトンネルを掘ったらという考え方でも良 い)、平均水面がどの位置にくるのか、これがゼ ロメートルの考え方 • このゼロメートルの面は、モデルとした回転楕円 体とは一致しない(回転楕円体面から、上回った り下回ったりする=デコボコ) • なぜ? → 地球上は、場所によって重力が違うか ら!! • 重力が強いところは平均水面が盛り上がる(=ゼ ロメートルラインが上に上がる)

75.

標高ってなんだろう 山や密度の大きな物質で構成さ れている場所がある 重力が大きなところに、水は引 き寄せられ、盛り上がる。 (青)ゼロメートルライン

76.

標高ってなんだろう • この標高ゼロメートルラインを「ジオイド面」という • 「標高」とは、このジオイド面からの鉛直方向の距離 のこと • ジオイド高は、測定によって求める 図:ジオイドの概形 国土地理院サイトより http://www.gsi.go.jp/buturisokuchi/geoid.html

77.

「標高」のまとめ • 地球の「標高ゼロメートル」ラインは、モデル とする回転楕円体とは一致せず、デコボコして いる • GNSSで得られるのは、回転楕円体高なので、 衛星からの情報だけで標高を求めることはでき ない。ジオイド高を足し引きしたものが標高と なる • 日本国内のジオイド高は国土地理院のサイトで、 緯度経度を与えることで調べることができる https://vldb.gsi.go.jp/sokuchi/surveycalc/geoid/calcgh/calcframe.html

78.

地球についての話、いったん 終わり

79.

MySQLで扱う座標系の話 (復習) 「地理座標系」と「投影座標系」がある • MySQLでは、INFORMATION_SCHEMA の ST_SPATIAL_REFERENCE_SYSTEMS に定義が格納されている

80.

地理座標系 • 緯度と経度 • 回転楕円体の定義様々、緯度の定義様々 日本で使うには、とりあえず SRS として JGD2011 (6668)、WGS84 (4326) を覚えておこう • MySQLで扱うのは、度分秒ではなく度(小数) • 度分秒の 度+分/60+秒/3600 で小数化できる

81.

投影座標系 • 回転楕円体上の点を地図(平面)に落としたも の • 様々な平面化の手法がある • JGD2011では、主に2種類の投影座標系が用意され ている • 緯度経度ではなく、距離であらわす • JGD2011では、「メートル」

82.
[beta]
JGD2011の座標系
mysql> SELECT SRS_NAME, SRS_ID, CONCAT(SUBSTR(DEFINITION,1,15),"...") DEFINITION
-> FROM st_spatial_reference_systems WHERE SRS_NAME LIKE 'JGD2011%';
+--------------------------------------------+--------+--------------------+
| SRS_NAME
| SRS_ID | DEFINITION
|
+--------------------------------------------+--------+--------------------+
| JGD2011
| 6668 | GEOGCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS I
| 6669 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS II
| 6670 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS III | 6671 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS IV
| 6672 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS V
| 6673 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS VI
| 6674 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS VII | 6675 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS VIII | 6676 | PROJCS["JGD2011... |
| JGD2011
/ Japan
Plane Plane
Rectangular
CS IX CS XIII
| 6677
PROJCS["JGD2011...
|
| JGD2011
/ Japan
Rectangular
| |6681
| PROJCS["JGD2011...
|
| JGD2011
/ Japan
Plane Plane
Rectangular
CS X CS XIV
| 6678
PROJCS["JGD2011...
|
| JGD2011
/ Japan
Rectangular
| |6682
| PROJCS["JGD2011...
|
| JGD2011
/
Japan
Plane
Rectangular
CS
XI
|
6679
|
PROJCS["JGD2011...
|
| JGD2011 / Japan Plane Rectangular CS XV
| 6683 | PROJCS["JGD2011... |
| JGD2011
/ Japan
Plane Plane
Rectangular
CS XIICS XVI
| 6680
PROJCS["JGD2011...
|
| JGD2011
/ Japan
Rectangular
| |6684
| PROJCS["JGD2011...
|
| JGD2011 / Japan Plane Rectangular CS XVII | 6685 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS XVIII | 6686 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS XIX | 6687 | PROJCS["JGD2011... |
| JGD2011 / UTM zone 51N
| 6688 | PROJCS["JGD2011... |
| JGD2011 / UTM zone 52N
| 6689 | PROJCS["JGD2011... |
| JGD2011 / UTM zone 53N
| 6690 | PROJCS["JGD2011... |
| JGD2011 / UTM zone 54N
| 6691 | PROJCS["JGD2011... |
| JGD2011 / UTM zone 55N
| 6692 | PROJCS["JGD2011... |
+--------------------------------------------+--------+--------------------+
25 rows in set (0.02 sec)

DEFINITION列を見る

 GEOGCS:地理座標系
 PROJCS:投影座標系

SRS_NAME列を見る

 ただのJGD2011
 Japan Plane Rectangular
CS の 19個
 UTM zone の5個
 があることがわかる

83.

Japan Plane Rectangular CS ってなに? • 「日本の平面直角座標系」 • 国土交通省告示第9号で定義 • 全国を19のエリアに分割 • 位置は、各エリアの原点か らの北、東方向への距離で 表す • 各エリアは自治体界を境界 線とするよう定義されてい る(機械的に長方形で区切 られているわけではない) 国土地理院サイトより http://www.gsi.go.jp/sokuchikijun/jpc.html

84.

UTM zone ってなに? • 日本近郊は zone 51N~55Nでカバーされてい る • Universal Transverse Mercator • 経度6度ごとに区切った細長い帯に 1~60の番 号を付与 • 西経180度から東回りに 1から順に附番 • 本来は更に緯度8度ごとに更に分割するが、MySQLで は(?)、北側と南側の2つにのみ分割して扱っている模 様(だから zone 51は、51N と 51S の2種類のみが存在する) UTM zone に ついてもっと詳しくしりたい人は、国土地理院のサイトへ: http://www.gsi.go.jp/chubu/minichishiki10.html

85.
[beta]
という知識を得て、ふたたび
JGD2011の座標系定義を見てみる
mysql> SELECT SRS_NAME, SRS_ID, CONCAT(SUBSTR(DEFINITION,1,15),"...") DEFINITION
-> FROM st_spatial_reference_systems WHERE SRS_NAME LIKE 'JGD2011%';
+--------------------------------------------+--------+--------------------+
| SRS_NAME
| SRS_ID | DEFINITION
|
+--------------------------------------------+--------+--------------------+
| JGD2011
| 6668 | GEOGCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS I
| 6669 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS II
| 6670 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS III | 6671 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS IV
| 6672 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS V
| 6673 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS VI
| 6674 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS VII | 6675 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS VIII | 6676 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS IX
| 6677 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS X
| 6678 | PROJCS["JGD2011... |
| JGD2011
Japan Rectangular
Plane Rectangular
| | 6681
| PROJCS["JGD2011...
|
| JGD2011
/ Japan/ Plane
CS XI CS |XIII6679
PROJCS["JGD2011...
|
|
JGD2011
/
Japan
Plane
Rectangular
CS
XIV
|
6682
|
PROJCS["JGD2011...
|
| JGD2011 / Japan Plane Rectangular CS XII | 6680 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS XV
| 6683 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS XVI | 6684 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS XVII | 6685 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS XVIII | 6686 | PROJCS["JGD2011... |
| JGD2011 / Japan Plane Rectangular CS XIX | 6687 | PROJCS["JGD2011... |
| JGD2011 / UTM zone 51N
| 6688 | PROJCS["JGD2011... |
| JGD2011 / UTM zone 52N
| 6689 | PROJCS["JGD2011... |
| JGD2011 / UTM zone 53N
| 6690 | PROJCS["JGD2011... |
| JGD2011 / UTM zone 54N
| 6691 | PROJCS["JGD2011... |
| JGD2011 / UTM zone 55N
| 6692 | PROJCS["JGD2011... |
+--------------------------------------------+--------+--------------------+
25 rows in set (0.02 sec)

さっきと違って、イ
キイキとして見えて
きたでしょう?

86.

平面直角座標系 JGD2011 の 9系 の定義を見てみよう PROJCS["JGD2011 / Japan Plane Rectangular CS IX", 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"]], 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"]] |

87.

ST_Transform() • 座標系変換の関数 ・・・・と思われる • この関数を使うと、SRIDの変換ができる、つまり地理 座標系と直交座標系の変換ができる・・・・ものだと 期待 2018/08/30時点 MySQLマニュアルより https://dev.mysql.com/doc/refman/8.0/en/spatial-operator-functions.html#function_st-transform

88.

ST_Transform() • 歯切れの悪い説明になっていますが、、、MySQLマ ニュアルにもある、この関数、、、 まだ実装されていない!! (MySQL 8.0.12時点) ※メジャーバージョンの途中(例えば MySQL 8.0.12から)に対応した機能については「この関数は MySQL 8.0.12からアベイラブルです」のような言葉が必ず入るが、この関数にはそのような記述もない。

89.

ST_Transform() • 歯切れの悪い説明になっていますが、、、MySQLマ ニュアルにもある、この関数、、、 まだ実装されていない!! (MySQL 8.0.12時点) 今後に期待しましょう。

90.

GeoHash • 緯度経度が含まれるエリアを、指定された桁数 のハッシュ値であらわす仕組み • 桁数が大きいほど、エリアの広さが狭くなる • 今日の会場(Yahoo! LODGE)の入り口付近をあらわす10桁の GeoHash mysql> SELECT ST_GeoHash(139.735149, 35.6794652, 10) GeoHash; +------------+ | GeoHash | +------------+ | xn76gz0pby | +------------+ • さわらの伊能忠敬記念館が含まれるエリアを示す4桁の GeoHash mysql> SELECT ST_GeoHash(140.495028, 35.8883603, 4); +---------------------------------------+ | ST_GeoHash(140.495028, 35.8883603, 4) | +---------------------------------------+ | xn7u | +---------------------------------------+

91.

GeoHashのしくみ • [0-9a-z] のうち、a, i, l, o を除いた32文字を使用 したハッシュ値 • 桁数が長いほど、エリアを狭く特定できる • 桁数が長いハッシュ値の先頭n文字のみを採用 しても、もとのエリアが必ずその中に含まれる • 次ページから詳細解説!

92.

GeoHashのしくみ(詳細)(1) • 地球全体を南北4つ、東西8つ、計32個のエリアに分割し、 以下のように値を割り振る(1桁のHash値) • 1エリアは南北方向、東西方向とも、45度

93.

GeoHashのしくみ(詳細)(2) • ひとつのエリアの中を、南北8つ、東西4つ の計32分割し、 以下のように32個の符号を割り振る(横長のエリアとなる) (ここでは、エリア "s" を例に) こうやって裏返して ひっくり返した順で 2桁目が振られる

94.

GeoHashのしくみ(詳細)(3) • ひとつのエリアの中を、南北4つ、東西8つ の計32分割し、 以下のように32個の符号を割り振る (ここでは、エリア "s0" を例に)

95.

GeoHashのしくみ(まとめ) • このように、桁数が増えるごとに、エリア内を さらに分割していく仕組みなので、長いハッ シュ値の先頭部分だけを採用しても、必ず元の エリアが含まれる • (赤道付近の場合) 5桁の時 一辺4.9km、7桁で153m、 9桁で4.7m、11桁で15cmくらい!!

96.

まとめにはいるよ: MySQLのSpatialの課題 • 関数類の拡充に期待(まだまだ全然不足) • 8.0での関数名廃止の影響がGISツールに(各ツー ル側の対応待ち) • ノウハウの蓄積・共有はこれから • 事例の充実が待ち望まれる 本質的にアカンというもの(=行き止まりのもの)は、なさそうな印象。 本格採用の時に向けて、いまから準備を進めてはいかがでしょうか。

97.

本日のメインテーマ MySQLのGIS機能について MySQLユーザ会のこれまでとこれから(2011)より https://www.slideshare.net/tmtm/mysql-6956074

98.

そのために • まず、興味を持ってみる • まず、触ってみる • まず、発信してみる(ブログやセミナ等) • まずまずの反応を得る いますぐできる第一歩: とりあえず、今日の感想文をブロ グに書くところからスタート! --- おしまい

99.

参考URL等  Spatialの型/関数(MySQLマニュアル) • https://dev.mysql.com/doc/refman/8.0/en/spatial-types.html • https://dev.mysql.com/doc/refman/8.0/en/spatial-analysis-functions.html  国土地理院 • http://www.gsi.go.jp/index.html  JGD2000からJGD2011への変更に関する説明(国土地理院) • http://www.gsi.go.jp/sokuchikijun/jgd2000-2011.html  地理空間情報活用推進基本法 • http://elaws.egov.go.jp/search/elawsSearch/elaws_search/lsg0500/detail?lawId=419AC1000000063  地図と測量の科学館(国土地理院;つくば) • http://www.gsi.go.jp/MUSEUM/  伊能忠敬記念館(千葉県香取市佐原) • https://www.city.katori.lg.jp/sightseeing/museum/index.html