本学期的地图投影课程已经结束了,这篇博客用于记录自己在学习当中的一些心得,也为了给遇到同样问题的人提供一些可参考的思路。当然,限于时间和本人的能力,文章中必然会出现一些错误,希望大家发现之后能够指正,谢谢。
李老师为了加深我们对地图投影的理解,前后布置了11次作业。本学期的作业内容大致可分为以下四类:
一是概念描述类,通过文字描述加深对定义、方法、意义等概念的理解。
二是计算推导类,借助 matlab 计算地球上某些参数或推导投影的某些性质。
三是利用 matlab mapping toolbox 工具绘制投影和分析变形。
四是利用 matlab 设计地图投影的 GUI 程序 。
在此,将本学期的 11 次作业按照先后顺序列出:
作业一:
简述平行投影和中心投影的定义,区别与联系
作业二:
计算任意纬度的子午圈曲率半径,卯酉圈曲率半径和平均曲率半径,并分析其随纬度变化规律
作业三:
(1)计算从赤道到纬度线 10°、20°······90°的子午线弧长
(2)计算从纬度线 10°、20°······90°的纬圈半径
(3)计算从赤道起算的话10°×10°的球面梯形面积(扩展:计算任意球面梯形面积,并分析其分布规律)
(4)当计算用于中国全图的某一斜方位投影,确定中心点 Q 的 phi=30°N,lambda=105°E,经纬网密度为 5°,计算 alpha 和 Z
(5)什么是球面坐标系,有何意义?
(6)地理坐标如何转变到球面极坐标系?
(7)确定新极点的方法有哪些?
作业四:
判断投影方程 x=R*phi,y=R*lambda 的投影性质(扩展:在 matlab 中设计程序,用以判断任意方程的投影性质)
作业五:
推导抛物型、双曲型、椭圆型投影与等角、等面积、等距离投影的关系
作业六:
(1)推导说明等面积和等距离方位投影为何不存在割投影
(2)分别绘制正轴、横轴、斜轴的等角、等面积、等距离方位投影,并进行变形分析
作业七:
(1)绘制武汉到伦敦的大圆航线、恒向线以及混合航线,并进行比较
(2)分别绘制正轴、横轴、斜轴的等角、等面积、等距离圆柱投影,并进行变形分析
作业八:
(1)分析中国地图正轴等角割圆锥投影的标准纬线变化的影响
(2)分别绘制正轴、横轴、斜轴的等角、等面积、等距离割圆锥投影,并进行变形分析
作业九:
(1)计算比较经度 0°-6°,纬度 0°-4°的球面梯形面积、高斯-克吕格投影面积、UTM 投影面积以及双标准经线等角横圆柱投影面积
(2)高斯-克吕格投影变形分析及其分带拼接
(3)UTM 投影变形分析及其分带拼接
作业十:
(1)自定义绘制伪投影,并进行变形分析
(2)利用滑块等控件实现 m、n 参数动态变化的扁圆等面积投影程序
作业十一:
设计“放大镜”式的等距离方位投影 matlab 程序,实现“放大镜”随鼠标选点而移动,调节放大镜范围,缩放比例等功能。
作业中的前面一些部分作为比较常规的题目,例如曲率半径等参数计算,在matlab中直接带入公式即可,当然也可以参考https://www.cnblogs.com/kkyyhh96/p/5405968.html这几篇博客利用工具箱进行计算。这篇文章的作者相当详细地总结了matlab mapping toolbox的使用技巧(不得不说学长真的太厉害了!),所以一些基础的部分,投影绘制、变形分析、各种航线、自定义投影之类的知识这里就不过多讨论了。我们从最后几个作业入手,谈谈利用matlab实现地图投影应用和设计地图投影程序的技巧。
一、 谈谈分带投影和分带拼接
写的时候本来只想谈谈matlab地图投影程序设计,但是转念一想,分带投影的拼接似乎没有其他博客记录过,这也是李老师布置的作业中的一个重点,所以就在这里提一下,提供一种思路。
首先将高斯-克吕格投影按6度带投影,为了便捷起见,只拼接从中央经线为3°的位置开始的前10个带。若需要拼接60个带,或者拼接3°带以此类推。
这里所谓拼接,就是将所有的分带拼到一起形成教材上那种连续的带状的地图。分带思想就是同一个显示区域显示多个带的投影图像,这让我们很自然地想到利用函数subplot。
然而subplot函数呈现的子图之间有着让人无法忍受的间距,如果直接用于拼接地图,既不美观也不符合要求。为此,我们需要利用自定义子图间距的方式展现每幅子图。
function ha = tight_subplot(Nh, Nw, gap, marg_h, marg_w)
%Nh 为行数,Nw为列数
%gap为间距向量(h,w)
%marg_h(up,down)边界
%marg_w(left,right)边界
%h(ii)代表每一个图幅,在主函数中调用
if nargin<3; gap = .02; end
if nargin<4 || isempty(marg_h); marg_h = .05; end
if nargin<5; marg_w = .05; end
if numel(gap)==1;
gap = [gap gap];
end
if numel(marg_w)==1;
marg_w = [marg_w marg_w];
end
if numel(marg_h)==1;
marg_h = [marg_h marg_h];
end
axh = (1-sum(marg_h)-(Nh-1)*gap(1))/Nh;
axw = (1-sum(marg_w)-(Nw-1)*gap(2))/Nw;
py = 1-marg_h(2)-axh;
ha = zeros(Nh*Nw,1);
ii = 0;
for ih = 1:Nh
px = marg_w(1);
for ix = 1:Nw
ii = ii+1;
ha(ii) = axes('Units','normalized', ...
'Position',[px py axw axh], ...
'XTickLabel','', ...
'YTickLabel','');
px = px+axw+gap(2);
end
py = py-axh-gap(1);
end
UTM投影的拼接过程与高斯投影是一样的,让我们看一下拼接所用到的代码。记得要设置当前绘图区域gca不可见
set(gca,'Visible','off')
否则投影的每一个带都会有一个白色背景图框,相互遮盖看起来非常丑。
%UTM拼接
ha=tight_subplot(1,10,[-0.11 -0.11],[0.01 0.01],[0.35 0.35])
for ii=1:10
set(0,'defaultfigurecolor','w')
axes(ha(ii));
axesm ('unitranmerc','frame','on','origin',[0 183+6*ii 0],'flonlimit',[-3,3]);
%flatlimit控制投影的纬度范围,flonlimit控制经度范围,均为相对值
geoshow(landareas,'FaceColor',[0.5 1 0.5],'EdgeColor',[.6 .6 .6]);
set(gca,'Visible','off')
end
最终绘制出来的投影就相互拼接到一起了,让我们看一下效果。
标签:10,地图投影,学习心得,投影,拼接,MATLAB,作业,工具箱,matlab
来源: https://www.cnblogs.com/ssjxx98/p/11070375.html