主要内容

合成和动画Web地图服务(WMS)气象层

此示例演示如何合成来自多个Web地图服务(WMS)层的数据并设置其动画。

底层来自NASA戈达德太空飞行中心的科学可视化工作室(SVS)图像服务器。该层中的数据显示2005年8月23日至8月30日卡特里娜飓风期间的卫星云数据。该层由从GOES-12图像提取的云数据组成,并覆盖在美国东南部的彩色图像上。

下一代雷达(NEXRAD)图像,由爱荷华州立大学的爱荷华环境Mesonet (IEM)网络地图服务器收集,与云数据定期合成。

特别是,本示例将向您展示如何:

  • 使用WMS数据库查找Katrina和NEXRAD图层

  • 在特定时间步从WMS服务器检索卡特里娜基本地图

  • 同时从WMS服务器检索NEXRAD映射

  • 将基本地图与包含NEXRAD图像的地图合成

  • 在投影坐标系统中查看合成地图

  • 检索、合成和动画多个时间序列

  • 创建动画的视频文件和动画GIF文件

理解WMS基本术语

如果您是WMS新手,请务必理解以下几个关键概念,并在此处列出。

  • 网络地图服务---开放地理空间联盟(OGC)将网络地图服务(WMS)定义为“从地理信息动态生成空间参考数据地图”的实体

  • WMS服务器---遵循OGC指导原则渲染地图并将其返回给客户端的服务器

  • 地图——OGC对地图的定义是“将地理信息描绘成适合在电脑屏幕上显示的数字图像文件。”

  • ---一种特定类型地理信息的数据集,如温度、海拔、天气、正射影像、边界、人口统计、地形、交通、环境测量以及来自卫星的各种数据

  • 能力文件——XML文档,包含描述服务器提供的地理内容的元数据

源函数

在这个函数中可以找到这个例子中的代码:

函数mapexwmsanimate(使用互联网、数据目录)

互联网接入

由于WMS服务器位于Internet上,因此可以将此示例设置为访问Internet以从WMS服务器动态渲染和检索地图,也可以将其设置为使用以前使用WMS功能从Internet检索但现在存储在本地文件中的数据。你可以使用一个变量,useInternet,以确定是从本地存储的文件读取数据,还是从Internet检索数据。

如果useInternet如果将标志设置为true,则必须建立Internet连接才能运行该示例。请注意,WMS服务器可能不可用,并且可能需要几分钟才能返回映射。使用WMS服务器的挑战之一是有时会遇到服务器错误。函数,如wmsread,如果服务器不可用,可能会超时。通常,这是一个临时问题,如果稍后再尝试,您将能够连接到服务器。有关常见问题和解决这些问题的策略的列表,请参阅Mapping Toolbox™用户指南中的“WMS服务器的常见问题”一节。

您可以在第一次运行示例时将数据存储在本地,然后设置useInternet国旗为false。如果useInternet标志未定义,它被设置为false。

如果~ (“useInternet”,“var”) useInternet = false;结束

设置:定义数据目录和文件名实用程序函数

这个例子将数据写入文件useInternet真正的或从文件中读取数据,如果useInternet. 它使用变量datadir表示包含数据文件的文件夹的位置。

如果~ (“数据目录”,“var”) datadir = fullfile(matlabroot,“例子”,“地图”,“数据”);结束如果~存在(datadir“dir”mkdir (datadir)结束

定义一个匿名函数作为前缀datadir输入文件名:

datafile=@(文件名)fullfile(datadir,文件名);

步骤1:从本地数据库中查找卡特里娜层

使用WMS的一个更有挑战性的方面是找到一个WMS服务器,然后找到您感兴趣的层。找到包含所需数据的服务器,并构建具有所有相关细节的特定且通常复杂的URL的过程可能非常令人生畏。

映射工具箱™ 通过使用功能提供本地、已安装和预鉴定的WMS数据库(可搜索),简化查找WMS服务器和层的过程wmsfind.您可以在数据库中搜索您感兴趣的层和服务器。下面是如何找到包含该术语的层卡特里娜飓风无论是在层名称LayerTitle数据库的字段:

卡特里娜= wmsfind (“卡特里娜”);谁卡特里娜飓风
名称大小字节类属性katrina 34x1 16754 WMSLayer

对术语的搜索“卡特里娜”返回一个WMSLayer数组包含多个层。要检查单个层的信息,只需像这样显示它:

卡特里娜飓风(1)
ans=WMSLayer属性:索引:1服务器标题:“NASA SVS图像服务器”服务器URL:'https://svs.gsfc.nasa.gov/cgi-bin/wms?“LayerTitle:”卡特里娜飓风GOES-12图像:长波红外特写(1024x1024动画)““LayerName:”3216_22510; 22510”Latlim:[15.0000 45.0000]Lonlim:[-100.0000-70.0000]

如果你的类型,卡特里娜飓风,则显示数组的全部内容,并在输出中包含每个元素的索引号。这种显示使您可以轻松地快速检查整个数组,搜索感兴趣的层。您只能显示LayerTitle属性,执行以下命令:

disp(卡特里娜飓风,“属性”,“layertitle”,“指数”,“关闭”,“标签”,“关闭”);

正如您所发现的,搜索通用词“卡特里娜”返回多个层的结果,您只需要选择一个层。一般来说,一个搜索甚至可能返回数千层,这些层可能太大了,无法单独查看。而不是再次搜索数据库,您可以使用完善方法WMSLayer类。使用完善方法比。方法更有效,返回结果更快wmsfind因为搜索范围已经缩小到一个较小的集合。提供查询字符串,“卡特里娜goes-12 * *可见*近* *动画的,致完善方法返回一个WMSLayer数组,其元素在LayerTitle层名称属性*字符表示通配符搜索。如果返回多个条目,只选择svs.gsfc.nasa.gov服务器上的第一个条目。

卡特里娜=提炼(卡特里娜飓风,“卡特里娜goes-12 * *可见*近* *动画的);卡特里娜=精炼(卡特里娜,“svs.gsfc.nasa.gov”,“Searchfield”,“serverurl”);卡特里娜飓风卡特里娜= (1);谁卡特里娜飓风
名称大小字节类属性卡特里娜1x1 466 WMSLayer

步骤2:同步WMSLayer对象和服务器

数据库只存储层信息的一个子集。例如,来自层的抽象信息、关于层的属性和样式信息的详细信息以及层的坐标参考系统不返回wmsfind.要返回所有信息,您需要使用wmsupdate函数。wmsupdate将数据库中的层与服务器同步,填充层中缺失的属性。

同步第一卡特里娜飓风与服务器分层以获取抽象信息。由于此操作需要访问Internet,请调用wmsupdate除非useInternet国旗是正确的。

cachefile =丢失(“katrina.mat”);如果/ / / / / / / / / /如果~exist(缓存文件,“文件”)保存(cachefile“卡特里娜”)结束其他的缓存=负载(cachefile);卡特里娜= cache.katrina;结束

显示图层的抽象信息。使用isspace帮助确定文本的换行位置。

抽象=卡特里娜。抽象;endOfLine=查找,‘cntrl’), 1);文摘= (1:endOfLine);numSpaces = 60;(~isempty(abstract))k=find(isspace(abstract));n=查找(k>numSpaces,1);如果~ isempty (n)流(“% s \ n”,摘要(1:k(n)))摘要(1:k(n))=[];其他的fprintf(“% s \ n”抽象的,抽象的=''结束结束
GOES-12卫星位于西经75度,赤道上空36000公里的高度,在地球同步轨道上。在这个位置上,它的成像仪用几个波长为整个北美和南美的云层模式拍照,这是天气预报中主要的测量方法。这台成像仪一整天都用不同波长拍摄地球部分地区的图像,这些测量在天气预报中至关重要。这个动画展示了在卡特里娜飓风穿过墨西哥湾期间,GOES-12可见光波长从0.52到0.72微米的每日序列图像。在一公里分辨率下,可见波段测量是来自成像仪的最高分辨率数据,这解释了这些图像的非常高的细节水平。在这个动画中,云数据是从GOES图像中提取出来的,并覆盖在美国东南部的背景彩色图像上。

请注意,此抽象信息(包括任何印刷问题和不完整的片段)是直接从服务器获得的。

步骤3:探索卡特里娜图层细节

你可以找到更多关于卡特里娜飓风通过探索细节财产的卡特里娜飓风层。这个细节。属性字段通知您该层具有固定的宽度和高度属性,因此无法修改请求的地图的大小。

katrina.Details.Attributes
ans=带字段的结构:可查询:0级联:0不透明:1无子集:1固定宽度:1024固定高度:1024

这个细节。维度字段通知您该层具有时间

katrina.Details.Dimension
ans = struct with fields: Name: 'time' Units: 'ISO8601' UnitSymbol: " Default: '2005-08-30T17:45Z' MultipleValues: 0 NearestValue: 0 Current: 0 Extent: '2005-08-23T17:45Z/2005-08-30T17:45Z/P1D'

在一定程度上2005 - 08 - 23 - t17:45z2005 - 08 - 30 - t17:45z有一段时间P1D(一天),如Details.Dimension.Extent字段。

卡特里娜·细节·维度·范围
ans = ' 2005 - 08 - 23 t17:45z / 2005 - 08 - 30 - t17:45z / P1D '

步骤4:从服务器检索Katrina Map

现在您已经找到了感兴趣的图层,可以使用函数检索光栅地图wmsread并使用该功能显示地图geoshow. 自从时间读取层时未指定,默认时间为2005 - 08 - 30 - t17:45z,将按照Details.Dimension.Default字段。如果useInternet标志设置为true,然后将图像和引用矩阵缓存到GeoTIFF文件中。

cachefile =丢失(“katrina.tif”);如果useInternet [katrinaMap,R] = wmsread(katrina); / /当前位置如果~exist(缓存文件,“文件”)geotiffwrite(缓存文件,卡特里娜地图,R)结束其他的[katrinaMap R] = readgeoraster (cachefile);结束

显示katrinaMap然后叠加数据usastatehi.shp文件。

状态=可读取(“usastatehi.shp”);图usamap(卡特里娜飓风。geoshow(katrinaMap,R) geoshow(states,“FaceColor”,“没有”)标题({卡特里娜。LayerTitle,katrina.Details.Dimension.Default},...“翻译”,“没有”)

第五步:找到NEXRAD雷达层

美国的NEXRAD雷达图像存储在爱荷华州立大学的IEM网络地图服务器上。服务器方便地以5分钟的增量存储NEXRAD图像1995-01-01到目前为止。您可以通过首先搜索术语来查找图层IEM WMS服务ServerTitle字段,然后通过请求感兴趣的层来细化搜索,nexrad-n0r-wmst

iemLayers = wmsfind (“IEM WMS服务”,“SearchField”,“servertitle”);nexrad=精炼(多层,“nexrad-n0r-wmst”);

将层与服务器同步。

cachefile =丢失(“nexrad.mat”);如果使用因特网nexrad = wmsupdate(nexrad);如果~exist(缓存文件,“文件”)保存(cachefile“nexrad”)结束其他的cache=load(cachefile);nexrad=cache.nexrad;结束

步骤6:获取Extent参数

复合了nexrad层的卡特里娜飓风层,您需要获得nexrad层在巧合的时间周期,和并行的地理和图像范围。这个细节。维度字段告诉你该层有一个时间维度,

nexrad.Details.Dimension
ans = struct with fields: Name: 'time' Units: 'ISO8601' UnitSymbol: " Default: '2006-06-23T03:10:00Z' MultipleValues: 0 NearestValue: 0 Current: 0 Extent: '1995-01-01/2011-12-31/PT5M'

Details.Dimension.Default字段通知您图层的时间范围包括秒。

nexrad.Details.Dimension.Default
ans='2006-06-23T03:10:00Z'

获得一个时间值与卡特里娜飓风层,并将秒添加到时间规格。

nexradTime=[katrina.Details.Dimension.Default(1:end-1): 00 z的];

分配latlimlonlim变量来指定nexrad层。将值设置为卡特里娜飓风分层以使地理区域匹配。请注意nexrad图层的南纬限制并没有延伸到最南边卡特里娜飓风层的南纬界限。的地理边界四边形外的值nexrad图层设置为背景色。

fprintf(“%s%d\n”,“NEXRAD层的南纬限值:”, nexrad.Latlim(1))流(“%s%d\n”,卡特里娜飓风的南纬极限katrina.Latlim (1))
NEXRAD层南纬界限:24 Katrina层南纬界限:10
latlim = katrina.Latlim;lonlim = katrina.Lonlim;

分配成像高度图像宽度变量。

imageHeight = katrina.Details.Attributes.FixedHeight;imageWidth = katrina.Details.Attributes.FixedWidth;

第七步:从服务器检索NEXRAD雷达地图

您可以检索nexradMap来自服务器,与katrinaMap对于相同的地理区域和图像区域,通过向wmsread函数。为了准确地从地图上检索雷达信号,设置ImageFormat参数/ png图像格式。为了方便地从背景中检索信号,将背景颜色设置为黑色((0 0 0)).

取回nexradMap

黑色= [0 0 0];cachefile =丢失(“nexrad.tif”);如果使用互联网[nexradMap,R]=wmsread(nexrad,...“拉特林”latlim,“隆林”,隆林,“时间”nexradTime,...“写成BackgroundColor”、黑色、“ImageFormat”,“图像/png”,...“图像高度”imageHeight,“图像宽度”, imageWidth);如果~exist(缓存文件,“文件”) geotiffwrite (cachefile nexradMap右)结束其他的[nexradMap,R]=readgeoraster(缓存文件);结束

显示nexradMap

图usamap(latlim,lonlim) geoshow(nexradMap,R)“FaceColor”,“没有”,“EdgeColor”,[0.9 0.9 0.9])标题({nexrad.layertite,nexradTime},“翻译”,“没有”);

第8步:合成NEXRAD雷达地图和卡特里娜地图

复合了nexradMap有一份katrinaMap,则需要识别图像中的非背景像素nexradMap.这个nexradMap由于web地图服务器的处理方式,数据以类double的图像形式返回PNG格式,所以您需要将其转换为uint8在合并之前。

识别图像的像素nexradMap不包含背景色的图像。

阈值=0;索引=任何(nexradMap>阈值,3);索引=repmat(索引[1 3]);

复合的nexradMapkatrinaMap

结合= katrinaMap;组合(索引)= uint8 (nexradMap(指数)* 255);

显示合成的地图。

图usamap(拉特利姆、隆利姆)地理展示(组合,R)地理展示(州,“FaceColor”,“没有”)标题({“12张卡特里娜飓风的图像”,...“与NEXRAD雷达合成”,nexradTime})

步骤9:初始化变量以设置Katrina和NEXRAD地图的动画

下一步是初始化变量,以便为合成的对象设置动画卡特里娜飓风nexrad地图。

创建包含时间范围的变量卡特里娜飓风层。

范围=katrina.Details.Dimension.extent;斜线='/';slashIndex = strfind(程度上削减);开始时间=程度(1:slashIndex (1) 1);endTime =程度(slashIndex (1) + 1: slashIndex (2) 1);

计算开始日和结束日的数值。请注意,时间范围为yyyy-mm-dd格式。

连字符='-';hyphenIndex = strfind(开始时间,连字符);dayIndex = [- 1, - 2];startDay = str2double(开始时间(dayIndex));endDay = str2double (endTime (dayIndex));

分配初始katrinaTime

卡特里娜飓风时间=开始时间;

由于动画需要多个对服务器的请求,因此使用WebMapServerWMSMapRequest类。

构造一个WebMapServer对象,用于每个层的服务器。

nasaServer=WebMapServer(katrina.ServerURL);iemServer=WebMapServer(nexrad.ServerURL);

创建WMSMapRequest对象。

= WMSMapRequest(katrina, nasaServer);nexradRequest = WMSMapRequest(nexrad, iemServer);

分配属性。

nexradRequest.Latlim=Latlim;nexradRequest.Lonlim=Lonlim;nexradRequest.BackgroundColor=black;nexradRequest.ImageFormat=“图像/png”;nexradRequest.ImageHeight=ImageHeight;nexradRequest.ImageWidth=ImageWidth;

步骤10:创建动画文件

当浏览器打开动画GIF或AVI视频文件时,可以在浏览器中查看动画。要创建WMS基图和矢量覆盖的动画帧,创建每天的循环,从startDayendDay,并取得katrinaMapnexradMap那一天。将这些地图合成为单个图像,显示图像,检索帧,并将结果存储到AVI文件的一帧和GIF动画文件的一帧中。

要与他人共享或发布到web视频服务,请使用创建包含所有帧的AVI视频文件VideoWriter类。

videoFilename=fullfile(pwd,“wmsanimated.avi”);如果存在(视频文件名,“文件”)删除(视频文件名)结束writer=VideoWriter(videoFilename);writer.FrameRate=1;writer.Quality=100;open(writer)

动画在单个地图显示中查看。在动画循环之外,创建一个地图显示。初始化hmap,在循环中用作函数的返回句柄geoshow,因此它可以在第一次循环时删除。每天循环,检索并显示WMS地图,然后保存帧。

图=图;usamap(latlim,lonlim)hs状态=地理显示(状态,“FaceColor”,“没有”);hmap=[];对于k = startDay: endDay%更新时间值并为每个服务器分配时间属性。currentDay = num2str (k);katrinaTime (dayIndex) = currentDay;nexradTime = [katrinaTime (1: end-1): 00 z的]; 卡特里娜飓风请求。时间=卡特里娜飓风时间;nexradRequest.Time=nexradTime;%从服务器(或文件)检索卡特里娜飓风的WMS地图%。功能([cachefile =“katrina_”num2str (currentDay)“.tif”]);如果useInternet katrinaMap = getMap(nasaServer, katrinaRequest.RequestURL);如果~exist(缓存文件,“文件”)geotiffwrite(缓存文件、katrinaMap、katrinaRequest.RasterRef)结束其他的katrinaMap=readgeoraster(缓存文件);结束%从服务器(或文件)检索NEXRAD图像的WMS地图%。功能([cachefile =“nexrad_”num2str (currentDay)“.tif”]);如果UseInternetNexradMap=getMap(iemServer,nexradRequest.RequestURL);如果~exist(缓存文件,“文件”) getiffwrite (cachefile, nexradMap, nexradRequest.RasterRef)结束其他的nexradMap=readgeoraster(缓存文件);结束%识别nexradMap图像中不包含%的背景颜色。索引=任何(nexradMap>阈值,3);索引=repmat(索引[1 3]);%下一张与卡特里娜飓风地图的合成地图。结合= katrinaMap;组合(索引)= uint8 (nexradMap(指数)* 255);%删除旧地图并显示新的合成地图。删除(hmap)hmap=geoshow(组合,katrinaRequest.RasterRef);UISTAK(hstates,“顶级”)标题({“12张卡特里娜飓风的图像”,...“与NEXRAD雷达合成”,nexradTime})drawnow%将当前帧另存为RGB图像。叫做= getframe(图);RGB = currentFrame.cdata;%为每个RGB帧创建索引图像,以显示图像% GIF动画。如果k = = startDay%第一次通过循环,将RGB图像转换为%索引的图像,并将颜色映射保存到%变量,cmap。使用cmap转换以后的帧。[帧,cmap]=rgb2ind(RGB,256,“nodither”);%使用第一帧的大小和总数%要初始化动画的帧数%足以容纳所有框架的大小。frameSize =大小(框架);numFrames = endDay - startDay + 1;动画= 0 ([frameSize 1 numFrames],“喜欢”,框架);其他的%使用第一帧转换中的颜色贴图,然后%将此帧转换为索引图像。帧= rgb2ind (RGB,提出,“nodither”);结束%将帧存储到GIF文件的动画数组中。frameCount = k - startDay + 1;动画(::1、frameCount) =框架;%将RGB帧写入AVI文件。writeVideo(作家,RGB);结束

关闭Figure窗口和AVI文件。

关闭(图)关闭(作家)

写入动画GIF文件。

文件名= fullfile (pwd,“wmsanimated.gif”);如果存在(文件名,“文件”删除(文件名)结束滞后时间= 2.0;loopCount =正;imwrite(动画,提出,文件名,...“延迟时间”延迟时间,“LoopCount”, loopCount);

步骤11:查看GIF动画文件

当浏览器打开动画GIF文件时,可以在浏览器中查看动画。

学分

卡特里娜层

示例中使用的卡特里娜图层来自NASA戈达德太空飞行中心的SVS图像服务器,由科学可视化工作室维护。

有关此服务器的更多信息,请运行:

> > wmsinfo(“http://svs.gsfc.nasa.gov/cgi-bin/wms?”)

NEXRAD层

示例中使用的NEXRAD层来自爱荷华州立大学的IEM WMS服务器,是由美国国家气象局(NWS)WSR-88D三级基准反射率生成的康纳斯合成。

有关此服务器的更多信息,请运行:

> > wmsinfo (“http://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r-t.cgi?”)

另见

|||||||