Category: 教学/Teach
-
航行中相对位置设计与计算精度
相对方位与距离是测量和领航中极为常用的位置描述格式。航行中对航迹的定义或障碍物的描述,经常涉及根据一个已知点及其相对方位和距离求另一个点坐标的计算。这时,已知点的位置往往是从公布的航行资料或测绘的成果表格中取得的经纬度(地理坐标)形式,而方位和距离则是来自VOR/DME导航设施(公布)或全站仪(实测)定义的局部平面坐标系下获取的。显然不能在经纬度上加上平面距离增量,而飞行程序设计实务中会用到一个手手相传的MFC三无exe工具来实现相关转换,背后原理与可靠性不得而知。 与之相关联的,是设计图件在AutoCAD (.dwg)与Google Earth (.kml)之间的转换。实务中,见到过一个名为acad2kml的AutoLISP插件,但转换往往只能是单向的,难以将kml转换和导入进AutoCAD。后者自带的地理位置功能在常用的版本中看起来只能以一个点为参照,将图纸映射到某个自定义的投影坐标系中的对应位置。 对于相对经纬度一定方位和距离的点的计算,考虑三种朴素的思路: 考虑AIP China(题外话,最近情报中心开放了AIP访问,可以成为一个公开的权威数据源)中的一个算例:南翔NDB(PK)位于虹桥ARP磁方位3度9630米处,同时也公布了精确到0.1分的经纬度,可以用来验证。尽管数据是公开的且加偏的,此处还是模糊处理不直接出现经纬度坐标点了。 解法一我的实际操作是用了epsg.io的坐标转换,外加自己手按计算器。 解法一变量 值(东) 值(北) 参考点投影坐标 341365.7316m 3452591.9855m 相对位置增量 -464.8273m 9618.7751m 相对位置投影坐标 340900.9042m 3462210.7606m 相对位置经纬增量 -0.006404° 0.086689° 相对位置误差 -0.08426′ 0.00133′ 解法二我的实际操作是用自己粗浅的球面三角现学现卖,推导了一下公式(三角函数和反函数都是度,非弧度): 解法二变量 值(东) 值(北) 相对位置经纬度增量 -0.004180° 0.086504° 相对位置误差 0.04918′ -0.00978′ 解法三采用pyproj.Geod.fwd实现,可以看到在东西方向上精度直接高了一个数量级,南北方向上也比球面优一些。 解法三变量 值(东) 值(北) 相对位置经纬度增量 -0.004882° 0.086754° 相对位置误差 0.00710′ 0.00526′ 需要注意的是,以上个例不见得具有代表性,比如纬度低、远离投影中央经线。同事,所谓误差是与AIP公布值的对比,而公布值本来就是有误差(舍入和人为)的,南翔这个误差(公布值与实务工具软件)在0.01′左右,是凑巧南翔台确实在接近0.1分的位置,让这个算例更能体现出各个思路的计算精度。也就是说,在AIP公布的0.1分的精度下,这三个思路基本都可以满足需要。从实际操作的方便程度而言,如果手工计算可以选球面正弦定理的方式,计算简明、精度适中;如果编程开发可以选Vincenty公式的有关实现,开箱即用、精度较高。
-
球面墨卡托在机场应用中的误差
球面墨卡托(EPSG: 3857)随着瓦片地图的流行也许是当今网络电子地图中最为普遍采用的投影坐标系。众所周知,这种投影会把南北极点拉伸成一条与赤道等长的线,因而在高纬度区域对长度和面积的夸大都是相当可观的。不过在本人学习地图学以来的日常空间分析和地图制作中,很少会涉及需要考虑这一效应的时候。除了专门举例不同投影的形变特性的例子,印象中唯一感受到过的影响应用实例是全球道路网拓扑模式分析研究中,从一开始合作者提示注意投影,到后来自己对照组内地图数据和网络电子地图分析特定模式时发现有时很难对应二者的形态特征。近期,在试图将空间分析工具引入机场净空评估而准备课堂案例时,再次感受到了这个投影的显著不足。 跑道地理要素的制作 在航空领域,除了令人眼花缭乱的公制英制单位外,经纬度地理坐标与相对方位加距离的空间位置描述方式也时常混杂在一份文档中。在机场的数据库编码表页面中,可以找到进近航段编码中的飞越点,同时其名称中数字为50的整数倍,推测是跑道入口点,查阅航路点坐标表后展绘在参考底图上可以确认。从不同跑道方向的进近编码中可以获得跑道两个端点的平面地理坐标,进而可以通过导入点、点转线得到表示跑道的地理线要素。当然还可以进一步查阅细则中跑道物理特征表中的入口标高,构造三维点线要素。 量测与对比 得到跑道线要素后,可以在属性表中计算其长度,由于在参考底图默认的EPSG: 3857下,默认计算的是这个坐标系下的平面距离。这个距离算出来与细则中的跑道长度完全是天差地别,令人惊讶。武汉天河两条实际长3400米和3600米的跑道,在球面墨卡托投影坐标系中算得长度3965米和4200米,这是完全不能接受的结果。不过用量测工具的测地线模式可以手动测得基本准确的长度。 启示 这对于航空领域WGS84应用场景中小范围距离计算有巨大的警示作用。在机场管理和资料填报中,经常有以跑道(入口、中心线等)作为参考的相对位置描述。如果在此次经历之前,我肯定会选择在投影坐标系里计算这些相对位置点的平面投影坐标,然后再转换回EPSG: 4326地理坐标,并认为这个计算误差不会很大、可以接受。如果发现偏大,顶多会从EPSG: 3857转为采用3度带的UTM或者GK投影,放弃逃避选择投影带的问题来提高精度,但目前看来这也许还是会有难以接受的误差。所以有空可以实测一下看到底有多大效果提升,或者说球面墨卡托有多离谱。 这次经历还有个令人不安的点在于,如果换成UTM或者GK仍然误差很大,那甚至还需要去查找测地线距离反算地理坐标的公式,这个东西说实话这么多年从来没见过或者想到有用过,如果真的有那就很好了。 近期和机场情报一线交流时了解到,某次重新测绘后,一个一直以来认为对飞行构成影响的障碍物,按新数据评估后变为不影响,令人感到困惑。由于缺少必要的验证细节,对于这个个案我无从判断,但是这种想当然的转换成为了一种可能的解释。
-
用代码绘制非精密直线进近起始段保护区
之前,我已经建立了一些基本的Python代码架构,并实现了最后进近航段的保护区主区和副区梯形轮廓的坐标串和绘图输出。final_protect_area(x_faf, final_leg)函数可以通过输入FAF点(“最后进近定位点”,即最后航段的起点)坐标和最后航段结构体(通过原生的namedtuple实现)来返回以多边形几何表示的最后段主区和副区。航段结构体包含提供引导的电台、航段长度及单位、航迹方向角,电台结构体又包含了点几何和类型。那么仿照这个例子,本次的起始进近保护区函数应该接受的输入则是该航段起止点(起始进近定位点IAF、中间进近定位点IF)的坐标和起始航段的信息,而返回的结果则同样是主副区的多边形几何。 以上接口定义方面看起来没有问题,接下来转入实现。要想仿照最后进近的编程模式,就要先回顾其实现的思路。最后航段必须有一个导航台提供引导,其保护区形状是一个等腰梯形。这个梯形可以理解为航径线的一个宽度(半径)不断变小的缓冲区,因此其几何由上底、下底、高来确定,而在航空交通中,很多梯形的形状是通过一条底边的长和腰与高的夹角(“扩张角”,或者其正切值,即宽度变化率,“扩张率”)给出。因此,这个图形的生成主要就是根据导航台的类型和位置、来确定这个梯形的底边长和宽度变化率。在此基础上,根据起点位置和航段长度截取出梯形在航段范围内的部分。 由于飞行程序设计通常在以跑道入口中点为原点的平面直角坐标系中进行,而本次最后段的航迹就是该坐标系X轴的负方向,所以梯形顶点Y坐标实际上就是梯形在起止点处两腰之间宽度的一半。由此思路,之前的实现编写了一个计算梯形宽度的函数生成器width_gen(facility, phase, unit=’km’),通过输入的导航台位置和类型信息,查询相应导航台的性能参数(即梯形底边长和扩张角),返回一个可以根据到导航台纵向(飞行方向)距离计算宽度的函数。这个思路由于将太多因素耦合在一起,对起始航段相对复杂情形的实现带来了很多阻碍,最终放弃了延续这个思路进行开发。 起始航段的尝试与思考 正常情况下,起始航段是一个半径为5海里的缓冲区,即一个以预定路线为中心的矩形。但是导航台的位置和航段的长度可能引入缩减和扩张两类不互斥的特殊情况。缩减的情况是,如果起始段终点(IF)处设置了一个导航台,则此处的缓冲半径(宽度)相应减小,再逆飞行方向线性扩张到正常宽度。扩张的情况是,如果起始段起点(IAF)距提供引导的导航台太远,则超过一定距离后要从正常宽度的基础上按参数扩张。 模仿思路的误区 在实现中,模仿最后段半宽计算思路面临一个巨大的不确定因素,即提供引导的导航台是否在IF处。这一点似乎牵涉到扩张情形的距离判定:如果在,则到电台的距离和航段中的相对位置是相等的;如果不在,到电台的距离与在航段中的相对位置是不同的。受最后航段等腰梯形到底边距离与宽度关系这个思路的影响,此处很容易陷入混乱。要做到一个同样的保护区宽度函数生成器,这个生成的函数的参数就要在距底边(电台)长度和距航段终止点(或者跑道入口)长度之间作出明确和转换,而这又取决于导航台与航段的相对位置。而这时,只能回到原点重新设计这个函数。 实现初期还因为理论知识不熟悉遇到一个相关误区,即试图考虑两个导航台的情况。诚然,最后航段必须有一个导航台,但如果IF是导航台,起始航段则只会跟它有关。虽然这时确实有两个导航台存在,但在起始航段保护区绘制中仍然不需要考虑两个导航台的情形,缩减和扩张都以IF处的台为基础。 工程规范的梳理 首先,两种特殊情况是可能同时存在的,这就至少有四种可能:正常(既没有缩减、也没有扩张)、只有缩减、只有扩张、既有缩减也有扩张。但是,只有缩减的情况还可以细分,因为按规定参数扩张到正常宽度是需要一定距离的,实际上航段的长度并非一定足够完成这个动作。因此,只有缩减又分为了只有缩减且长度足够恢复正常、只有缩减但长度不足以恢复正常。这五种情况对应的几何形状是不同的,正常情况为矩形,缩减够长是矩形和IF附近梯形的拼接,缩减过短是只有一个梯形,只有扩张是IAF附近梯形和矩形的拼接,都有是IAF附近梯形、矩形、IF附近梯形三者的拼接。 起始段实现思路与过程 抛弃了半宽计算的思路,保护区生成本质上是确定多边形区域顶点坐标。起始段的多边形相较于最后段,其难点在于多边形结构不确定,进而顶点数量和位置不确定。当然,分别为五种情况实现一个判定函数和一个顶点坐标计算函数肯定是可行的,只是冗余太多,容易在调试修改中造成逻辑不一致或者重复计算等情况。而要写成一个流程,潜在的难点有两处:在什么地方按什么条件设置分支;如何处理变长坐标串。 分支判定与流程设计 根据上文的梳理,可以按有无缩减、有无扩张分为四种,再按缩减是否恢复再将第二种分为两种。有无缩减可以通过比较导航台位置和IF位置判定,有无扩张则可以通过计算导航台位置和IAF位置之间的距离、再与规定的阈值比较判定。缩减是否恢复可以通过比较航段长度(或IAF和IF间距)和规定的阈值判定。 变长的顶点坐标串则可以通过向一个列表中依次加入元素实现。而且,由于图形的对称性,只需要加入一侧的点,再逆序加入其相反数即可。所以,最好能按合理的顺序进行上述判定,以便在完成判定后能够按正确的顺序追加顶点。从IF点处开始,逆进近方向,保护区外轮廓第一个顶点的X坐标是IF的X坐标,Y坐标则依赖于是否缩减。如果缩减,第二个可能的顶点是缩减后恢复正常的点,如果缩减距离过近强制恢复,这个点则是这半边的最后一点(需结束后续判定);如果是缩减后完成恢复,则其X坐标需要计算(也可以是规定的阈值,考虑到规定值舍入误差的存在,此处取计算所得的精确点)。第三个可能的顶点是正常宽度的终点,其Y坐标为规定的标准值,X坐标取决于是否扩张,若无扩张,即为IAF的X坐标(完成判定);若有扩张,则需要计算(同上,不考虑舍入误差可直接采用规定的阈值)。同样,在扩张的情况下,还存在第四个可能的顶点,即扩张的IAF,其Y坐标需要计算。 后处理与测试收尾 构建好的顶点坐标串,生成多边形几何只需用到原生的集合操作工具map(映射,用于取相反数)、reverse(逆序),以及基本的列表操作。最后不要忘记的一点是,重复首点以完成闭合。由于这个功能较为常用,同时也适用于中点连中点作主副区分界线的场景,因此将其封装为make_buf_geom_from_hw(locs, hwidths, primary)函数供重复调用。 测试也不能少。有了上述五类情形的分析,自然就可以设计每种情形的测试用例。在编写和运行测试的过程中,还发现了两处小问题,其中一个可以直接解决、另一个有待后续完善。直接解决的是,发现既有缩减又有扩张的情况下,扩张开始位置与规定阈值相关过大、非常明显。如图,设置的NDB电台位于跑道入口外24海里,按ICAO Doc 8168 Vol 2 Part I Section 4 Chapter 3 Appendix B 第4页图I-4-3-App B-4-3 IAF距NDB超过25.5公里(13.8海里)的情况,NDB缩减恢复正常的距离是13.8海里,因而测试用例中的位置应该是跑道入口外37.8海里,但图示结果明显超过了40海里。经检查,原来是配置文件中输入的起始宽及扩张角规定值将两种电台搞反了,纠正后即可恢复正常。 测试中发现的另一个问题是,如果IF距离跑道入口过远且无导航台,仅扩张的情况下梯形与矩形的拼接体出现异常形状。如图测试值为VOR台设在入口内1海里,IF设在入口前40海里,此时中间加最后航段的长度显然超过了规定的最大值15+10=25海里,而本次编写的程序未验证这一基本设计规则。当然,这个验证也不该是绘制保护区时要考虑的事情,因此留待以后处理。
-
纸笔绘航路图的投影问题
本月第一轮讲授航图实践课程。虽说名称叫实践,但以往的执行以纸笔绘图练习为主。完成了障碍物A型图、精密进近地形图之后,隐约感觉大家上路之后进度可能很快,于是在航路图这节打算上点强度:认认真真地把经纬度投影出来做航路图的练习。对于非测绘或者地理科班的学生而言,地图投影可能一直以来都是听个概念,很少动手实际体验这个过程——即使是地图学专业,我记忆里似乎也少有手工展绘坐标点的经历,只要在软件或者代码里设置好转出转入的坐标系也就够用了。 问题产生:投影坐标轴/顺序定义 这节课的练习里要绘制一块2°×2°的航路图局部,首先面临的一个问题就是图廓线的绘制。无论选择什么投影,这个球面上的整齐区域对应的平面图廓一定不应该是个正方形——虽然对于没有制图基础的人来说正方形是最符合直觉的。这时候,就需要根据制图区域的四至范围计算图廓四个角点的投影坐标。甚至可以更粗略地,计算左下角点和右上角点的坐标来确定一个矩形框作为图廓。 方便易懂的epsg.io网站是我手动转换坐标时的首选工具。利用该网站,可以把WGS 84 (EPSG:4326)的坐标转换为投影坐标。这里值得考虑的投影有Lambert、UTM、Gauss-Krüger。兰伯特因为不同地区的中央经线和标准纬线不同,在众多搜索结果中不好找合适的,就没有在课堂上使用。这里先把转换工具支持的ESRI:102012 (WGS 1984 Lambert Asia)结果在表格最后列出供对比。UTM和GK的选择只需要看经度范围,简单易行,此处列出111°中央经线六度带的投影WGS 84 / UTM 49N (EPSG:32649) CGCS2000 / GK 19 (EPSG:4497)。 坐标系 左下 22N 110E 右上 24N 112E 左上 右下 EPSG:4497 19396734, 2434138 19601755, 2655649 19398244, 2655649 19603265, 2434138 EPSG:32649 396775, 2433164 601714, 2654587 398285, 2654587 603224, 2433164 ESRI:102012 539685, 2819337 734587, 3065085 525045, 3049050 755070,…