• 51阅读
  • 0回复

离线获取任意经纬度海拔高度?一个100行代码的跨平台方案 [复制链接]

上一主题 下一主题
离线liudianwu
 

只看楼主 倒序阅读 楼主  发表于: 前天 10:55

绝对高程(或称海拔),是指地面点沿垂线方向至大地水准面的距离。我国采用的“1985年国家高程基准”,是以1952年至1979年青岛验潮站观测资料确定的黄海平均海水面,作为绝对高程基准面。并在青岛市观象山建立了国家水准原点,其高程为72.260米,作为我国高程测量的依据。
绝对高程与相对高度相对,计算绝对高程的参考基点是确认一个共同认可的海平面进行测算。这个海平面相当于标尺中的0刻度。因此,绝对高程又称之为绝对高度或者海拔。而相对高度是两点之间相比较产生的海拔高度之差。但海面潮起潮落,大浪小浪不停,可以说没有一刻风平浪静的时候,而且每月大地水准面每日涨潮与落潮的海面高度也是有明显差别的。因此,人们就想到只能用一个确定的平均海水面来作为海拔的起算面。海拔也就定义为高出或者低于平均海水面的高度。这就是通常人们所说的高程或绝对高程。由于地球内部质量的不均一,地球表面各点的重力线方向并非都指向球心一点。这样就使处处和重力线方向相垂直的大地水准面,形成一个不规则的曲面。因而世界各国有各自确立的平均海平面,即大地水准面。


做地图开发会遇到一个常规需求,就是获取当前经纬度对应的海拔高度,也叫做高程值,很遗憾各大地图厂商都未提供接口获取,可能是有明文规定,不能地图中提供对应的海拔高度值,于是需要另想他法,尽管谷歌地图在线的api接口是提供了海拔高度值,但是懂得都懂,国内哪里还能用谷歌地图?完全用不了啊,就算你开发者能用,99.99%的用户也是用不了,而且必须是在线,没有离线也不行。


通过查阅资料得知有个gdal的开源库,支持读取tif文件获取高程值,使用过了是可以,但是编译复杂,尝试过很多次直接集成源码的方式,终归失败,源码数量太多了,两千多个,也有不少的依赖,比如依赖zip和sqlite啥的,所以最终放弃这个方案,后面又找了一些类似tinytiff的开源库,都是用来读取tif文件的,但是没有看到获取高程值接口,而且只支持普通的tif文件。


在折腾的快要放弃的时候,往往就是离成功最近的时候,思索着有没有更简便的方式,而且跨平台,毕竟只是想获取个高程值,引入个这么大的库完全没有必要,有点杀鸡用牛刀的感觉。在经过使用gdal函数接口的过程中,规则都是从图片的像素坐标获取灰度值,然后这个灰度值对应的就是海拔,网上很少有人提到这点,其实这点极其重要,没搞过的人一直云里雾里的折腾编译gdal等开源库。后面还发现对应tif的还有个txt的文本文件,打开内容看到最前面写着左上角的经纬度坐标和水平和垂直比例尺等参数值,然后就是逐行的每个像素点的海拔值,这就非常美妙了,要的就是这种文件呢,自己写个算法去处理也是分分分钟的事情。一气呵成打完收工,自此不仅离线使用,速度纳秒级别,还支持所有平台,就一个类文件100行左右,不要太完美啊。

欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
快速回复
限100 字节
 
上一个 下一个