MATLAB地图工具箱学习总结(四)自定义投影
MATLAB地图工具箱学习总结(四)自定义投影
这是本系列的最后一篇文章,准备给大家讲讲自定义投影怎么做。在做这项作业的时候,自己也是花了不少时间,将所有地图投影源文件都看了一遍,简单分析了一下源代码,就开始着手修改了。虽然也曾画出了一些奇形怪状的“艺术品”,但最终还是找到了画图的一些诀窍,使得自定义出来的投影即使会有bug,但大体上还算能看得过去。
在这里呢,我就想以最简单的一个地图投影源文件开始介绍怎么修改。
首先,让我们找到自己MATLAB安装目录,依次点击toolbox->map->mapproj目录,可以看到,里面是各种各样地图投影的源代码m文件呢。

然后咱们就点开一个来看看。源代码有复杂的,也有简单的,这里我们点开一个最简单之一的代码看看:正射投影ortho



接下来就要简单分析一下代码。
第一段主要是调用3个需要的函数,包括orthoDefault,orthoFwd,orthoInv,设置投影的基本类型,最后applyProjection根据投影的类型,进行投影。
所有的源代码中都会有Default、Fwd、Inv三个函数。让我们先看看Default函数。可以看到,传入了一个mstruct,这个在第三篇中讲到了,是投影的性质设置。这里设置了几个参数,其中fromDegrees设置了地图投影显示范围,这里纬度是从负无穷89度,经度是从-180度到180度。mapparallels则可以设定地图的标准纬线。方位投影没有标准纬线,因此我们看到这里nparallels为0,mapparallels为空。
接下来的Fwd函数就是最重要的投影变换正解函数了。我们看到这个函数传入了三个值,分别是我们刚刚设定好的mstruct,rng和az。方位投影大多使用球面极坐标系。因此,rng和az的含义就很容易明白了,rng是天顶距,而az则是方位角。通过和书上正射投影的公式对比,可以发现两者形式很相似,仔细分析便能明白,在MATLAB中,x和y与书上的xy正好相反,而这里的a正是地球椭球体的半径。这里用到了一个函数ellipsoidprops,并不是MATLAB中可以找到的函数,那么就应该是一个隐藏的函数。事实上,这个函数在各个投影中都会见到,而其真身则同样在mapproj文件夹下,不过是在private文件夹中。但不管怎么样,现在可以推出,这个函数所获得的第一个值为地球椭球体半径。
Inv函数和Fwd函数相反,是投影变换的反解函数公式。在这里可以不做修改。
这样,当我们需要自定义投影的时候,只需要将投影公式替换Fwd中的公式即可。
接下来我们再打开一个稍微复杂一点的看看:墨卡托投影mercator

我们将代码拉到最后,会发现和正射投影相比,这里多了一个函数:deriveParameters。事实上,大多数的地图投影源文件都会带这个函数,这个函数用来求一些需要的参数。我们看一下代码,这里又用到了ellipsoidprops函数,但不同的是,这里还有一个e,也许是离心率。因此我最终还是找到了这个函数的代码,看了一下。

从这段代码可以看出,a是椭圆的半长轴,ecc是椭圆的离心率。接下来的代码中有toRadians和convertlat,分别是角度转弧度和纬度转换。最终获得了标准纬线的弧度值,并传回Fwd中进行计算。接下来的步骤就和前面相似了。
需要注意的是,不同地图投影中的Fwd函数传入的值不同,有的是Lat和Lon,有的是lambda和phi,有的是rng和az,所以需要仔细确认到底传入的是什么值,再进行计算。
当公式写完之后,需要将投影注册,才能和其他的投影一样进行显示。这里需要看maplist文件。打开后大家便会明白为什么要这么做了。

我们只需要仿照前面的格式,将我们投影的名称、类别等四个参数设置好,再将我们自己的投影文件保存在mapproj文件夹下即可。为了验证注册成功,还可以和我第一篇说的那样,在命令行输入maps查看最后是否有添加成功,然后就可以愉快地用自己的投影了。
当然,真正的自定义投影设置过程中可能还会有各种各样的错误,就像我一开始展示出的那几幅图一样。所以大家只能不断地修改参数,如果一个地图模版不行,再换一个模版。在选择自定义投影的模版时,一定要选择相似的投影。现在我这里展示的不过是一些简单的投影文件,可能只有50行左右的代码,而一些复杂的投影可能会有100-200行的代码量,因此分析起来还是会存在很多的困难。对于Fwd函数传入的参数也一定要理解清楚究竟代表什么意思,然后才能知道究竟计算什么值,返回什么值。
最后,再给大家分享几个我自己做的自定义投影图片。
桑逊投影:

乌尔马耶夫投影:

金兹布尔格投影:

三叶梅花投影:

除了MATLAB自带的工具箱之外,还有一个m_map第三方工具箱可以用。只要细细研读其帮助文档,即可画出更多自己想要的地图。在这里就不一一介绍了。
随着课程的结束,本系列关于MATLAB地图投影的学习总结也就算完结了。在我的学习过程中,所能反馈的信息不过是感觉自己需要弥补、扩充的知识点实在太多。即使是我现在所讲述和介绍的一些方法技巧,还是能够感受到很多地方自己仍然不懂。因此我的这四篇简短的介绍中也会存在错误,倘若发现了错误,希望能够告知,谢谢!
天靖居士
2016.5.16
PS:6.11免考95分~
8.17更新说明:具体代码请参考:https://git.oschina.net/kkyyhh96/MapProjectInMatlab
MATLAB地图工具箱学习总结(四)自定义投影的更多相关文章
- MATLAB地图工具箱学习心得(二)设计可变参数和位置拾取的“放大镜”式投影程序
最近刚好因为一些原因整理这方面的内容,所以还是把这篇鸽了一年多的博客顺手写出来了∠( ᐛ 」∠)_.因为是当时课程设计的一部分,程序上难免会有一些不足和bug,在这里将设计的思路分享给大家. 本篇博客 ...
- MATLAB地图工具箱学习心得(一)关于地图分带投影的拼接
关于matlab地图投影系列: MATLAB地图工具箱学习心得(二)设计可变参数和位置拾取的"放大镜"式投影程序 --- 本学期的地图投影课程已经结束了,这篇博客用于记录自己在学习 ...
- MATLAB地图工具箱学习总结(三)地图工具箱的基本知识
MATLAB地图工具箱学习总结(三)地图工具箱的基本知识 今天想要介绍的是一些比较基础的函数.了解了这些函数,地图投影的基本概念才能真正明白.而要想继续研究MATLAB中有关地图投影的函数,尤其是未来 ...
- MATLAB地图工具箱学习总结(二)大圆和恒向线
MATLAB地图工具箱学习总结(二)大圆和恒向线 今天要和大家谈一谈大圆.恒向线航道的画法.还是先从案例开始说起,再分别介绍相关的函数. 1 作业案例:地图投影作 ...
- MATLAB地图工具箱学习总结(一)从地图投影说起
MATLAB地图工具箱学习总结(一)从地图投影说起 前言 本学期地图投影课上,李连营老师建议我们使用MATLAB完成每周的作业.从大二上学期开始接触MATLAB学习数学运算和地理数据处理的我,自然不会 ...
- MATLAB 地图工具箱 m_map 的安装和入门技巧(转)
reference: http://blog.sina.com.cn/s/blog_8fc890a20102v6pm.html 需要用一些地图工具,arcgis懒得装了,GMT(generic m ...
- Matlab神经网络工具箱学习之一
1.神经网络设计的流程 2.神经网络设计四个层次 3.神经网络模型 4.神经网络结构 5.创建神经网络对象 6.配置神经网络的输入输出 7.理解神经网络工具箱的数据结构 8.神经网络训练 1.神经网络 ...
- Matlab神经网络工具箱学习之二
螃蟹的分类 这个例子的目的是根据螃蟹的品种.背壳的长宽等等属性来判断螃蟹的性别,雄性还是雌性. 训练数据一共有六个属性: species, frontallip, rearwidth, length, ...
- AngularJS学习笔记(四) 自定义指令
指令(directive)是啥?简单来说就是实现一定功能的XXX...之前一直用的ng-model,ng-click等等都是指令.当我有一个ng没提供的需求的时候,就可以自定义个指令.指令的好处显而易 ...
随机推荐
- 随手记一次用C#正则表达式获取下拉菜单html标签<select>以及相关属性值
随手记一次用C#正则表达式获取下拉菜单html标签<select>以及相关属性值 1:有如下html: .................. <select id="aaa ...
- 阻止网页内部滚动条mousewheel事件冒泡
function preventScroll(id){ var _this = document.getElementById(id); if(navigator.userAgent.indexOf( ...
- Issue 7: 网络in action
网络运维基础 基础参数 配置:IP,子网掩码,网关,dns服务器,dhcp服务器 基础应用 在网关设置上搭建VPN组网 改host文件 单台主机原则上只能配置一个网关 协议 协议是全球都遵守的一套编码 ...
- 对bootstrap中confirm alert进行封装
HTML: <!-- system modal start --> <div id="ycf-alert" class="modal"> ...
- 只需三步--轻松反编译Android Apk文件
安卓程序是通过java语言进行编写的,可以很容易进行反编译.很多apk文件被反编译后再二次打包,就成了自己的产品,很是流氓.下面我们来看看如何进行apk的反编译,以及常用的防反编译手段. 一.反编译A ...
- (转)小心FPGA的JTAG口(上电和下电顺序)
同志们,根据ALTERA官方FAE(现场应用工程师)的强烈建议,请注意不要随意带电插拔你的JTAG下载接口,否则会损坏FPGA芯片的JTAG口信号管脚.现象:在排除了下载线的问题后,还是不能访问FPG ...
- TCP/IP、Http、Socket的区别
1.标准网络层次 网络由下往上分为:物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 下面的图表试图显示不同的TCP/IP和其他的协议在最初OSI模型中的位置: 7 应用层 例如HTTP. ...
- 计蒜客A
联想公司最近要设计一个体现公司文化的 logo.联想的设计师想出了一个方案:先画了一个顶点 O,接着画出以顶点 O 为公共顶点的.夹角为 θ的两条线段 l1 和 l2 其中 l1作为圆 C1的 ...
- 总结Android中遇见的OOM
一 .Android应用中内存泄漏几种的原因: 1.单例模式导致的内存泄漏: 当调用getInstance时,如果传入的context是Activity的context.只要这个单例没有被释放,这个A ...
- UVALive 7147 World Cup(数学+贪心)(2014 Asia Shanghai Regional Contest)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...