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地图工具箱学习总结(四)自定义投影的更多相关文章

  1. MATLAB地图工具箱学习心得(二)设计可变参数和位置拾取的“放大镜”式投影程序

    最近刚好因为一些原因整理这方面的内容,所以还是把这篇鸽了一年多的博客顺手写出来了∠( ᐛ 」∠)_.因为是当时课程设计的一部分,程序上难免会有一些不足和bug,在这里将设计的思路分享给大家. 本篇博客 ...

  2. MATLAB地图工具箱学习心得(一)关于地图分带投影的拼接

    关于matlab地图投影系列: MATLAB地图工具箱学习心得(二)设计可变参数和位置拾取的"放大镜"式投影程序 --- 本学期的地图投影课程已经结束了,这篇博客用于记录自己在学习 ...

  3. MATLAB地图工具箱学习总结(三)地图工具箱的基本知识

    MATLAB地图工具箱学习总结(三)地图工具箱的基本知识 今天想要介绍的是一些比较基础的函数.了解了这些函数,地图投影的基本概念才能真正明白.而要想继续研究MATLAB中有关地图投影的函数,尤其是未来 ...

  4. MATLAB地图工具箱学习总结(二)大圆和恒向线

    MATLAB地图工具箱学习总结(二)大圆和恒向线 今天要和大家谈一谈大圆.恒向线航道的画法.还是先从案例开始说起,再分别介绍相关的函数. 1                    作业案例:地图投影作 ...

  5. MATLAB地图工具箱学习总结(一)从地图投影说起

    MATLAB地图工具箱学习总结(一)从地图投影说起 前言 本学期地图投影课上,李连营老师建议我们使用MATLAB完成每周的作业.从大二上学期开始接触MATLAB学习数学运算和地理数据处理的我,自然不会 ...

  6. MATLAB 地图工具箱 m_map 的安装和入门技巧(转)

    reference: http://blog.sina.com.cn/s/blog_8fc890a20102v6pm.html   需要用一些地图工具,arcgis懒得装了,GMT(generic m ...

  7. Matlab神经网络工具箱学习之一

    1.神经网络设计的流程 2.神经网络设计四个层次 3.神经网络模型 4.神经网络结构 5.创建神经网络对象 6.配置神经网络的输入输出 7.理解神经网络工具箱的数据结构 8.神经网络训练 1.神经网络 ...

  8. Matlab神经网络工具箱学习之二

    螃蟹的分类 这个例子的目的是根据螃蟹的品种.背壳的长宽等等属性来判断螃蟹的性别,雄性还是雌性. 训练数据一共有六个属性: species, frontallip, rearwidth, length, ...

  9. AngularJS学习笔记(四) 自定义指令

    指令(directive)是啥?简单来说就是实现一定功能的XXX...之前一直用的ng-model,ng-click等等都是指令.当我有一个ng没提供的需求的时候,就可以自定义个指令.指令的好处显而易 ...

随机推荐

  1. css初始化样式代码

    为什么要初始化CSS? CSS初始化是指重设浏览器的样式.不同的浏览器默认的样式可能不尽相同,所以开发时的第一件事可能就是如何把它们统一.如果没对CSS初始化往往会出现浏览器之间的页面差异.每次新开发 ...

  2. wdcp安装

    下载安装(ssh登录服务器,执行如下操作即可,需要用到root用户权限来安装)v3版本已经发布,更多可看论坛 wdCP v3版本讨论区更多安装请看 http://www.wdlinux.cn/bbs/ ...

  3. LoadRunner调用Oracle存储过程

    为了测试这个存储过程,我遥了一圈去做这个事情,这里说一下我自己接受到任务和自己开始是怎么想的. 方法一: 一开始我想着可以使用C#直接去调用存储过程,然后用Loadrunner调用C#的dll去测试, ...

  4. PHP无限极分类,多种方法|很简单,这里说的很详细,其它地方说的很不好懂

    当你学习php无限极分类的时候,大家都觉得一个字"难"我也觉得很难,所以,现在都还在看,因为工作要用到,所以,就必须得研究研究.   到网上一搜php无限极分类,很多,但好多都是一 ...

  5. python成长之路-----day1-----作业(登录程序和三级菜单)

    作业: 作业1:用户登录 1)程序说明: a.用户输入密码验证成功然后打印欢迎信息 b.如果密码错误,用户登录失败,提示用户,密码错误 c.用户输入密码错误3次,则用户锁定 d.当用户多次输入不存在的 ...

  6. iOS APP开发的小知识(分享)

          亿合科技小编发现从2007年第一款智能手机横空出世,由此开启了人们的移动智能时代.我们从一开始对APP的陌生,到现在的爱不释手,可见APP开发的出现对我们的生活改变有多巨大.而iOS AP ...

  7. Leetcode: Sentence Screen Fitting

    Given a rows x cols screen and a sentence represented by a list of words, find how many times the gi ...

  8. linux-------------计划任务crond:如何创建linux里面的计划任务

    1.centos下安装crond [root@localhost /]# yum -y install vixie-cron [root@localhost /]# yum -y install cr ...

  9. [总结] I/O输入,输出

    I/O输入,输出第一:先判断到底是输入还是输出,站在程序的立场第二:判断是传递字节,还是字符,决定管道粗细,字节流是最基本的数据输出管道.字符类型管道专门用来传送文本数据.Java流的四大父类:1.字 ...

  10. HDU 4509 湫湫系列故事——减肥记II(线段树-区间覆盖 或者 暴力技巧)

    http://acm.hdu.edu.cn/showproblem.php?pid=4509 题目大意: 中文意义,应该能懂. 解题思路: 因为题目给的时间是一天24小时,而且还有分钟.为了解题方便, ...