坐标转换流程与公式 七参数 四参数

7参数转换整体流程(不同椭球之间):

平面直角坐标系-->大地坐标系-->空间直角坐标系 转换(To) 空间直角坐标系-->大地坐标系-->平面直角坐标系


举个栗子,比如从BJ1954平面直角坐标系 转到XA1980平面直角坐标系那么需要5步:

BJ1954平面直角坐标系 至 BJ1954大地坐标系

BJ1954大地坐标系 至BJ1954空间直角坐标系

BJ1954空间直角坐标系 至XA1980空间直角坐标系

XA1980空间直角坐标系 至XA1980大地坐标系

XA1980大地坐标系 至XA1980平面直角坐标系

如果从BJ1954空间直角坐标系转到XA1980平面直角坐标系只需一步:

①BJ1954空间直角坐标系 至 XA1980空间直角坐标系


1)空间直角坐标系(XYZ) 转换(To) 空间直角坐标系(XYZ):(布尔沙模型,此步重要,将一个椭球基准转换到另一个椭球基准)


其中△X,△Y,△Z是坐标平移量,R(ω)是旋转矩阵,(1+m)是比例因子

2)大地坐标系(BLH) 转换(To) 空间直角坐标系(XYZ):(相同基准)


3)空间直角坐标系(XYZ) 转换(To) 大地坐标系(BLH):(相同基准)


e2为椭球第一偏心率(a2-b2)/a2=ParaE1,e'2为椭球第二偏心率(a2-b2)/b2=ParaE2
N=double v = a / (Math.Pow(1 - Math.Pow(ParaE1, 1) * Math.Pow(Math.Sin(B), 2), 0.5));
通用的XYZ To BLH三个等价公式:(计算结果几乎无差)



4)大地坐标系(BLH) 转换(To) 平面直角坐标系(投影坐标系,xyh):(高斯投影)
计算公式见孔祥元等主编武汉大学出版社2002年出版的《控制测量学》的第72页书的的括号有问题, ( 和 [ 应该交换
5)求解七参数:(最小二乘法)
参见:
http://blog.sina.com.cn/s/blog_4c8bb86b0100bxq6.html
http://www.360doc.com/content/12/1130/11/8463843_251136066.shtml
大致流程为:
a)


b)如上5-7公式符合最小二乘法A*X=B的形式,依照最小二乘法求解:

四参数转换整体流程:(同一椭球下不同坐标系)
大地坐标系-->平面直角坐标系-->平面直角坐标系-->大地坐标系(注意与七参数的区别)

整体流程:


注:源码下载请在本博客资源下载中查找

public void Polygon_Trans4(IFeatureClass pFeatureCls, string strPath, string strFilename, ProgressBar pBar) { if (pFeatureCls == null || strPath == "" || strFilename == "") return; createNewShape(strPath, strFilename, pFeatureCls); IFeatureCursor pFeatCursor = pFeatureCls.Search(null, false); IFeature pFeature = pFeatCursor.NextFeature(); //打开目标图层 IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass(); IWorkspace pWS = pWSF.OpenFromFile(strPath, 0); IFeatureWorkspace pFWS = (IFeatureWorkspace)pWS; IFeatureClass pTargetFClass = pFWS.OpenFeatureClass(strFilename); IWorkspaceEdit pWSEdit = pWS as IWorkspaceEdit; pWSEdit.StartEditOperation(); pWSEdit.StartEditing(false); ITable pTble = (ITable)pFeatureCls; int lCunt = pTble.RowCount(null); pBar.Visible = true; pBar.Minimum = 0; pBar.Maximum = lCunt; pBar.Step = 1; IFeature pNewFeature; IPolygon pOutPolygon; IGeometryCollection pOutGeos; IPolygon pInPolygon; IGeometryCollection pInGeos; IPoint pOutPnt = new PointClass(); IPointCollection pOutPnts; while (pFeature != null) { pBar.PerformStep(); pNewFeature = pTargetFClass.CreateFeature(); pOutPolygon = new PolygonClass(); pOutGeos = pOutPolygon as IGeometryCollection; //获取原图形 pInPolygon = pFeature.Shape as IPolygon; pInGeos = pInPolygon as IGeometryCollection; for (int m = 0; m < pInGeos.GeometryCount; m++) { IGeometry pInGeo = pInGeos.get_Geometry(m); IPointCollection pInPnts = pInGeo as IPointCollection; pOutPnts = new PolygonClass(); object missing = Type.Missing; for (int n = 0; n < pInPnts.PointCount; n++) { IPoint pInPnt = pInPnts.get_Point(n); //转换点坐标 pOutPnt.X = ClsParas4.m_OffY + pInPnt.Y * ClsParas4.m_vb + pInPnt.X * ClsParas4.m_va; pOutPnt.Y = ClsParas4.m_OffX + pInPnt.Y * ClsParas4.m_va - pInPnt.X * ClsParas4.m_vb; pOutPnts.AddPoint(pOutPnt, ref missing, ref missing); } ISegmentCollection pSegmentCols = new RingClass(); pSegmentCols.AddSegmentCollection(pOutPnts as ISegmentCollection); pOutGeos.AddGeometry(pSegmentCols as IGeometry, ref missing, ref missing); } for (int i = 0; i < pFeature.Fields.FieldCount; i++) { if (pNewFeature.Fields.get_Field(i).Name.ToString().Equals("FID", StringComparison.CurrentCultureIgnoreCase) || pNewFeature.Fields.get_Field(i).Name.ToString().Equals("SHAPE", StringComparison.CurrentCultureIgnoreCase)) continue; pNewFeature.set_Value(i, pFeature.get_Value(i)); } pNewFeature.Shape = pOutPolygon as IGeometry; pNewFeature.Store(); pFeature = pFeatCursor.NextFeature(); } pBar.Visible = false; pWSEdit.StopEditOperation(); pWSEdit.StopEditing(true); }
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值