読者です 読者をやめる 読者になる 読者になる

酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

C#で位置情報を日本測地系から世界測地系(WGS84)に変換する

緯度経度の2点間の直線距離を求める方法については、「C#で緯度経度の2点間の直線距離を求める - 酢ろぐ!」をごらんください。

GPSの位置情報には日本独自の「日本測地系」と「世界測地系(WGS84)」があります。

私の使っているデバイスは大抵海外メーカー製ですので、GPSで取得した位置情報も同様に「世界測地系」が採用されています。

日本のWebサービスでは何故か日本測地系を採用しているので、日本測地系の位置情報をそのままGoogle Map API等で使うと南東に約400m程ずれてしまいます。日本測地系と世界測地系の差の特徴です。

Google Mapは、世界測地系(WGS84)を採用しているので当然といえば当然なのですが。

C#で書いたサンプルコードが無かったので、このサイトの「三角関数を使わない変換式(簡単)」をベースにC#で使えるように修正させて頂きました。

C#

  /// <summary>
  /// GPSの測位情報
  /// </summary>
  public class Positions
  {
      /// <summary>
      /// 緯度
      /// </summary>
      public double Latitude;
      
      /// <summary>
      /// 経度
      /// </summary>
      public double Longitude;

      public Positions(double latitude, double Longitude)
      {
          this.Latitude = latitude;
          this.Longitude = longitude;
      }
  }

  /// <summary>
  /// 日本測地系の位置情報から世界測地系(WGS84)の位置情報に変換を行なう
  /// </summary>
  /// <param name="latTokyo">緯度(日本測地系)</param>
  /// <param name="lngTokyo">経度(日本測地系)</param>
  /// <returns></returns>
  public static Positions TokyoToWGS84(double latTokyo, double lngTokyo)
  {
      double latWGS84 = latTokyo - 0.00010695d * latTokyo + 0.000017464d * lngTokyo + 0.0046017d;
      double lngWGS84 = lngTokyo - 0.000046038d * latTokyo - 0.000083043d * lngTokyo + 0.010040d;

      return new Positions(latWGS84, lngWGS84);
  }

VB.NET

''' <summary>
''' GPSの測位情報
''' </summary>
Public Class Positions
	''' <summary>
	''' 緯度
	''' </summary>
	Public Latitude As Double

	''' <summary>
	''' 経度
	''' </summary>
	Public Longitude As Double

	Public Sub New(latitude As Double, Longitude__1 As Double)
		Me.Latitude = latitude
		Me.Longitude = longitude
	End Sub
End Class

''' <summary>
''' 日本測地系の位置情報から世界測地系(WGS84)の位置情報に変換を行なう
''' </summary>
''' <param name="latTokyo">緯度(日本測地系)</param>
''' <param name="lngTokyo">経度(日本測地系)</param>
''' <returns></returns>
Public Shared Function TokyoToWGS84(latTokyo As Double, lngTokyo As Double) As Positions
	Dim latWGS84 As Double = latTokyo - 0.00010695 * latTokyo + 1.7464E-05 * lngTokyo + 0.0046017
	Dim lngWGS84 As Double = lngTokyo - 4.6038E-05 * latTokyo - 8.3043E-05 * lngTokyo + 0.01004

	Return New Positions(latWGS84, lngWGS84)
End Function

関連記事

Windows Mobile(.NET Compact Framework)を使ってアプリ開発する際に逆引きとしてお使いください。