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. h5的离线缓存机制

    什么是Manifest: 其实Manifest是一个简单的 文本文件,它的扩展名是任意的,定义需要缓存的文件.资源,当第一次打开时,浏览器会自动缓存相应的资源. Manifest 的特点: 离线浏览: ...

  2. LeetCode Add Strings

    原题链接在这里:https://leetcode.com/problems/add-strings/ 题目: Given two non-negative numbers num1 and num2  ...

  3. c语言1

    1.c语言的执行过程: 源代码:source code,使用某种计算机语言书写的代码. 编译:compile 对源代码进行翻译的过程. 编译器:compiler 负责编译工具. gcc:一款通用的编译 ...

  4. python 调用封装好的模块

    有些时候,我们写了些通用的模块,想调用的时候,该怎么操作呢? 以下是我写的一个简单的登录作为例子: 在cla.py中定义了一个Login_gues.pyt(带参数的实例):在cc.py下调用这个; 1 ...

  5. 也谈微信小程序

      小程序是一种不需要下载安装即可使用的应用,它实现了应用"触手可及"的梦想,用户扫一扫或者搜一下即可打开应用.也体现了"用完即走"的理念,用户不关心是否安装太 ...

  6. [转]8年javascript知识点积累

    http://www.cnblogs.com/tylerdonet/p/5543813.html

  7. category用法

    1.今天在复习之前的category的时候,遇到一个这样子的问题.查来一下,原来苹果的官方文档中有说明,苹果时不提倡我们在类别中重写原文件的内容,如果要重写,就继承他,然后重写,但是在项目中,有很多前 ...

  8. Djunit工作记录

    1.下载djunit 解压后放置到eclipse的plugins目录下即可 2.测试程序必须继承DjunitTestCase 3.测试程序完run as DJunitTest 运行 4.在djunit ...

  9. 5.3监听请求:使用eclipse的tcp/ip工具(端口转换)

    1.改用wsdl文件生成响应文件 运行浏览器输入发布的地址,获得wsdl源码保存在项目路径下, 2.创建接口转换器,window-property-tcpip 客户端执行结果:

  10. Objective-C基础4

    1.强指针:默认的情况下所有的指针都是强指针,关键字__strong 弱指针:__week关键字修饰的指针 2.ARC:编译器将自动在代码合适的地方插入retain.release.autorelea ...