ちきゅうは丸い ー地球上の位置情報を示す「度」の基本を学ぼう

位置情報データの時代がやってきた
コンピュータ上で取り扱ったり管理したりするデータの種類は年々拡がっています。その中で近年注目されているものの1つが位置情報に関するデータです。線路や道路の線、土地の形、人流データのような人が居る地点などがあります。これらのデータを一般に「地理情報」と呼びます。
本連載では、様々な話題を通して、MySQLで地理情報を扱うために必要な知識をアラカルトで紹介していきます。「なぜMySQLなのか?」と言うと、それは筆者の「推しデータベース」だからです。ただし、MySQLの機能を使いながら説明はしていきますが、特にMySQLに興味がない方でも地理情報データに関する様々な知識を得られるような趣向になっているので、楽しんでお読みいただければと思います。
MySQLで扱う位置情報
MySQLには地球上の位置情報を扱うための専用の仕組みが用意されています(詳しくは第2回で解説します)。位置情報というのは要するに「座標」で表される情報のことですから、ちょっとした計算のルールを知っていれば、わざわざ専用の仕組みを作るほどでもないように感じるかもしれません。
例えば、座標(3,4)と(7,6)の間の距離(図1(a))を知りたければ、ピタゴラスの定理を使って、次のような数式で計算できます。
$$\sqrt{(7-3)^2 + (6-4)^2} \; = \, \sqrt{4^2 + 2^2} \: = \: \sqrt{20 } \: ≒ 4.47$$ところが、地球上の2点間の距離と言うと、少し状況が異なります。先ほどのピタゴラスの定理は平面座標(デカルト座標)上で成立するものですが、現代人たる私たちの認識として地球は平らではありません。つまり、曲面に沿った長さを求める必要があります(図2(a)(b))。この計算は非常に複雑で、先ほどの計算式のように「ちょっと自分でやってみよう」というには荷が重いものです。
そこで、こういった計算を行うために提供された専用の機能(俗に「GIS機能」と呼んだりします)が力強い味方となります。GIS機能はMySQLの専売特許というわけではなく、他のRDBMSにも搭載されていますし、そもそもRDBMSではなく様々なプログラム言語から使用するためのライブラリが公開されていたりもします。
位置の基本は緯度経度
地球上の位置を表すには様々な方法があります。狭いエリアであれば、土地勘のある人同士の「一本松の下」は場所を特定するための十分な情報となり得るでしょう。仲間うちならば「いつもの居酒屋で」で場所を特定できるかもしれません。とはいえ、このような狭い範囲の共通のコンテキストを持たない人にも正確な場所を伝えるための手段が必要です。その中の1つが「緯度」と「経度」です。
緯度と経度は誰もが知っているようで、実はあまりきちんとは知られていないものです。本連載でも、何度か取り上げていきたいと考えています。
緯度と経度の色々
緯度と経度の表し方はいくつかあります。例えば、東京駅の緯度と経度は次のように表されます。
北緯 35度40分52秒3272(または 35度40分52.3272秒)
東経 139度46分1秒6320(または 139度46分1.6320秒)
「度」と「分」と「秒」を使用したこの表現方法は、すでにご存じの方も多いでしょう。これをここでは「度分秒表記」と呼びます。このほか、「度」と「分」のみを使用した「度分表記」があります。同じ緯度経度を度分表記で表すと、次のようになります。
北緯 35度40.87212分
東経 139度46.02720分
度分表記は比較的目にすることが少ないかもしれません。筆者が愛用しているGPSロガー(GARMINの「etrex 20x」)では度分表記となっています。
もう1つ「度表記」を紹介します。度表記は「度分秒」「度分」のように複数の単位を使った場合と比べて、単位が「度」1つでシンプルに表現できています。
北緯 35.681202度
東経 139.767120度
この度表記は、MySQLをはじめとして多くのGISツールで使用されています。例えば、Googleマップではある地点を表示したときのURLに、この度表記での緯度経度が表示されていることが分かります。
1度は60分、1分は60秒であることを利用すれば、これらの表記は簡単に変換できます。電卓を使って変換したいところですが、一応「MySQLの連載」ということになっているので、MySQLを使って計算してみましょう。ここでは、度表記のデータがあるときに、それを度分表記や度分秒表記に変換する例を示します。
・テーブルを作成して「度」のデータを登録mysql> CREATE TABLE t (degree DOUBLE); mysql> INSERT INTO t VALUES ('139.767120'); mysql> SELECT degree FROM t; +-----------+ | degree | +-----------+ | 139.76712 | +-----------+ 1 row in set (0.000 sec)
・度分に変換
度は整数部分を採用、分は度以外の部分に60をかけたもの
mysql> SELECT floor(degree) degree, degree*60%60 min FROM t; +--------+-------------------+ | degree | min | +--------+-------------------+ | 139 | 46.02720000000045 | +--------+-------------------+ 1 row in set (0.000 sec)
・度分秒に変換
度は整数部分を採用、分は度以外の部分に60をかけたものの整数部分、秒は度分以外の部分に60をかけたもの
mysql> SELECT degree, floor(degree) deg, floor(degree*60%60) min, degree*60*60%60 second FROM t; +-----------+------+------+--------------------+ | degree | deg | min | second | +-----------+------+------+--------------------+ | 139.76712 | 139 | 46 | 1.6320000000414439 | +-----------+------+------+--------------------+ 1 row in set (0.000 sec)
さまざまな計算方法がありますが、ここでは「度や分が60ごとに周期している」ことに着目し、剰余を使用してシンプルな式で表せるように工夫しています。浮動小数点計算による丸め誤差が発生していますが、そこは気にしないということで。
英語では、度は「degree」、分は「minute」、秒は「second」と呼びます。でもsecond(=2nd;2番目の)があるのに「first」がないのはなぜでしょう。その疑問は、時刻や角度が名付けられた歴史を知ることで解決します。
まず、時刻における「時」や角度における「度」が基本単位としてあります。これよりも細かい時間や角度(以後「角度」)を扱うようになったときに基本単位を60分割した単位を作り、「細かく分けたもの」という意味を持つ「minute」と名付けられました。さらにminuteを60分割して「2番目の細かいもの」という意味で「second minute」と名付けられました。最初のminute(分割)はいわばfirst minute(ラテン語で minuta prima)で、2番目のさらなるminuteはsecond minute(同minuta secunda)だったのが、分は単に“minute”、秒は単に“second"と呼ばれるようになったという経緯です。
度分秒の表記方法は、上で説明したように「35度40分52秒」と漢字を使って書く方法のほか「35°40′52″」のように記号を用いて記述することもできます。「°」「′」「″」がそれぞれ 度、分、秒に相当しますが、「′」と「″」のどちらが分だったか秒だったか、混乱してしまう人もいるのではないでしょうか(昔の私がそうでした)。secondが“2番目(2nd)”の意味だと知ってからは、プライム(′)記号が2つ重なった「″」が秒であることを間違えなくなりました。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- SQL文の移行(3)
- HTTPキャッシュの効果
- NginxでハイパフォーマンスWordPress in SoftLayer
- プライム・ストラテジー、実行時間3ミリ秒台、秒間1000リクエストを実現するWordPress実行環境「KUSANAGI」を発表
- Apache Kuduによるデータ移行処理のチューニング
- オラクル、「MySQL 5.7 Development Milestone Release(DMR)」をリリース
- MySQL Clusterにおけるレプリケーションの基礎
- ベアメタル環境とDockerコンテナ環境の性能比較
- SQL実行計画の疑問解決には「とりあえずEXPLAIN」しよう
- 2D〜4Dで向きや大きさを持つ数字の集まり「ベクトル」について学ぼう