您的位置:首页 > 其它

ArcGIS Engine开发之旅10--空间参考及坐标转换

2016-09-25 10:39 211 查看
原文ArcGIS Engine开发之旅10--空间参考及坐标转换

空间参考(Spatial Reference)是 GIS 数据的骨骼框架,能够将我们的数据定位到相应的位置,为地图中的每一点提供准确的坐标。 在同一个地图上显示的地图数据的空间参考必须是一致的,如果两个图层的空间参考不一致,往往会导致两幅地图无法正确拼合,因此开发一个 GIS 系统时,为数据选择正确的空间参考非常重要。

1 相关知识

1.1大地水准面

大地水准面是由静止海水面并向大陆延伸所形成的不规则的封闭曲面。

1.2地球椭球体

由定义可以知大地水准面的形状也是不规则的,仍不能用简单的数学公式表示,为了测量成果的 计算和制图的需要,人们选用一个同大地水准面相近的可以用数学方法来表达的椭球体来代替, 简称地球椭球体,它是一个规则的曲面,是测量和制图的基础,因地球椭球体是人们选定的跟大 地水准面很接近的规则的曲面,所以地球椭球体就可以有多个,地球椭球体是用长半轴、短半轴 和扁率来表示的。

public void ProjectExExample()
{
ISpatialReferenceFactory pSpatialReferenceFactory = new SpatialReferenceEnvironmentClass();  // ISpatialReference pFromCustom = pSpatialReferenceFactory.CreateESRISpatialReferenceFromPRJFile(@"E:\arcgis\Engine\z idingyi.prj");
IPoint pFromPoint = new PointClass();
pFromPoint.X = 518950.788;
pFromPoint.Y = 4335923.97;
IZAware pZAware = pFromPoint as IZAware;
pZAware.ZAware = true;
pFromPoint.Z = 958.4791;
// ((IGeometry)pFromPoint).SpatialReference = pFromCustom;
//自定义投影WGS84下的北京6度19带。             ((IGeometry)pFromPoint).SpatialReference = CreateCustomProjectedCoordinateSystem();             //目标投影             IProjectedCoordinateSystem projectedCoordinateSystem = pSpatialReferenceFactory.CreateProjectedCoordinateSystem((int)esriSRProjCS4Type.esr iSRProjCS_Xian1980_GK_Zone_19);             //因为目标基准面和原始基准面不在同一个上,所以牵扯到参数转换,我用7参数 转换             ICoordinateFrameTransformation   pCoordinateFrameTransformation = new CoordinateFrameTransformationClass();
pCoordinateFrameTransformation.PutParameters(-112.117, 4.530, 21.89, -0.00058702, -0.00476421, 0.00009358, 0.99998006411);
pCoordinateFrameTransformation.PutSpatialReferences(CreateCustomProjectedCoordinate System(), projectedCoordinateSystem as ISpatialReference);
//投影转换             IGeometry2 pGeometry = pFromPoint as IGeometry2;
pGeometry.ProjectEx(projectedCoordinateSystem as ISpatialReference, esriTransformDirection.esriTransformForward, pCoordinateFrameTransformation, false, 0, 0);
}
private IProjectedCoordinateSystem CreateCustomProjectedCoordinateSystem()
{
ISpatialReferenceFactory2 pSpatialReferenceFactory = new SpatialReferenceEnvironmentClass();
IProjectionGEN pProjection = pSpatialReferenceFactory.CreateProjection((int) esriSRProjectionType.esriSRProjection_GaussKruger) as IProjectionGEN;IGeographicCoordinateSystem pGeographicCoordinateSystem = pSpatialReferenceFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
ILinearUnit pUnit = pSpatialReferenceFactory.CreateUnit((int)esriSRUnitType.esriSRUnit_Meter) as ILinearUnit;
IParameter[] pParameters = pProjection.GetDefaultParameters();
IProjectedCoordinateSystemEdit pProjectedCoordinateSystemEdit = new ProjectedCoordinateSystemClass();
object pName = "WGS-BeiJing1954";
object pAlias = "WGS-BeiJing1954";
object pAbbreviation = "WGS-BeiJing1954";
object pRemarks = "WGS-BeiJing1954";
object pUsage = "Calculate Meter From lat and lon";
object pGeographicCoordinateSystemObject = pGeographicCoordinateSystem as object;
object pUnitObject = pUnit as object;
object pProjectionObject = pProjection as object;
object pParametersObject = pParameters as object;
pProjectedCoordinateSystemEdit.Define(ref pName, ref pAlias, ref pAbbreviation, ref  pRemarks, ref pUsage, ref pGeographicCoordinateSystemObject, ref pUnitObject,ref pProjectionObject, ref pParametersObject);
IProjectedCoordinateSystem5 pProjectedCoordinateSystem = pProjectedCoordinateSystemEdit as IProjectedCoordinateSystem5;
pProjectedCoordinateSystem.FalseEasting = 500000;
pProjectedCoordinateSystem.LatitudeOfOrigin = 0;
pProjectedCoordinateSystem.set_CentralMeridian(true,111);
pProjectedCoordinateSystem.ScaleFactor=1;
pProjectedCoordinateSystem.FalseNorthing=0;
return pProjectedCoordinateSystem;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: