• 空间参考及坐标转换


     转自:https://www.cnblogs.com/lonelyxmas/p/5784699.html

    同一基准面的坐标转换 

    对于同一基准面,我们可以肯定一点就是同一位置经纬度坐标是一样的,而不同的就是计算成平面坐标的时候可能有所不同,因为算法不一样,在这里我只是将经纬度坐标转成平面的坐标。

    复制代码
     private IPoint GetpProjectPoint(IPoint pPoint, bool pBool)         
     {             
         ISpatialReferenceFactory pSpatialReferenceEnvironemnt = new SpatialReferenceEnvironment();             
         ISpatialReference pFromSpatialReference = pSpatialReferenceEnvironemnt.CreateGeographicCoordinateSystem((int)esriSRGeoCS3Type .esriSRGeoCS_Xian1980);//西安80 
         ISpatialReference pToSpatialReference = pSpatialReferenceEnvironemnt.CreateProjectedCoordinateSystem((int)esriSRProjCS4Type .esriSRProjCS_Xian1980_3_Degree_GK_Zone_34);//西安80             
         if (pBool == true)//球面转平面            
            {                   
                Geometry pGeo = (IGeometry)pPoint;                 
                pGeo.SpatialReference = pFromSpatialReference;               
                pGeo.Project(pToSpatialReference);                 
                return pPoint;             
            }             
            else //平面转球面             
            {  
            IGeometry pGeo = (IGeometry)pPoint;                 
            pGeo.SpatialReference = pToSpatialReference;                
            pGeo.Project(pFromSpatialReference);                 
            return pPoint;             
            }         
    } 
    复制代码

    不同基准面的坐标转换 

    通过前面的介绍,我们知道地球上同一位置的坐标在不同的基准面上是不一样的,而基准面是构成坐标系的一个部分,因为基准面在定位的时候牵扯到了相对地心的平移或旋转等,所以对于这样的转换我们无法直接进行,需要一个转换参数,而这些参数也是基于不同的模型的,常用的有三参数和 7 参数,三参数是比较简单的也是比较容易理解的,三参数是在两个基准面之间进行了 X,Y,Z 轴的平移,通过下面的图我们很清楚的看到三参数之间两个基准面的关系:

    而 7 参数的模型比较复杂,这种复杂的同时让精度大为提高,7参数不仅仅考虑了两个基准面之间的平移,还考虑了旋转外加一个比例因子(椭球体的大小可能不一样).

    对于不同基准面之间的转换,ArcGIS Engine 提供了一个用来控制转换参数的接口 IGeoTransformation,该接口被以下类实现;

    着每一个接口对应了一种转换方法,比如 GeocentricTranslationClass类就实现了三参数,而CoordinateFrameTransformationClass 类实现了7 参数,要实现 3 参数或者 7 参数需要 IGeometry2 或更新接口的ProjectEx 方法,下面我们用代码实现一个不同基准面之间的坐标转换。 

    public void ProjectExExample()        
     {                          
                ISpatialReferenceFactory pSpatialReferenceFactory = new SpatialReferenceEnvironmentClass();  // ISpatialReference pFromCustom = pSpatialReferenceFactory.CreateESRISpatialReferenceFromPRJFile(@"E:arcgisEnginez 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;  
    }
  • 相关阅读:
    设计模式概述
    Android之.9.png图片的制作与使用
    2015-4-3~2015-5-28 第四届全国大学生软件设计大赛《解密陌生人》项目总结
    排序算法之快速排序
    AsyncTask那些事(更新中...)
    经典Android面试题
    import第三方库的头文件找不到的错误
    点击某个按钮在tableView某个位置动态插入一行cell
    NSUserDefaults:熟悉与陌生(转)
    更改UIsearchbar 的背景和cancel按钮(转)
  • 原文地址:https://www.cnblogs.com/leebokeyuan/p/11613124.html
Copyright © 2020-2023  润新知