利用MATLAB的Timer实现网络图片的定时下载

这个约每小时更新的GIF格式遥感图片为例:

MATLAB当前目录下新建一个.m脚本,本例里起名为wvgifdownload.m:

%图片存储目录设定:
folderpath=['d:\temp\'];

if length(dir([folderpath,'*.gif']))==0  %判断目录是否已有GIF文件
    urlwrite('http://www.goes.noaa.gov/dimg/jma/fd/wvblue/10.gif',[folderpath,'1.gif'],'timeout',15); %空目录则将下载的图片命名为1.gif
else %文件夹已有GIF文件
    localinfo=imfinfo([folderpath,num2str(length(dir([folderpath,'*.gif']))),'.gif']); %获取目录里最新GIF的文件信息
    webinfo=imfinfo('http://www.goes.noaa.gov/dimg/jma/fd/wvblue/10.gif');%获取目标网络图片的文件信息
    if localinfo.FileSize~=webinfo.FileSize %比较两者文件大小,若不一样,则表示网络图片已更新,可以下载
        urlwrite('http://www.goes.noaa.gov/dimg/jma/fd/wvblue/10.gif',['f:\CloudGIF\wv\',num2str(length(dir([folderpath,'*.gif']))+1),'.gif'],'timeout',15);
    end
end

设定Timer对象,这里起名为down:

down = timer                                 ...
(   'Name'          , 'my_timer'        ...
,   'TimerFcn'      , @(varargin)evalin('base','wvgifdownload')  ...
,   'BusyMode'      , 'drop'            ...
,   'ExecutionMode' , 'fixedRate'      ...
,   'Period'        ,  1800               ...
,   'StartDelay'    ,  0                ...
);

注意TimerFcn这里是调用当前目录脚本的写法,如果是函数则按函数调用去写。本例Period这里设定的是半小时执行一次,即每半小时检查网络图片是否更新,如有更新即可下载。

执行Timer:

start(down)

如何推广Telegram频道

新建立了一个MATLAB TIPS的Telegram频道,欢迎加入。

目前:

  • po了好些自己以前用到的现成脚本、函数,或前人写的技巧、教程、文档上去;
  • 基于RSS自动发布一些Matlab相关博客的最新日志链接
  • 欢迎作管理员共同打理,只要顺手把自己用上的网页url发上来就好。

建好后就经历了到处发小广告做宣传的过程,在此总结一番:

Telegram内宣传

電報群推廣

在这个TG群里发布频道链接,当频道订阅人数在50人以上时,将被推送至電報群組廣播频道;当频道订阅人数在50人以下时将暂时推送至電報新群推送頻道

TGCN-群组频道狼:yum:

这是TGCN-群组索引计划的bot。添加该机器人作频道管理员(任意权限),然后转发频道任一文字信息给机器人即可完成频道添加。频道马上会发布于其索引频道@zh_groups

频道/群组/机器人分享

号称Telegram上的hao123。入群发布频道链接,即可将频道加入其bot@hao1234bot的索引,可以在bot和群里搜索到。

Telegram Channels List

菜单点选注册新频道,然后将频道内容转发给该bot,选好频道分类即可。似乎是根据频道描述里的语言,把频道丢去中国频道列表channelList English。同时,频道亦发布于其网站channelist.ir

群組導航 - 分享/推廣

入群发布频道链接,群简介说将会被整理至频道群組導航

Telegram外宣传

Telegram Channels Catalog

国外的一个大型频道收集站,看起来和Telegram Bot Store是一家。用TG帐号登录后,即可添加频道。亦可用其bot添加频道,索引成功同样会出现在网站中,但bot添加的频道没有频道logo,所以推荐网站添加。似乎订阅人数较多的频道才会在其TG频道推广。

Telegram 蒐集君

一个以WordPress搭建的群组频道收集blog。以公共帐号登入后台,编写频道宣传文章,经管理员审核后即可出现在该blog上。

tlgrm.eu

进入频道分类页面,即可看到提交频道的加号按钮。似乎较多人订阅的频道方能显示。

tsear.ch

添加完显示:

Your channel will appear in our channels and search databases within the next 2 weeks.

应该是进入其网站和bot的索引。

inten.to

可以submit yours,但过多久收录未知。


Matlab:如何以线上点的颜色表示强度

Matlab是一款极其好用的数学计算绘图软件。在科研用图绘制功能中,最常见的即为绘制等值线图,这也是一般同学们都掌握的。大家都知道,二维填充等值线图的coutourf(X,Y,Z,n)中,Z=f(X,Y)是一个矩阵,代表X,Y平面上的每一个点对应的值,颜色则表示该值的高低。也就是说,用这个画出来的是一个彩色的面,比如:

coutourf

但是,如果Z是一维向量呢?如果我们手上就只有某些X,Y对应的Z值,也不能虚构其他的点值来添进,这时候我们想表示强度怎么办呢?用Plot3吗?没错Plot3确实可以,但3维图并不是很容易识别的。如果想以颜色表示该点某物理量的强度,那又怎么画呢?

本文就来告诉你,怎么实现点线中用点的颜色表示强度。科研中是会出现这种需要的,比方画卫星轨道、走航轨迹上一些诸如海表面高度、气溶胶浓度之类参量的时候。.

比方我们有三个一维向量:lon,lat,ssha,分别代表卫星高度计数据中的经度(microdegree)、纬度(microdegree)、海表面高度距平(cm)。用matlab散点图命令scatter即可达到我们的目的。命令格式是:

scatter(X,Y,<S>,<C>,'<type>');
<S> - 点的大小控制,设为和X,Y同长度一维向量,则值决定点的大小;设为常数或缺省,则所有点大小统一。
<C> - 点的颜色控制,设为和X,Y同长度一维向量,则色彩由值大小线性分布;设为和X,Y同长度三维向量,则按colormap RGB值定义每点颜色,[0,0,0]是黑色,[1,1,1]是白色。缺省则颜色统一。
<type> - 点型:可选filled指代填充,缺省则画出的是空心圈。

这样,我们就可以得到以经纬度点的颜色表示海表面高度距平的图,使用命令:

>>scatter(lon,lat,3,ssha);

得到图如下:

ssha-scs-topex/poseidon

似乎不是特别直观,那么我们再利用m_map地图工具,将陆地绘制上。此时要注意以下几点:

  1. m_map中经纬以十进制数目表示,不是度分秒形式,且东经为正,西经为负。数据的经纬度一定要符合此形式。
  2. m_map中投影地图的坐标并不是实际经纬,需要以m_ll2xy.m(就是longitude & latitude to x-y coordinates)将数据中的经纬转化为投影地图中可用的坐标。例如:>>[X,Y]=m_ll2xy(lon,lat);

命令实例:

>>hold on
>>m_proj('miller','lon',[0 250],'lat',[-80 80]);          % 设置投影、经纬
>>m_coast('patch',[.7 .7 .7],'edgecolor','none');     % 画岸界,填充大陆
>>m_grid('xlabeldir','end','fontsize',10);              % 显示网格,并显示label
>>scatter(lon,lat,3,ssha);

得图:

ssha-with-map

[教程完]其实很简单,但网络上关于这类画法的指导基本没有,所以稍稍写下,望能帮助到需要的人。