using ProjNet.CoordinateSystems;
using ProjNet.Converters.WellKnownText;
using ProjNet.CoordinateSystems.Transformations;
/// <summary>
/// 坐标位置结构体
/// </summary>
public struct stPosition
{
public double X;
public double Y;
public stPosition(double x, double y)
{
X = x;
Y = y;
}
}
/// <summary>
/// 将地理坐标转换为投影坐标
/// </summary>
/// <param name="fromCS">原坐标系</param>
/// <param name="toCS">目标坐标系</param>
/// <param name="pts">原始数据</param>
/// <param name="results">结果数据</param>
/// <returns>成功返回true</returns>
public static bool DegreeToMeter(ICoordinateSystem fromCS, ICoordinateSystem toCS, List<double[]> pts, out List<double[]> results)
{
bool bRes = false;
results = new List<double[]>();
try
{
CoordinateTransformationFactory ctfac = new CoordinateTransformationFactory();
ICoordinateTransformation trans = ctfac.CreateFromCoordinateSystems(toCS, fromCS);
results = trans.MathTransform.TransformList(pts);
bRes = true;
}
catch (SystemException sysEx)
{
}
return bRes;
}
/// <summary>
/// 将投影坐标系数据转换为地理坐标系数据
/// </summary>
/// <param name="fromCS">原坐标系</param>
/// <param name="toCS">目标坐标系</param>
/// <param name="pts">原始数据</param>
/// <param name="results">结果数据</param>
/// <returns>成功返回true</returns>
public static bool MeterToDegree(ICoordinateSystem fromCS, ICoordinateSystem toCS, List<double[]> pts, out List<double[]> results)
{
bool bRes = false;
results = new List<double[]>();
try
{
CoordinateTransformationFactory ctfac = new CoordinateTransformationFactory();
ICoordinateTransformation trans = ctfac.CreateFromCoordinateSystems(fromCS, toCS);
results = trans.MathTransform.TransformList(pts);
bRes = true;
}
catch (SystemException sysEx)
{
}
return bRes;
}
/// <summary>
/// 北京54投影坐标转换为地理坐标/// </summary>
/// <param name="iCodeNum">带号</param>
/// <param name="dCenter_Meridian">中央经线</param>
/// <param name="sourPt">原始投影坐标数据</param>
/// <param name="destPt">转换后地理坐标</param>
public static void BJ54PrjToGeo(int iCodeNum, double dCenter_Meridian, stPosition sourPt, out stPosition destPt)
{
destPt = new stPosition(0, 0);
try
{
//高斯克吕格投影类型|横轴莫卡托投影类型
string bj1954Lcc = string.Format("PROJCS[\"hejl\","
+ "GEOGCS[\"GCS_Beijing_1954\","
+ "DATUM[\"D_Beijing_1954\", SPHEROID[\"Krasovsky_1940\", 6378245.0, 298.3]],"
+ "PRIMEM[\"Greenwich\", 0.0],"
+ "UNIT[\"Degree\", 0.017453292519943299]],"
+ "PROJECTION[\"Transverse Mercator\"],"
+ "PARAMETER[\"False_Easting\", {0}500000.0],"
+ "PARAMETER[\"False_Northing\", 0.0],"
+ "PARAMETER[\"Central_Meridian\", {1} ],"
+ "PARAMETER[\"Scale_Factor\", 1],"
+ "PARAMETER[\"Latitude_Of_Origin\", 0],"
+ "UNIT[\"Meter\", 1]];", iCodeNum, dCenter_Meridian);
IProjectedCoordinateSystem fromCS = CoordinateSystemWktReader.Parse(bj1954Lcc) as IProjectedCoordinateSystem;
GeographicCoordinateSystem toCS = (GeographicCoordinateSystem)fromCS.GeographicCoordinateSystem;
List<double[]> pts = new List<double[]>();
double[] xy = new double[] { sourPt.X, sourPt.Y };
pts.Add(xy);
List<double[]> results = new List<double[]>();
//执行转换函数
MeterToDegree(fromCS, toCS, pts, out results);
destPt.X = results[0][0];
destPt.Y = results[0][1];
}
catch (SystemException sysEx)
{
}
}
/// <summary>
/// 北京54地理坐标转换为投影坐标,批量转换
/// </summary>
/// <param name="iCodeNum">带号</param>
/// <param name="dCenter_Meridian">中央经线</param>
/// <param name="sourPt">原始投影坐标数据</param>
/// <param name="destPt">转换后地理坐标</param>
public static void GeoToBJ54Prj(int iCodeNum, double dCenter_Meridian, stPosition sourPt, out stPosition destPt)
{
destPt = new stPosition(0, 0);
try
{
//高斯克吕格投影类型|横轴莫卡托投影类型
string bj1954Lcc = string.Format("PROJCS[\"hejl\","
+ "GEOGCS[\"GCS_Beijing_1954\","
+ "DATUM[\"D_Beijing_1954\", SPHEROID[\"Krasovsky_1940\", 6378245.0, 298.3]],"
+ "PRIMEM[\"Greenwich\", 0.0],"
+ "UNIT[\"Degree\", 0.017453292519943299]],"
+ "PROJECTION[\"Transverse Mercator\"],"
+ "PARAMETER[\"False_Easting\", {0}500000.0],"
+ "PARAMETER[\"False_Northing\", 0.0],"
+ "PARAMETER[\"Central_Meridian\", {1} ],"
+ "PARAMETER[\"Scale_Factor\", 1],"
+ "PARAMETER[\"Latitude_Of_Origin\", 0],"
+ "UNIT[\"Meter\", 1]];", iCodeNum, dCenter_Meridian);
IProjectedCoordinateSystem fromCS = CoordinateSystemWktReader.Parse(bj1954Lcc) as IProjectedCoordinateSystem;
GeographicCoordinateSystem toCS = (GeographicCoordinateSystem)fromCS.GeographicCoordinateSystem;
List<double[]> pts = new List<double[]>();
double[] xy = new double[] { sourPt.X, sourPt.Y };
pts.Add(xy);
List<double[]> results = new List<double[]>();
//执行转换函数
DegreeToMeter(fromCS, toCS, pts, out results);
destPt.X = results[0][0];
destPt.Y = results[0][1];
}
catch (SystemException sysEx)
{
}
}