zoukankan      html  css  js  c++  java
  • MATLAB地图工具箱学习心得(一)关于地图分带投影的拼接

    关于matlab地图投影系列:

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

    ---

    本学期的地图投影课程已经结束了,这篇博客用于记录自己在学习当中的一些心得,也为了给遇到同样问题的人提供一些可参考的思路。当然,限于时间和本人的能力,文章中必然会出现一些错误,希望大家发现之后能够指正,谢谢。

    李老师为了加深我们对地图投影的理解,前后布置了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

    最终绘制出来的投影就相互拼接到一起了,让我们看一下效果。

  • 相关阅读:
    day77 vue对象提供的属性功能
    day76 作业
    day76 vue框架入门
    day75 bbs项目☞后台管理+修改头像
    day74 bbs项目☞点赞与评论
    day73 bbs项目☞基本功能实现
    day72 bbs项目☞登录注册
    练习题00
    雇1个人工作7天,你有1根金条可以分成7份,只能切2刀,如何保证每天都得到1份金条
    Python正课143 —— DRF 进阶4 权限、频率、过滤、排序
  • 原文地址:https://www.cnblogs.com/ssjxx98/p/11070375.html
Copyright © 2011-2022 走看看