地理坐標轉換的C#實現 - Xian1980, BeiJing 1954, WGS84
在編寫地圖相關的軟件時,經常碰到的問題就是坐標轉換,
我們可以用ArcGIS的功能實現,也有學測繪的人專門寫了程序來轉換
如果你要在自己的系統中實現這個功能,
比如說,得到一個arcgis shp 文件,它的坐標系是西安1980, 北京1954,你需要把坐標轉為WGS84,并在Google Map上顯示出來,
開源軟件 http://projnet.codeplex.com/ 和 http://dotspatial.codeplex.com/ 可能是你的選擇,
在他們的網站上你可以找到他們為何要寫這些功能的原因和出處。
初學者們可能需要去搜索一下 “西安1980, 北京1954”
下面是具體步驟:
首先你需要從網站下載編譯好的DLL,
在Proj.NET里面你需要
using ProjNet.CoordinateSystems;
using ProjNet.Converters.WellKnownText;
using ProjNet.CoordinateSystems.Transformations;
CoordinateTransformationFactory ctfac = new CoordinateTransformationFactory();
string wktUtm30 = "PROJCS[\"UTM-30\",GEOGCS[\"Unused\",DATUM[\"UTM Projections\",SPHEROID[\"WGS 1984\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"False_Easting\",500000],PARAMETER[\"False_Northing\",0],PARAMETER[\"Central_Meridian\",-3],PARAMETER[\"Scale_Factor\",0.9996],PARAMETER[\"Latitude_Of_Origin\",0],UNIT[\"Meter\",1]]";
ICoordinateSystem cs1 = CoordinateSystemWktReader.Parse(wktUtm30) as ICoordinateSystem;
ICoordinateSystem cs2 = GeographicCoordinateSystem.WGS84;
ICoordinateTransformation trans = ctfac.CreateFromCoordinateSystems(cs1, cs2);
double[] fromPoint = new double[] { 37270, 76370 };
double[] toPoint = trans.MathTransform.Transform(fromPoint);
然而在中國普遍使用的 西安1980, 北京1954,這個Proj.NET不支持高斯-克魯格投影,只好嘗試另外一個。
using DotSpatial.Projections;
//Proj4js.defs["EPSG:2414"] = "+proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +ellps=krass +units=m +no_defs";
//Sets up a array to contain the x and y coordinates
double[] xy = new double[2];
xy[0] = 39079460;
xy[1] = 3335377;
//An array for the z coordinate
double[] z = new double[1];
z[0] = 1;
ProjectionInfo pStart = KnownCoordinateSystems.Projected.GausKrugerBeijing1954.Beijing19543DegreeGKZone38;
string s = pStart.ToEsriString();
string t = pStart.ToProj4String();
string wktbj1954 = "PROJCS[\"Beijing_1954_3_Degree_GK_Zone_38\",GEOGCS[\"GCS_Beijing_1954\",DATUM[\"D_Beijing_1954\",SPHEROID[\"Krasovsky_1940\",6378245.0,298.3]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Gauss_Kruger\"],PARAMETER[\"False_Easting\",38500000.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",114.0],PARAMETER[\"Scale_Factor\",1.0],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]]";
ProjectionInfo pStart2 = ProjectionInfo.FromEsriString(wktbj1954);
//.FromProj4String("+proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +ellps=krass +units=m +no_defs");
ProjectionInfo pEnd = KnownCoordinateSystems.Geographic.World.WGS1984;
//Calls the reproject function that will transform the input location to the output locaiton
Reproject.ReprojectPoints(xy, z, pStart2, pEnd, 0, 1);
xy[0] = 120;
xy[1] = 30;
Reproject.ReprojectPoints(xy, z, pEnd, pStart, 0, 1);
經過測試,滿足我的需求。
這樣的話,只要用DotSpatial這個就可以了,暫時放棄使用Proj.NET. 希望給同行有參考意義。
快手軟件: http://www.kuaishou.net/
posted on 2012-09-27 18:04 時空地圖-TimeGIS-com 閱讀(4136) 評論(0) 收藏 舉報
浙公網安備 33010602011771號