「Dotspatial」を利用して、C#で緯度経度⇔平面直角座標系変換を行いました。
1.座標の確認
以下、国土地理院の座標系変換サイトで変換前、変換後の座標を確認しておきます。
2.平面直角座標系⇒緯度経度への変換
DotSpatial.Projections.dllを参照し、ReprojectクラスのReprojectPoints()メソッドで変換を行います。変換前は平面直角座標系、変換後は緯度経度の座標系を設定しておきます。緯度経度の座標系は、EPSG:4612、EPSG:4326共に同じ結果でした。
※注意点は、ReprojectPoints()メソッドの引数を渡す際に、xとyを入れ替えています。入れ替えないと、正常な値が返ってきません。
以下、参考ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using DotSpatial.Projections; public ProjectionInfo proj4612 = ProjectionInfo.FromEpsgCode(4612); public ProjectionInfo proj4326 = ProjectionInfo.FromEpsgCode(4326); public ProjectionInfo proj2446 = ProjectionInfo.FromEpsgCode(2446); public void ReprojectPoints() { var x = double.Parse("139036"); var y = double.Parse("29231"); Console.WriteLine(string.Format("x={0}, y={1}",x,y)); var lonlat = ConvertXYToLonLat(x, y); Console.WriteLine(string.Format("lon={0}, lat={1}", lonlat[0], lonlat[1])); } // 平面直角座標系→緯度経度 public double[] ConvertXYToLonLat(double x, double y) { var xy = new[] { y, x }; Reproject.ReprojectPoints(xy, null, proj2446, proj4326, 0, 1); var ret = xy; return ret; } |
以下、処理結果
1 2 |
x=139036, y=29231 lon=133.817380897379, lat=34.2532433134407 |
3.緯度経度⇒平面直角座標系への変換
緯度経度の場合も同じメソッドを使用します。変換前と変換後の座標系を入れ替えて実行します。
※注意点は、平面直角座標系⇒緯度経度の時とは逆で、処理結果のxとyを入れ替えています。
以下、参考ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public void ReprojectPoints() { var lat = double.Parse("133.817380897379"); var lon = double.Parse("34.2532433134407"); Console.WriteLine(string.Format("deg lon={0}, lat={1}", lon, lat)); var xy = ConvertLonLatToXY(lon, lat); Console.WriteLine(string.Format("x={0}, y={1}", xy[0], xy[1])); } // 緯度経度→平面直角座標系 public double[] ConvertLonLatToXY(double lon, double lat) { var lonlat = new[] { lon, lat }; Reproject.ReprojectPoints(lonlat, null, proj4326, proj2446, 0, 1); var ret = new[] { lonlat[1], lonlat[0] }; return ret; } |
以下、処理結果
1 2 |
lon=133.817380897379, lat=34.2532433134407 x=139036.000000001, y=29230.9999999973 |
4.度分秒→十進法度単位の変換
緯度経度が度分秒の場合は、変換できないので、十進法度単位に変換してから、座標系変換を行います。
以下、参考ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
public void ReprojectPoints() { var lat = double.Parse("341511.67593"); var lon = double.Parse("1334902.57123"); Console.WriteLine(string.Format("dms lon={0}, lat={1}", lon, lat)); lat = this.ConvertDmsToDegree(lat); lon = this.ConvertDmsToDegree(lon); Console.WriteLine(string.Format("deg lon={0}, lat={1}", lon, lat)); } // 度分秒→十進法度単位 public double ConvertDmsToDegree(double dms) { double deg,ddd,mm,ss; var str = dms.ToString(); if (str.StartsWith("1")) { ddd = double.Parse(str.Substring(0, 3)); mm = double.Parse(str.Substring(3, 2)); ss = double.Parse(str.Substring(5)); } else { ddd = double.Parse(str.Substring(0, 2)); mm = double.Parse(str.Substring(2, 2)); ss = double.Parse(str.Substring(4)); } deg = ddd + (mm / 60) + (ss / 60 / 60); return deg; } |
以下、処理結果
1 2 |
dms lon=1334902.57123, lat=341511.67593 deg lon=133.817380897222, lat=34.2532433138889 |