视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
ArcGIS空间参考
2025-09-29 00:16:51 责编:小OO
文档
1.1 空间参考

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

在 ArcGIS 中,每个数据集都具有一个坐标系,该坐标系用于将数据集与通用坐标框架(如地图)内的其他地理数据图层集成。通过坐标系可在地图中集成数据集,以及执行各种集成的分析操作,例如叠加不同的源和坐标系中的数据图层。

1.1.1 相关知识

1.1.1.1大地水准面

大地水准面是由静止海水面并向延伸所形成的不规则的封闭曲面。它是重力等位面,即物体沿该面运动时,重力不做功(如水在这个面上是不会流动的)。因为地球的质量并非在各个点均匀分布,因此重力的方向也会相应发生变化,所以大地水准面的形状是不规则的,如下图:

  

与平均海水面相吻合的称为大地水准面

1.1.1.2地球椭球体

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

椭球名称长半轴 (米)

短半轴 (m)

扁率的倒数,

克拉克(Clarke) 1866

6 378 206.46 356 583.8294.978 698 2
白塞尔(Bessel)1841

6 377 397.1556 356 078.965299.152 843 4
International 19246 378 3886 356 911.9296.999 362 1
克拉索夫斯基 1940

6 378 2456 356 863298.299 738 1
GRS 19806 378 1376 356 752.3141298.257 222 101
WGS 19846 378 1376 356 752.3142298.257 223 563
1.1.1.3基准面

基准面是在特定区域内与地球表面极为吻合的椭球体。椭球体表面上的点与地球表面上的特定位置相匹配,也就是对椭球体进行定位,该点也被称作基准面的原点。原点的坐标是固定的,所有其他点由其计算获得。

基准面的坐标系原点往往距地心有一定偏移(有的也在地心,如WGS1984),如西安80的基准面和北京54的基准面.因为椭球体通过定位以便能更好的拟合不同的地区,所以同一个椭球体可以拟合好几个基准面.因为原点不同,所以不同的基准面上,同一个点的坐标是不相同的,这点我们应该清楚.下面以华盛顿州贝灵厄姆市为例来说明。使用 NAD27、NAD83 和 WGS84 以十进制为单位比较贝灵厄姆的坐标。显而易见,NAD83 和 WGS84 表示的坐标几乎相同,但 NAD27 表示的坐标则大不相同,这是因为所使用的基准面和旋转椭球体对地球基本形状的表示方式不同。

基准面经度纬度
NAD 1927-122.4669036865248.7440490722656
NAD 1983-122.4681835379348.74387985439
WGS 1984-122.4681835379348.7438798534299
3 个不同基准面时华盛顿州贝灵厄姆市的地理坐标

下图来自ArcGIS 说明了基准面是基于椭球体的:

1.1.1.4地图投影

简单的说地图投影就是把地球表面的任意点,利用一定数学法则,转换到地图平面上的理论和方法。

1.1.2 两种坐标系

1.1.2.1地理坐标系

地理坐标系也可称为真实世界的坐标系,是用于确定地物在地球上位置的坐标系,它用经纬度来表示地物的位置,经度和纬度是从地心到地球表面上某点的测量角,通常以度或百分度为单位来测量该角度。下图将地球显示为具有经度和纬度值的地球。

地理坐标系 (GCS) 是基于基准面的使用三维球面来定义地球上的位置,GCS 往往被误称为基准面,而基准面仅是 GCS 的一部分,GCS 包括角度测量单位、本初子午线和基准面。下图来自ArcGIS说明了了地理坐标系的组成:

1.1.2.2投影坐标系

投影坐标系是基于地理坐标系的,它使用基于X,Y值的坐标系统来描述地球上某个点所处的位置,可以这样认为投影坐标系=地理坐标系(如:北京54、西安80、WGS84)+投影方法(如:高斯-克吕格、Lambert投影、Mercator投影)+线性单位。下图来自ArcGIS说明了投影坐标系的组成:

1.1.3 ArcGIS Engine对空间参考的支持

ArcGIS Engine提供了一系列对象供开发者管理GIS系统的坐标系统。对大部分开发者而言了解ProjectedCoordinateSystem, GeographicCoordinateSystem, SpatialReference Environment这三个组件类是非常有必要的,对于高级开发者而言,可能需要自定义坐标系统可以使用这些对象Projection,Datum,AngularUnit,Spheriod,PrimeMeridian和GeoTransformation等。在ArcGIS中除了我们上面介绍的两种坐标系,还有一种称之为Unknown的坐标系,这种坐标系是当我们的数据没有坐标(jpg等文件)或者坐标文件丢失的时候ArcMap不能识别数据的投影信息而赋予的,在ArcGIS Engine中下面三个类分别对应了三个坐标系:

利用ArcGIS Engine创建一个坐标系或者基准面用的是SpatialReferenceEnvironmentClass类,该类实现了ISpatialReferenceFactory接口,该接口定义了创建坐标系,基准面等方法和属性,如下图:

在利用ISpatialReferenceFactory创建坐标系的时候往往需要一个int类型的参数,这个int其实就是这些坐标系的代号,如我们熟悉的4326就是WGS1984,下面为部分截图:

1.1.3.1同一基准面的坐标转换

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

privateIPoint GetpProjectPoint(IPoint pPoint, bool pBool)

        {

ISpatialReferenceFactory pSpatialReferenceEnvironemnt = newSpatialReferenceEnvironment();

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)//球面转平面

            {

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;

            }

        }

1.1.3.2 不同基准面的坐标转换

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

如果知道了这三个平移的参数外加个基准面上的点,那么另外一个点的坐标就是

而7参数的模型比较复杂,这种复杂的同时让精度大为提高,7参数不仅仅考虑了两个基准面之间的平移,还考虑了旋转外加一个比例因子(椭球体的大小可能不一样),从下面的图我们可以清楚看到这种关系:

对于7参数,我们知道了平移三参数旋转三参数以及比例因子外加一个基准面上的坐标就可按照下面的公式求出另外一个基准面上的坐标:

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

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

publicvoid ProjectExExample()

        {

ISpatialReferenceFactory pSpatialReferenceFactory = newSpatialReferenceEnvironmentClass();

// ISpatialReference pFromCustom = pSpatialReferenceFactory.CreateESRISpatialReferenceFromPRJFile(@"E:\\arcgis\\Engine\\zidingyi.prj");

IPoint pFromPoint = newPointClass();

            pFromPoint.X = 5150.788;

            pFromPoint.Y = 4335923.97;

IZAware pZAware = pFromPoint asIZAware;

            pZAware.ZAware = true;

            pFromPoint.Z = 958.4791;

// ((IGeometry)pFromPoint).SpatialReference = pFromCustom;

//自定义投影WGS84下的北京6度19带。

            ((IGeometry)pFromPoint).SpatialReference = CreateCustomProjectedCoordinateSystem();

//目标投影

IProjectedCoordinateSystem projectedCoordinateSystem = pSpatialReferenceFactory.CreateProjectedCoordinateSystem((int)esriSRProjCS4Type.esriSRProjCS_Xian1980_GK_Zone_19);

//因为目标基准面和原始基准面不在同一个上,所以牵扯到参数转换,我用7参数转换

ICoordinateFrameTransformation pCoordinateFrameTransformation = newCoordinateFrameTransformationClass();

            pCoordinateFrameTransformation.PutParameters(-112.117, 4.530, 21., -0.00058702, -0.004721, 0.00009358, 0.999980011);

            pCoordinateFrameTransformation.PutSpatialReferences(CreateCustomProjectedCoordinateSystem(), projectedCoordinateSystem asISpatialReference);

//投影转换

IGeometry2 pGeometry = pFromPoint asIGeometry2;

            pGeometry.ProjectEx(projectedCoordinateSystem asISpatialReference, esriTransformDirection.esriTransformForward, pCoordinateFrameTransformation, false, 0, 0);

        }

privateIProjectedCoordinateSystem CreateCustomProjectedCoordinateSystem()

        {

ISpatialReferenceFactory2 pSpatialReferenceFactory = newSpatialReferenceEnvironmentClass();

IProjectionGEN pProjection = pSpatialReferenceFactory.CreateProjection((int) esriSRProjectionType.esriSRProjection_GaussKruger) asIProjectionGEN;

IGeographicCoordinateSystem pGeographicCoordinateSystem = pSpatialReferenceFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);

ILinearUnit pUnit = pSpatialReferenceFactory.CreateUnit((int)esriSRUnitType.esriSRUnit_Meter) asILinearUnit;

IParameter[] pParameters = pProjection.GetDefaultParameters();

IProjectedCoordinateSystemEdit pProjectedCoordinateSystemEdit = newProjectedCoordinateSystemClass();

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 asobject;

object pUnitObject = pUnit asobject;

object pProjectionObject = pProjection asobject;

object pParametersObject = pParameters asobject;

            pProjectedCoordinateSystemEdit.Define(ref pName, ref pAlias, ref pAbbreviation, ref  pRemarks, ref pUsage, ref pGeographicCoordinateSystemObject, ref pUnitObject,ref pProjectionObject, ref pParametersObject);

IProjectedCoordinateSystem5 pProjectedCoordinateSystem = pProjectedCoordinateSystemEdit asIProjectedCoordinateSystem5;

            pProjectedCoordinateSystem.FalseEasting = 500000;

            pProjectedCoordinateSystem.LatitudeOfOrigin = 0;

            pProjectedCoordinateSystem.set_CentralMeridian(true,111);

            pProjectedCoordinateSystem.ScaleFactor=1;

            pProjectedCoordinateSystem.FalseNorthing=0;

return pProjectedCoordinateSystem;

        }下载本文

显示全文
专题