GDAL坐标调换其实也是调用proj4来兑现,GDAL能够像proj4那样自定义坐标系

一、引言

眼下斟酌了一晃GIS、测量绘制学的坐标调换的难题,感到抢先四分之贰资料专门的工作性太强,上来便是一通专门的职业性论述;但感到对于有关从业者来讲,其实不用明白那么多背景知识的;就经过GDAL那些工具,来轻便总括下坐标调换相关的标题。
GDAL坐标调换其实也是调用proj四来实现,不过proj四有个尤其麻烦的地点,正是坐标系描述的局地专门复杂,需求对专门的职业知识有一定的问询。使用GDAL则相对简便易行诸多。

一、引言

新近讨论了一下GIS、测量绘制学的坐标转变的标题,认为抢先八分之四材质职业性太强,上来就是一通专门的学问性论述;但感到对于相关从业者来说,其实无须领会那么多背景知识的;就由此GDAL那些工具,来大概总计下坐标转变相关的主题材料。
GDAL坐标转换其实也是调用proj四来贯彻,不过proj四有个越发麻烦的地点,便是坐标系描述的某个专门复杂,必要对专门的学业知识有必然的垂询。使用GDAL则相对简便易行大多。

常用坐标种类知识点

2、地理坐标系

地理坐标系就是常说的经纬度坐标系,比方用GPS直接获取的坐标正是在地理坐标系下获得的。二个实事求是坐标无论怎么转换,一定会有地理坐标系作为基准,也毫无疑问有能够转变出来的中纬度坐标。以国内的场合来说,常用到的地理坐标系有WGS8四,beijing5四,xian80,CGCS三千那各种。
GDAL能够像proj肆那样自定义坐标系,也足以仅透过字符串定义一些常用的坐标系,但本文以为最便宜的依然通过EPSG数据库定义的代码来定义三个地理坐标系统;毕竟多数时候需求万分的地理坐标系大多,全体三个个自定义坐标系太费事。

OGRSpatialReference spatialReference;
//spatialReference.importFromEPSG(4326);//WGS84
//spatialReference.importFromEPSG(4214);//BeiJing54
spatialReference.importFromEPSG(4610);//XIAN80
//spatialReference.importFromEPSG(4490);//CGCS2000

char *pszWKT = nullptr;
spatialReference.exportToPrettyWkt(&pszWKT);
cout << pszWKT << endl;
CPLFree(pszWKT);
pszWKT = nullptr;

如上演示了GDAL定义地理坐标系并出口坐标系的音讯。各类不一致的坐标系只要求转移相应的代码编号,用起来极度有利。最后打字与印刷输出了的xian80坐标系音讯:
图片 1
在此处确定要注意,使用那种方法定义地理坐标系一定要通过配备GDAL_DATA路径,否则调整台会输出错误消息:

CPLSetConfigOption("GDAL_DATA", "gdaldata");

“gdaldata”表示1个渠道(那里用的是相对路线,当然也得以设置成相对路径),是GDAL编写翻译落成后会生成的多少个目录,里面著录了各个坐标系的参数文件。比如进入这一个文件夹,用Excel张开pcs.csv那么些文件,就足以看出各个坐标系的参数了。
图片 2
而外这种措施,也能够在环境变量中安装GDAL_DATA变量来完成。

二、地理坐标系

地理坐标系便是常说的中纬度坐标系,比方用GPS直接拿走的坐标就是在地理坐标系下得到的。2个实打实坐标无论怎么转移,一定会有地理坐标系作为规范,也必将有可以转移出来的经纬度坐标。以国内的情状的话,常用到的地理坐标系有WGS八肆,beijing5四,xian80,CGCS三千那多样。
GDAL能够像proj四那样自定义坐标系,也可以仅通过字符串定义一些常用的坐标系,但本文认为最方便的要么经过EPSG数据库定义的代码来定义叁个地理坐标系统;毕竟诸多时候需求协作的地理坐标系许多,全体八个个自定义坐标系太辛勤。

OGRSpatialReference spatialReference;
//spatialReference.importFromEPSG(4326);//WGS84
//spatialReference.importFromEPSG(4214);//BeiJing54
spatialReference.importFromEPSG(4610);//XIAN80
//spatialReference.importFromEPSG(4490);//CGCS2000

char *pszWKT = nullptr;
spatialReference.exportToPrettyWkt(&pszWKT);
cout << pszWKT << endl;
CPLFree(pszWKT);
pszWKT = nullptr;

如上演示了GDAL定义地理坐标系并出口坐标系的音讯。八种差别的坐标系只需求退换相应的代码编号,用起来十分便于。最终打字与印刷输出了的xian80坐标系消息:
图片 3
在此处一定要专注,使用那种方法定义地理坐标系一定要透过配备GDAL_DATA路线,否则调控台会输出错误音讯:

CPLSetConfigOption("GDAL_DATA", "gdaldata");

“gdaldata”表示三个门道(那里用的是相对路径,当然也足以设置成相对路径),是GDAL编写翻译完结后会生成的贰个目录,里面著录了种种坐标系的参数文件。比方进入那几个文件夹,用Excel张开pcs.csv那个文件,就足以见见各样坐标系的参数了。
图片 4
除却那种格局,也足以在情状变量中设置GDAL_DATA变量来落到实处。

一.坐标连串里面包车型客车更动

3、投影平面坐标系

经纬度坐标是曲面上的坐标,曲面上的坐标投影到平面,不一样的黑影格局就会发生不一样的平面坐标;即便是同等种影子格局,不相同的参数获得的平面坐标也会不一致。也正是说,地理坐标系下的中纬度坐标与影子坐标系下的平面坐标,是1对多的关联而不是相当的关系。以国内的动静的话,平时选取的黑影有横轴墨卡托投影,高斯-克吕格投影和UTM投影。
在Global Mapper中两种影子设置格局如下:
图片 5
图片 6
图片 7
能够看出,高斯-克吕格投影和UTM投影其实都是横轴墨卡托投影,两者都是通过安装带号(Zone)来达成设置横轴墨卡托投影的具体参数(Parameters)。在GDAL里面,高斯-克吕格投影便是由此设置横轴墨卡托投影来贯彻的。如下演示了多少个xian80坐标系,三度带带号3八的横轴墨卡托投影。

OGRSpatialReference spatialReference;
spatialReference.importFromEPSG(4610);          //XIAN80
spatialReference.SetTM(0, 114, 1.0, 38500000, 0);

设置横轴墨卡托投影的函数SetTM()有三个参数:

参数 设置
dfCenterLat 一般为0
dfCenterLong 中央经线,决定了是哪一投影带
dfScale 一般为1.0,UTM设置为0.9996
dfFalseEasting 一般为500000,高斯-克吕格前面加上带号
dfFalseNorthing 一般为0

用事先方法得到坐标系音讯并出口,音讯如下:
图片 8

三、投影平面坐标系

经纬度坐标是曲面上的坐标,曲面上的坐标投影到平面,分化的黑影格局就会发出差别的平面坐标;即便是一样种影子方式,分歧的参数得到的平面坐标也会分化。约等于说,地理坐标系下的中纬度坐标与影子坐标系下的平面坐标,是1对多的涉嫌而不是一定的涉及。以国内的动静的话,平时应用的黑影有横轴墨卡托投影,高斯-克吕格投影和UTM投影。
在Global Mapper中两种影子设置格局如下:
图片 9
图片 10
图片 11
可以看出,高斯-克吕格投影和UTM投影其实都以横轴墨卡托投影,两者都以透过安装带号(Zone)来贯彻设置横轴墨卡托投影的现实参数(Parameters)。在GDAL里面,高斯-克吕格投影正是经过设置横轴墨卡托投影来促成的。如下演示了一个xian80坐标系,三度带带号3八的横轴墨卡托投影。

OGRSpatialReference spatialReference;
spatialReference.importFromEPSG(4610);          //XIAN80
spatialReference.SetTM(0, 114, 1.0, 38500000, 0);

设置横轴墨卡托投影的函数SetTM()有八个参数:

参数 设置
dfCenterLat 一般为0
dfCenterLong 中央经线,决定了是哪一投影带
dfScale 一般为1.0,UTM设置为0.9996
dfFalseEasting 一般为500000,高斯-克吕格前面加上带号
dfFalseNorthing 一般为0

用事先方法获得坐标系音讯并出口,音讯如下:
图片 12

(一)坐标系分类

四、坐标调换

概念好坐标系之后,就能够展开坐标调换了。如下为xian80地理坐标系下某点(1一三.陆,38.8)用高斯-克吕格投影到带平面坐标系:

OGRSpatialReference* pLonLat = spatialReference.CloneGeogCS();
OGRCoordinateTransformation* LonLat2XY = OGRCreateCoordinateTransformation(pLonLat, &spatialReference);
if (!LonLat2XY)
{       
    return 1;
}

double x = 113.6;
double y = 38.8;
printf("经纬度坐标:%.9lf\t%.9lf\n", x, y);
if (!LonLat2XY->Transform(1, &x, &y))
{
    return 1;
}
printf("平面坐标:%.9lf\t%.9lf\n", x, y);

OGRCoordinateTransformation::DestroyCT(LonLat2XY);
LonLat2XY = nullptr;

此间经过复制在此以前定义的高斯-克吕格投影平面坐标系获得平等的地理坐标系(当然也足以自定义新坐标系),然后使用OG科雷傲CoordinateTransformation::Transform()方法来开始展览坐标调换。最终的输出结果为:
图片 13
透过Global Mapper的坐标调换工具来讲明结果是还是不是科学:
图片 14
图片 15
正如能够窥见两者调换的结果基本1致。除却,将平面坐标逆投影到地理坐标也是足以的,只须要在OGLX570CreateCoordinateTransformation()的时候颠倒下1一就可以。

4、坐标转变

概念好坐标系之后,就足以开始展览坐标转变了。如下为xian80地理坐标系下某点(1一三.6,3八.八)用高斯-克吕格投影到带平面坐标系:

OGRSpatialReference* pLonLat = spatialReference.CloneGeogCS();
OGRCoordinateTransformation* LonLat2XY = OGRCreateCoordinateTransformation(pLonLat, &spatialReference);
if (!LonLat2XY)
{       
    return 1;
}

double x = 113.6;
double y = 38.8;
printf("经纬度坐标:%.9lf\t%.9lf\n", x, y);
if (!LonLat2XY->Transform(1, &x, &y))
{
    return 1;
}
printf("平面坐标:%.9lf\t%.9lf\n", x, y);

OGRCoordinateTransformation::DestroyCT(LonLat2XY);
LonLat2XY = nullptr;

此处透过复制此前定义的高斯-克吕格投影平面坐标系拿到一样的地理坐标系(当然也可以自定义新坐标系),然后利用OGMuranoCoordinateTransformation::Transform()方法来张开坐标转换。最终的出口结果为:
图片 16
经过Global Mapper的坐标调换工具来证实结果是还是不是精确:
图片 17
图片 18
正如能够发掘互相转换的结果基本一致。除外,将平面坐标逆投影到地理坐标也是足以的,只要求在OGPRADOCreateCoordinateTransformation()的时候颠倒下依次就可以。

今非昔比参心坐标系之间的更动、差别地心坐标系之间的转变;

五、其他

一.GDAL暗中同意不编写翻译proj.四,使用的时候要求加上proj.四的帮忙。
2.同样地理坐标系的黑影转变是紧紧的,但区别地理坐标系之间需求先转移到地心立体坐标系,然后通过7参数调换。
三.方可依附坐标值选取精确的分带,使用这么些分带的内外几个分带实行投影难点也不是非常大。可是分带差别太大可能有标题,因为影子公式只还好自然范围内卓有成效;即差异的软件对的时候结果相比一致,错的时候结果恐怕两样。
如上多个难点有时间再做进一步的研究和小结。

五、其他

1.GDAL私下认可不编写翻译proj.4,使用的时候须求丰裕proj.四的援助。
2.同样地理坐标系的阴影调换是环环相扣的,但区别地理坐标系之间须要先转移到地心立体坐标系,然后通过7参数转变。
3.得以依赖坐标值采用正确的分带,使用那些分带的左右几个分带实行投影难点也不是十分的大。但是分带差别太大只怕格外,因为影子公式只还好早晚限制内有效;即分化的软件对的时候结果相比一致,错的时候结果可能分裂。
如上五个难题有时间再做进一步的商量和小结。

参心坐标系与地心坐标系之间的改换;

6、参考文献

1.GDAL源码剖析(十一)之OGLAND投影表达
2.墨卡托投影、高斯-克吕格投影、UTM投影及笔者国分带方法
3.GDAL库学习笔记(5):坐标系之间的倒车
4.GIS坐标转变库Proj.四的施用
5.GDAL印象投影调换

6、参考文献

1.GDAL源码剖析(拾一)之OGLX570投影表明
2.墨卡托投影、高斯-克吕格投影、UTM投影及小编国分带方法
3.GDAL库学习笔记(伍):坐标系之间的转向
4.GIS坐标调换库Proj.4的接纳
5.GDAL影象投影转变

平等坐标系的直角坐标与大地坐标之间的坐标调换;

中外坐标与高斯平面坐标之间的转移;

在多个空中角直坐标系中,如若其各自为O-XYZ和o-xyz,假使四个坐标系的原点一样,通过三回旋转,就能够多少个坐标系重合;借使八个直角坐标系的原点不在同三个地方,通过坐标轴的运动和旋转可以收获一致;假诺五个坐标系的尺码也不一样,就要求再追加一个规范化变化参数。

对于满世界坐标和高斯投影平面坐标之间的转移,则需求经过高斯投影正算、高斯投影反算,通过使用中心子午线经度、不一样的参考椭球、差别投影面包车型客车选用来得以落成坐标的转变。

图片 19

2. 三参数、四参数、七参数

(1)七参数:平移变量(Dx、Dy、Dz)、旋转换量(奥迪Q7x、Ry、卡宴z)、尺度缩放(K);

3参数:平移变量(Dx、Dy、Dz)、旋调换量= 0、尺度缩放=一;

叁参数正是7参数的特例;

参数和七参数都以多少个空中坐标系之间转换-椭球转换(不相同椭球体)。

(2)四参数:暂无统1标准

八个平面坐标系之间转变-平面转换(同一椭球体);

在差异的椭球之间的退换是不严密的,一般来说比较紧密的是用7参数法(包含布尔莎模型,一步法模型,Haier曼特等),即1个平移因子(X平移、Y平移、Z平移),贰个旋转因子(X旋转、Y旋转、Z旋转),多少个比重因子(也叫尺度变化K)。在职业区内找四个以上的已知点,利用已知点的BJ54坐标和所测WGS八4坐标,通过自然的数学模型,求解柒参数。若多选多少个已知点,通过平差的法子能够收获较好的精度。

如若区域限定十分小,最远点间的离开不高于30Km(经验值),能够用三参数(莫洛登斯基模型),即只思考一个平移因子,而将旋转因子视为0、比例因子视为一,所以3参数只是柒参数的1种特例。GPS导航时一般选取叁参数就能够落成较高精度,7参数太难为而且不实用。

同三个椭球里的转移都是一体的,在同多少个椭球的例外坐标系中改换供给用到4参数调换,如布拉迪斯拉发既有首都5四坐标又有麦纳麦坐标,在那三种坐标之间变换就用到4参数。总结四参数需求四个已知点。

3. 形势图坐标系

我国的地貌图使用高斯-克吕格平面直角坐标系。

在该坐标系中:横轴- 赤道,用Y表示;

纵轴-中祛风散寒线,用X表示;

坐标原点-中央经线与赤道的交点,用O表示。

赤道以南为负,以北为正;核利水通淋线以东为正,以西为负。作者国位于北半球,故纵坐标均为正在,但为幸免中央经度线以西为负值的状态,将坐标纵轴西移500英里(500,000米)。

一九伍四年作者国在京都设立了天下坐标原点,接纳克Cable夫斯基椭球体,依此计算出来的各大地调控点的坐标,称为Hong Kong5四坐标系。

四. 陆度带、③度带、核收湿敛疮线

作者国选择6度分带和三度分带。

一∶2.5万及一∶五万的地貌图使用陆度分带投影,即经差为陆度,从零度子午线开首,自西往东每一种经差陆度为一投录影带,全世界共分五十六个带,用壹,二,三,四,5,……表示.即东经0~陆度为率先带,在那之中和胃生津线的经度为东经三度,东经陆~1二度为第一带,其核肺经线的经度为9度。

一∶10000的时局图使用三度分带,从东经一.5度的经线发轫,每隔三度为左近,用一,二,三,……表示,全世界共划分1十九个投影带,即东经一.5~四.伍度为第3带,当中肝经线的经度为东经三度,东经四.5~7.五度为第1带,个中补中消肿线的经度为东经陆度。

地图上公里网横坐标前四人便是带号,比方:壹:四万地形图上的有个别横坐标203454八陆,在那之中20即为带号,3454八陆为横坐标值。

5.中退热除蒸线计算的不2秘诀

(1)六度带中利水通淋线经度的乘除:本地核去除风湿开胃线经度=6°×本地带号-叁°(适用于一∶二.50000和一∶50000地形图)。如:地形图上的横坐标为20345,其所处的陆度带的核去除风湿除热线经度为:陆°×20-三°=117°

(2)三度带核和解毒里线经度的一个钱打二17个结:核广谱抗菌线经度=三°×本地带号(适用于一∶一万地形图)

广阔难点“问”“答”

(1)说“经纬度投影”对吧?

经纬度表示的是地理坐标系(单位是度),不是影子坐标系(单位是米),两者放1块鲜明不妥。

(2)大地坐标系与地理坐标系有什么区别?

世上坐标系和地理坐标系都以经纬度表示的坐标系,本人并不分包投影消息,繁多时候,那三种说法都以一律的。

(三)为啥有地理坐标系和影子坐标系之分?

是因为经纬度的度数不对应某一规范长度,因而不能够准确衡量距离或面积,也难以在平面地图或计算机显示屏上海展览中心示数据。在动用过多(不是全方位)GIS
分析和制图应用程序时,平时必要由投影坐标系提供的更稳固的平面坐标框架。与地理坐标系不一致,在2维空间限制内,投影坐标系的长短、角度和面积定位。投影坐标系始终基于地理坐标系,而后人则是依靠球体或旋转椭球体的。在影子坐标系中,通过格网络的
x,y 坐标来标志地点,其原点位于格网中央。

(肆)通常所说的塞内加尔达喀尔80,新加坡5四是指什么?

 GIS中的坐标体系定义由基准面和地图投影两组参数分明,基准面对应2个参阅椭球体,大家常说的都城54、马普托80、国家大地三千坐标系都以指其参考椭球体。基于那种椭球体,大家能定义出大地坐标系和阴影坐标系。只说一个埃德蒙顿80是无法鲜明坐标类别的,因为从没认证有没有影子及影子音信。假使不指明投影方式,则以为苏州80、东京5四的表现形式为海内外坐标,而不是影子平面直角坐标。

图片 20

(五)什么都是高斯投影?

高斯-克吕格投影属于横轴墨卡托投影,能小范围内保持形态不改变,由此被国内分布应用,但在代表小比例尺数据时,那种投影显著不正好。就中国的话,一般50万之上比例尺选用高斯投影,50万之下采取兰伯特投影。数据用途不相同,具体的影子格局各有不一样,有的是为了维持面积不改变,有的是为了维持形态不改变。另1种世界常用的影子是UTM(通用墨卡托投影),高斯-克吕格投影是“等角横切椭圆柱投影”,投歌后中央经线保持长度不改变,即比例周全为一;UTM投影是“等角横轴割圆柱投影”,圆柱割地球于南纬80度、北纬八四度两条等高圈,投影后两条割线上尚未变形,中去除风湿健胃线上长度比0.999陆。

(6)新加坡5四,德雷斯顿80,WGS8四,国家两千 有何不相同?

5四和80实质上是参心坐标系,大地原点分别在苏维埃社会主义共和国缔盟和罗利,原点是参考椭球的几何中央,那类坐标难以表明中度新闻,精度新闻等也不够,正被淘汰。WGS捌四和国家三千真相上是地心坐标系,即以地球质量宗旨作为坐标系原点。5四的椭球体长半轴半径是637八贰四5米,80为6378140米,八4和三千坐标系同样,都以637八1叁7米。国家流行的三千坐标系和WGS捌4据他们说在分米级都以1模同样的,但和80坐标在北齐文宣帝度地区模型误差达十好多倍。

(七)谷歌、Microsoft、ArcGIS提供的地图服务分别采用了何等坐标系?

今昔都统一为了Web
Mercator,即正轴墨卡托投影,和UTM(常规墨卡托)投影的关键不一样是为了达成上的有益,把地球模拟为球体而非椭球体,精度理论上距离0.3三%,比例尺大时中央能够忽略。同时纬度范围形成了(-85,85),南北极展现不断,但不影响平常使用,那样也减小了切图数量。

(八)ArcGIS的空间参考与坐标体系?

ArcGIS的空中参考音讯SpatialReference,不仅带有了坐标类别的概念,还蕴含容差Tolerance和分辨率Resolution等,日常由Prj文件表示。ArcGIS中的坐标系列分地理坐标系和阴影坐标系,当中投影坐标系也势必带有3个地理坐标系,反之不然。

图片 21

相关文章