首先理解一下基准面
基准面是在特定区域内与地球表面极为吻合的椭球体。椭球体表面上的点与地球表面上的特定位置相匹配,也就是对椭球体进行定位,该点也被称作基准面的原点,原点是固定的,所有其他点由其计算获得。基准面的坐标系原点往往距地心有一定偏移(有的也在地心,如WGS1984),如西安80的基准面和北京54的基准面,因为原点不同,所以不同的基准面上,同一个点的坐标是不相同的。
利用ArcEngine创建一个坐标系或者基准面的是SpatialReferenceClass类,
该类实现了ISpatialReferenceFactory接口,该接口定义了创建坐标系,基准面等方法和属性;在利用 ISpatialReferenceFactory创建坐标系的时候往往需要一个int类型的参数,这个int其实就是这些坐标系的代号,如我们熟悉的4326就是WGS1984.
同一基准面的坐标转换
对于同一基准面,我们可以肯定一点就是同一位置经纬度坐标是一样的,而不同的就是计算成平面坐标的时候可能有所不同,因为算法不一样,在这里我只是将经纬度坐标转成平面的坐标。
private IPoint GetProjectPoint(IPoint pPoint, boolpBool)
{
ISpatialReferenceFactory pSpatialReferenceEnvironment = new SpatialReferenceEnvironment();
ISpatialReference pFormSpatialReference = pSpatialReferenceEnvironment.Creat eGeographicCoordinateSystem((int)esriGeoCS3Type.esriSRGeo_Xian1980)'//西安80
ISpatialReference pToSpatialReference =
pSpatialReferenceEnvironemnt.CreateProjectedCoordinateSystem((int)esriSRProjCS4Type.esriSRProjCS_Xian1980_3_Degree_GK_Zone_34);//西安80
if (pBool == true)//球面转平面
{
IGeometry pGeo = (IGeometry)pPoint;
pGeo.SpatialReference = pFromSpatialReference;
pGeo.Project(pToSpatialReference);
return pPoint;
}
else //平面转球面
{
IGeometry pGeo = (IGeometry)pPoint;
pGeo.SpatialReference = pToSpatialReference;
pGeo.Project(pFromSpatialReference);
return pPoint;
}
}