酢ろぐ!

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

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

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

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

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

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

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

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

**C#

|cs| ///

/// GPSの測位情報 /// public class Positions { /// /// 緯度 /// public double Latitude;

  /// <summary>
  /// 経度
  /// </summary>
  public double Longitude;

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

}

///

/// 日本測地系の位置情報から世界測地系(WGS84)の位置情報に変換を行なう /// /// 緯度(日本測地系) /// 経度(日本測地系) /// 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

|vb| '''

''' GPSの測位情報 ''' Public Class Positions ''' ''' 緯度 ''' 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

'''

''' 日本測地系の位置情報から世界測地系(WGS84)の位置情報に変換を行なう ''' ''' 緯度(日本測地系) ''' 経度(日本測地系) ''' 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)を使ってアプリ開発する際に逆引きとしてお使いください。