using System;
using System.Collections.Generic;
using System.Text;
using ESRI.ArcGIS.Geometry;
namespace My.GIS
{
/// <summary>
/// 坐标转换方法
/// </summary>
public class PointConvert
{
private static ISpatialReferenceFactory pSRF = null;
private static ISpatialReference pGCS = null;
private static ISpatialReference pPCS = null;
private static readonly object obj = new object();
private static readonly object syncPrj = new object();
private static readonly object syncGeo = new object();
private static PointConvert instance = null;
/// <summary>
/// 当前对象的实例
/// </summary>
public static PointConvert Instance
{
get
{
if (instance == null)
{
lock (obj)
{
if (instance == null)
{
instance = new PointConvert();
InitInfo();
}
}
}
return instance;
}
}
/// <summary>
/// 初始化常用的信息
/// </summary>
private static void InitInfo()
{
pSRF = new SpatialReferenceEnvironment();
pGCS = pSRF.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984); // 指定坐标系
pPCS = pSRF.CreateProjectedCoordinateSystem((int)esriSRProjCSType.esriSRProjCS_WGS1984UTM_50N);
//
//(int)esriSRProjCSType.esriSRProjCS_Beijing1954GK_23N
}
/// <summary>
/// 将经纬度点转换为某投影下的坐标点
/// </summary>
/// <param name="pPoint">经纬度点</param>
/// <returns>某投影下的坐标点</returns>
/// <remarks>其中pPoint的X是经度,Y是纬度,单位都是度,千万不要搞错,否则转换出来的值是不对的或转换不出值</remarks>
public IPoint GetProjectPoint(IPoint pPoint)
{
lock (syncPrj)
{
pPoint.SpatialReference = pGCS;
pPoint.Project(pPCS);
}
return pPoint;
}
///<summary>
/// 将点转换为经纬度点
/// </summary>
/// <param name="pPoint">平面坐标点</param>
///<returns>经纬度点</returns>
///<remarks></remarks>
public IPoint GetGeoPoint(IPoint pPoint)
{
//IPoint pProPoint = new PointClass();
//pProPoint.PutCoords(pPoint.X, pPoint.Y);
lock (syncGeo)
{
pPoint.SpatialReference = pPCS;
pPoint.Project(pGCS);
}
return pPoint;
}
}
}
使用:
#region xy 转 经纬度
IPoint pt = GeometryUtilities.ConstructPoint3D(minX, minY, 0);
IPoint pt1 = GeometryUtilities.ConstructPoint3D(maxX, maxY, 0);
PointConvert.Instance.GetGeoPoint(pt);
PointConvert.Instance.GetGeoPoint(pt1);
#endregion
#region 经纬度 转 xy
IPoint pt = GeometryUtilities.ConstructPoint3D(minLon, minLat, 0);
IPoint pt1 = GeometryUtilities.ConstructPoint3D(maxLon, maxLat, 0);
PointConvert.Instance.GetProjectPoint(pt);
PointConvert.Instance.GetProjectPoint(pt1);
#endregion