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. 使用sql server 链接服务器

    在我们的日常应用场景中经常会碰访问不同服务器上的数据库,即跨服务器访问操作不同的服务器上的SQL Sever数据库, 这个时候Sql Server的链接服务器就非常实用,创建SQL语句如下: --重新 ...

  2. 如何修改MyEclipse项目的web context-root

    修改一个MyEclipse项目的名称很容易,右键点项目->rename就行了. 但此时项目的web context-root 还没有改变,需要右键点项目->properties->M ...

  3. Spring与ActiveMQ整合

    Spring提供了对JMS的支持,需要添加Spring支持jms的包,如下: <dependency> <groupId>org.springframework</gro ...

  4. JAVASE02-Unit04: 集合框架 、 集合操作 —— 线性表

    Unit04: 集合框架 . 集合操作 -- 线性表 操作集合元素相关方法 package day04; import java.util.ArrayList; import java.util.Co ...

  5. DOS命令追加符的使用

    @echo off start \\192.168.10.120\常用软件\系统工具\远程客户端\winvnc.exe #打开共享的远程客户端程序 ipconfig /all > d:\disp ...

  6. Docker入门简介

    Docker的概念 什么是Docker? Docker是一个开源平台,包含:容器引擎和Docker Hub注册服务器 Docker容器引擎:可以将开发者打包他们的应用和依赖包到一个可一直的容器中,然后 ...

  7. 【Xpath学习】xpath都不会,说什么你做网站自动化测试的?

    嗯我确实不太会.感觉我写的随笔很渣,不一定对,大家不要被我误导了,最好不要看.我也尽量保证写出来都是对的. 首先这俩给我搞晕了 1. // 不管层级:  相对路径 2. /  care 层级: 表示到 ...

  8. 解决:IntelliJ IDEA 编译错误,提示 Compilation failed: internal java compiler error

    原因可能是项目指定的JDK与当前环境JDK不符合,解决办法:File->Setting->Compiler->Java Compiler, 在相应的module中选择合适的JDK版本 ...

  9. 安装hive+mysql

    1.源码安装mysql 以root用户首先安装libaio-0.3.104.tar.gz tar zxvf libaio-0.3.104.tar.gz cd libaio-0.3.104 make p ...

  10. 【MongoDB for Java】Java操作MongoDB

    上一篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过 ...