Asial Blog

Recruit! Asialで一緒に働きませんか?

緯度・経度と測地系について

カテゴリ :
バックエンド(プログラミング)
タグ :
PHP
JavaScript
HTML5

はじめに



モバイル端末が増えるにつれ、Webサイトでも位置情報を扱うことがあります。例えば、現在地周辺の店舗やホテルを探すサイトなど、よく見かけませんか?今回は、そんな位置情報を使う際に知っておきたいマメ知識、「測地系」について簡単にまとめてみました。今更ながら、結構重要です。


測地系



緯度・経度を扱う際には、聞きなれない単語が出てきます。例えば、

  • 日本測地系(Tokyo Datum, TKY)
  • 日本測地系2000(The Japanese Geodetic Datum 2000, JGD2000)
  • 世界測地系(World Geodetic System 1984, WGS84)

などなど。これらのことを理解していないと、思わぬ落とし穴にはまってしまいます。そもそも「測地系」という言葉すら、一般的には聞きなれません。

では、測地系とは何か?

地理や測地学に疎い人は、緯度・経度は場所によって一意な値であると、と考えがちです。ところが、各地点の緯度・経度の値は、測量の方法によって異なります。ざっくり言うと、それぞれの方法で測量された座標系のことを「測地系」といいます(特定の前提条件により測定された座標系)。

実際に測量を行うためには、地球の形を仮定し、基準点を定めます。これらから、他の場所の緯度・経度を測定していきます。地球の形が完全な球形なら、わざわざ形を仮定する必要はないのですが、実際には楕円形がさらに変形した形だそうです。


日本測地系(TKY)



日本測地系(TKY)では、地球の形をベッセル楕円体を採用しています。そして、天文観測によって決定された緯度・経度原点から測量されています。ちなみに、ベッセル楕円体を採用したのは明治政府です。結構古いんですね。


世界測地系(WGS84)



世界測地系とは以下の通りです。

世界測地系とは、VLBIや人工衛星を用いた観測によって明らかとなった地球の正確な形状と大きさに基づき、世界的な整合性を持たせて構築された経度・緯度の測定の基準で、国際的に定められている測地基準系をいいます。


引用:国土地理院


ちなみに、日本測地系の緯度・経度で表している地点を、世界測地系で表すと以下のようにズレるそうです。

  • 稚内付近では北西方向へ400m
  • 東京付近では北西方向へ450m
  • 福岡付近では北西方向へ420m



日本測地系2000 (JGD2000)



日本測地系2000とは、世界測地系の中で、日本国が構築した部分のことです。日本測地系2000での経度・緯度は、世界測地系であるITRF94座標系(International Terrestrial Reference Frame:国際地球基準座標系)とGRS80(Geodetic Reference System 1980:測地基準系1980)の楕円体を使用しています。

一方で、WGS84は、米国が構築・維持している世界測地系です。国土地理院によると、WGS84とITRF系は現在ほとんど同一のものだそうです。つまり、上記の世界測地系(WGS84)と日本測地系2000(JGD2000)はほぼ同じと考えてよいでしょう。

2002年4月1日以降、日本での測地系は日本測地系2000に移行しました。法律に基づき、基本測量や公共測量は世界測地系に基づき測量を実施しなければなりません。


ブラウザで取得できる測地系



HTML5では、JavaScriptで以下のようにして緯度・経度を取得できます。このAPIで取得できる緯度・経度の測地系はWGS84です(W3C)。

  1. navigator.geolocation.getCurrentPosition(function(position) {
  2.   // 成功時の処理
  3.   var lat = position.coords.latitude,  // 緯度
  4.       lng = position.coords.longitude; // 経度
  5. }, function(code) {
  6.   // エラー時の処理
  7. });


どの測地系を使う?



Google MapsなどのWebサービスやJavaScriptのAPI、正確さなどを考慮すると、世界測地系を利用すればよいと分かります。特に、日本の緯度・経度を扱う場合、日本測地系2000を用いれば世界測地系の中で位置を正しく表示できます。というわけで、日本測地系2000(JGD2000)を使用しましょう。

Google Mapsは世界測地系(WGS84)を使用しています。Yahoo地図は日本測地系(TKY)、世界測地系(WGS84)のどちらにも対応しています。


変換方法: TKY => JGD2000



自分が持っているデータが日本測地系(TKY)しかない場合、国土地理院提供のソフトウェアを使って日本測地系2000へ変換できます(TKY2JGD)。Windows専用ですが、日本国の測地系を変換する場合、最も信頼できるものだと思います。さすがです、国土地理院。

ただし、このソフトウェアを使用する際には、緯度・経度の表示形式に気を付ける必要があります。そもそも、緯度・経度の表示形式には、DEG表記とDMS表記の2つがあります。

  • DMS表記: 緯度・経度を度分秒で表記
  • DEG表記: 緯度・経度を10進数の度のみで表記

どちらも同じものを、異なる単位系で表しています。例えば、以下の2つは同じ値です。

  • DMS表記: 35度41分28.5576秒
  • DEG表記: 35.691266

TKY2JGDではDMS表記を使用します。かつ、DMS表記を以下のように記述しなければなりません。

  • 一般: 35度41分28.5576秒
  • TKY2JGD: 354128.5576

TKY2JGDは、この形式で日本測地系(TKY)を日本測地系2000(JGD2000)に変換します。DEG表記から上記のDMS表記への変換と、その逆変換は下のように記述できます。

  1. <?php
  2. /**
  3.  * DEGをDMS(aaabbcc.dddd形式)に変換する
  4.  *
  5.  * @param float $deg 小数形式
  6.  * @return float aaabbbc.ddd形式
  7.  */
  8. function deg2dms($deg)
  9. {
  10.   $deg = floatval($deg);
  11.  
  12.   $degInt   = intval($deg);
  13.   $minFloat = ($deg - $degInt) * 60;
  14.   $minInt   = intval($minFloat);
  15.   $secFloat = ($minFloat - $minInt) * 60;
  16.  
  17.   $dms = $degInt * 10000 + $minInt * 100 + $secFloat;
  18.  
  19.   return round($dms, 7);
  20. }
  21.  
  22. /**
  23.  * aaabbcc.dddd形式のDMSをDEGに変換する
  24.  *
  25.  * @param float $dms aaabbbc.ddd形式
  26.  * @return float 小数形式
  27.  */
  28. function dms2deg($dms)
  29. {
  30.   $dms = floatval($dms);
  31.   $int = intval($dms);
  32.  
  33.   $deg = intval($dms / 10000);
  34.   $min = intval($dms / 100) - $deg * 100;
  35.   $sec = $dms - $deg * 10000 - $min * 100;
  36.  
  37.   $deg = $deg + $min / 60.0 + $sec / 3600.0;
  38.  
  39.   return round($deg, 7);
  40. }

また、ファイルから一括して変換することも可能です。既存のデータを変換する際に便利です。ただ、ファイルの改行コードはCRLFでなければなりません。LFだけだと、まさかのエラーになります(国土地理院・・・)。


おわりに



日本での測量の基準が変わってから10年以上が経ち、Webの世界でも世界測地系もしくは日本測地系2000を使用することが一般的となっています。とはいえ、店舗情報やホテル情報などでは、いまだに日本測地系のみが提供されることもあるようです。位置情報を使う際には、測地系を見直してみると、開発がサクサク進むかもしれません。