主要内容

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

这个示例展示了如何组合和动画来自多个Web Map Service (WMS)层的数据。

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

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

特别地,这个例子将向你展示如何:

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

  • 在特定时间步骤中从WMS服务器检索Katrina基础映射

  • 在同一时间步从WMS服务器检索NEXRAD映射

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

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

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

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

了解基本的WMS术语

如果您是WMS的新手,这里列出了几个重要的概念。

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

  • WMS服务器---遵循OGC指南以渲染映射并将其返回给客户端的服务器

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

  • ---一种特定类型的地理信息的数据集,如温度,海拔,天气,正轨,边界,人口统计,地形,运输,环境测量和来自卫星的各种数据

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

源函数

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

函数mapexwmsanimate (useInternet datadir)

互联网接入

由于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表示包含数据文件的文件夹的位置。

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

定义匿名函数来预先添加datadir输入文件名:

datafile = @(filename)fullfile(datadir,filename);

步骤1:从本地数据库中找到Katrina图层

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

Mapping Toolbox™通过提供可搜索的本地,已安装和预先合格的WMS数据库来简化定位WMS服务器和图层的过程,该数据库使用该功能wmsfind.您可以在数据库中搜索您感兴趣的层和服务器。下面是如何找到包含该术语的层卡特里娜飓风无论是在layername.LayerTitle数据库字段:

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

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

卡特里娜(1)
ans = wmslayer属性:索引:1 servertitle:'NASA SVS Image Server'ServerURL:'https://svs.gsfc.nasa.gov/cgi-bin/wms?'Playtitle:'飓风Katrina的Go-12图像:龙波红外特写(1024x1024动画)'Layername:'3216_22510'Latlim:[15.0000 45.0000] Lonlim:[-100.0000 -70.0000]

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

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

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

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

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

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

同步第一卡特里娜飓风层与服务器,以获取抽象信息。由于这个动作需要访问互联网,调用WMSUpdate.只有当useInternet国旗是正确的。

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

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

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

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

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

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

katrina.Details.Attributes
ans = struct with字段:查询:0级联:0 opaque:1 nosubsets: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字段。

katrina.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); / /当前位置如果〜存在(cachefile,“文件”)地理迪迪特(CacheFile,Katrinamap,R)结束其他的[katrinaMap R] = readgeoraster (cachefile);结束

显示katrinaMap然后叠加数据USAstateHi.Shp.文件。

州= readgeotable (“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 =提炼(iemLayers,“nexrad-n0r-wmst”);

将图层与服务器同步。

cachefile =丢失(“nexrad.mat”);如果使用因特网nexrad = wmsupdate(nexrad);如果〜存在(cachefile,“文件”)保存(cachefile“nexrad”结束其他的缓存=负载(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 - 23 t03:10:00z”

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

nexradtime = [katrina.details.dimension.default(1:结束-1): 00 z的];

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

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

分配imageHeightimageWidth变量。

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”);如果Underneternet [nexradmap,r] = wmsread(nexrad,...“Latlim”latlim,“Lonlim”lonlim,“时间”nexradTime,...“写成BackgroundColor”、黑色、“ImageFormat”“图像/ png”...“ImageHeight”imageHeight,'imagewidth', imageWidth);如果〜存在(cachefile,“文件”) geotiffwrite (cachefile nexradMap右)结束其他的[nexradmap,r] = Readgeoraster(CacheFile);结束

显示nexradMap

图usamap(latlim,lonlim) geoshow(nexradMap,R)“FaceColor”“没有”“EdgeColor”,[0.9 0.9 0.9]) title({nexrad。LayerTitle nexradTime},“翻译”“没有”);

第8步:综合Nexrad雷达地图与卡特里娜地图

复合了nexradMap用副本katrinaMap,您需要识别非背景像素nexradMap.的nexradMap由于该Web地图服务器如何处理,数据作为类双级的图像返回为图像PNG格式,所以您需要将其转换为uint8在合并之前。

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

阈值= 0;index = any(nexradMap > threshold, 3);索引= repmat(Index,[1 1 3]);

复合的nexradMapkatrinaMap

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

显示合成的地图。

图usamap(latlim,lonlim) geoshow(combination,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

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 =黑色;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');如果存在(VideoFilename,“文件”删除(videoFilename)结束作家= VideoWriter(Videofilename);作者.Framerate = 1;作者.Quality = 100;开放(作家)

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

图=图;USAMAP(Latlim,Lonlim)HSTATES = Geoshow(州,“FaceColor”“没有”);hmap = [];k = startDay: endDay%更新时间值并为每个服务器分配时间属性。currentDay = num2str (k);katrinaTime (dayIndex) = currentDay;nexradTime = [katrinaTime (1: end-1): 00 z的];katrinarequest.time = katrinatime;nexradrequest.time = nexradtime;从服务器(或文件)检索Katrina的WMS地图%。功能([cachefile =“katrina_”num2str (currentDay)“.tif”]);如果useInternet katrinaMap = getMap(nasaServer, katrinaRequest.RequestURL);如果〜存在(cachefile,“文件”)地理迪迪特(CacheFile,Katrinamap,Katrinarequest.Rasterref)结束其他的katrinamap = Readgeoraster(CacheFile);结束%从服务器(或文件)检索Nexrad图像的WMS映射%。功能([cachefile =“nexrad_”num2str (currentDay)“.tif”]);如果useInternet nexradMap = getMap(iemServer, nexradRequest.RequestURL);如果〜存在(cachefile,“文件”) getiffwrite (cachefile, nexradMap, nexradRequest.RasterRef)结束其他的nexradMap = readgeoraster (cachefile);结束%识别不包含的NEXRADMAP图像的像素%的背景颜色。index = any(nexradMap > threshold, 3);索引= repmat(Index,[1 1 3]);%复合nexradMap与katrinaMap。结合= katrinaMap;组合(索引)= uint8 (nexradMap(指数)* 255);%删除旧地图并显示新的合成地图。delete(hmap) hmap = geoshow(combination, katrinaRequest.RasterRef); / /删除hmapuistack (hstates“高级”)标题({“12张卡特里娜飓风的图像”...“与NEXRAD雷达合成”drawnow, nexradTime})%将当前帧保存为RGB图像。叫做= getframe(图);RGB = currentFrame.cdata;%为每个RGB帧创建索引图像,以便显示一个% GIF动画。如果k = = startDay%第一次通过循环,将RGB图像转换为%索引的图像,并将颜色映射保存到%变量,CMAP。使用CMAP转换以后的帧。[框架,提出]= rgb2ind (RGB, 256,“nodither”);%使用第一帧的大小和总数初始化动画的帧数%大到足以包含所有帧的大小。frameSize =大小(框架);numFrames = endDay - startDay + 1;动画= 0 ([frameSize 1 numFrames],'喜欢',框架);其他的%使用来自第一帧转换的ColorMap和%将此帧转换为索引图像。帧= 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 III级基础反射率生成的CONUS复合层。

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

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

另请参阅

|||||||