はじめに
C#でshapeファイルで読み込んだ平面直角座標系の図形からProjNetを利用して緯度経度を表示させる際のメモ
ProjNetのNuGet パッケージをインストール
|
1 2 3 |
Install-Package NetTopologySuite Install-Package NetTopologySuite.Features Install-Package ProjNet |
平面直角座標系のWKT
QGISで出力した.prjファイルより、WKT 文字列を取得。
Proj4 文字列: +proj=tmerc +lat_0=36 +lon_0=135 +k=0.9999 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs → 軽量で短い書き方、GDAL や Proj でよく使う
WKT 文字列:上記の長い PROJCS[…] の形 → OGC(国際標準)で規格化されている、ProjNET や多くの GIS ソフト(ArcGIS, QGIS)で使える
ProjNET の CoordinateSystemWktReader.Parse() は Proj4 文字列を渡すとエラーになるので、 WKT の形式を受け付けるので、要注意
平面直角座標系の図形から緯度経度を取得
|
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 |
public static double[] ConvertToLatLon(IFeature feature, int sourceEpsg) { // 1. Geometry から座標を取得(例:ポイント) var geom = feature.Geometry; var coord = geom.Coordinate; // 先頭座標を取得(Point の場合) // 2. 座標系を定義(WKT 文字列) var wkts = new Dictionary<int, string>() { { 2446, @"PROJCS[""JGD_2000_Japan_Zone_4"",GEOGCS[""GCS_JGD_2000"",DATUM[""D_JGD_2000"",SPHEROID[""GRS_1980"",6378137.0,298.257222101]],PRIMEM[""Greenwich"",0.0],UNIT[""Degree"",0.0174532925199433]],PROJECTION[""Transverse_Mercator""],PARAMETER[""False_Easting"",0.0],PARAMETER[""False_Northing"",0.0],PARAMETER[""Central_Meridian"",133.5],PARAMETER[""Scale_Factor"",0.9999],PARAMETER[""Latitude_Of_Origin"",33.0],UNIT[""Meter"",1.0]]"}, }; // 2. 座標系を作成 var csFactory = new ProjNet.CoordinateSystems.CoordinateSystemFactory(); var srcCs = ProjNet.IO.CoordinateSystems.CoordinateSystemWktReader.Parse(wkts[sourceEpsg]) as CoordinateSystem; var dstCs = GeographicCoordinateSystem.WGS84; // 3. 座標変換を作成 var ctFactory = new CoordinateTransformationFactory(); var transform = ctFactory.CreateFromCoordinateSystems(srcCs, dstCs); // 4. 座標変換 var lonlat = transform.MathTransform.Transform( new double[] { coord.X, coord.Y } ); return lonlat; } |