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

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

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

由爱荷华州立大学的IOWA环境MESONET(IEM)Web地图服务器收集的下一代雷达(NEXRAD)图像是以定期的时间间隔与云数据一起组成。

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

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

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

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

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

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

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

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

了解基本的WMS术语

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

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

  • WMS服务器—服务器遵循OGC的指导方针来渲染地图并返回给客户端

  • 地图---地图的OGC定义是“作为适合在计算机屏幕上显示的数字图像文件的地理信息写字。”

  • —特定类型的地理信息数据集,如温度、海拔、天气、正射影照片、边界、人口、地形、交通、环境测量和各种卫星数据

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

源函数

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

功能mapexwmsanimate (useInternet datadir)

互联网接入

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

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

您可以在第一次运行示例时将数据存储在本地,然后设置使用互联网标志为假。如果是使用互联网标志未定义,它被设置为false。

如果~ (“使用互联网”'var')Undernernet = false;结尾

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

此示例在以下情况下将数据写入文件:使用互联网真的或者从文件中读取数据使用互联网错误的.它使用变量datadir表示包含数据文件的文件夹的位置。

如果~ (“datadir”'var') datadir = fullfile(matlabroot,“例子”“地图”'数据');结尾如果~exist(datadir,“dir”mkdir (datadir)结尾

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

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

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

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

Mapping Toolbox™通过使用该功能提供可搜索的本地、安装和预审合格的WMS数据库,简化了定位WMS服务器和层的过程wmsfind.您可以在数据库中搜索您感兴趣的图层和服务器。以下是您如何找到包含该术语的图层卡特里娜州在任何一种LayerNamelay数据库的字段:

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

搜索这个词“卡特里娜”返回一个杀戮者包含多个图层的数组。要检查有关单层的信息,只需显示它:

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

如果你的类型,卡特里娜州,在命令窗口中,将显示数组的全部内容,并在输出中包含每个元素的索引号。此显示使您可以轻松快速检查整个数组,搜索感兴趣的图层。您只能显示lay通过执行命令来为每个元素的属性:

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

正如你所发现的,搜索通用词“卡特里娜”返回多个层的结果,您只需选择一个层。通常,搜索甚至可能返回数千个层,这些层可能太大,无法单独查看。您可以使用完善的方法杀戮者班级。使用完善方法比wmsfind因为搜索范围已经缩小到更小的范围。提供查询字符串,“卡特里娜goes-12 * *可见*近* *动画的,完善方法返回一个杀戮者数组的元素中包含与查询字符串的匹配layLayerName属性。的字符表示通配符搜索。如果返回多个条目,请仅从svs.gsfc.nasa.gov服务器中选择第一个条目。

卡特里娜=精炼(卡特里娜州,“卡特里娜goes-12 * *可见*近* *动画的);卡特里娜=精炼(卡特里娜州,'svs.gsfc.nasa.gov''searchfield'“服务器URL”);卡特里娜=卡特里娜(1);谁是卡特里娜州
名称大小字节类属性Katrina 1x1 466 WMSLayer

步骤2:使用服务器同步WMSLAYER对象

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

同步第一卡特里娜州层与服务器,以获取抽象信息。由于这个动作需要访问互联网,调用wmsupdate只有在使用互联网这是真的。

cachefile =丢失(“卡特里娜,马特”);如果/ / / / / / / / / /如果~存在(cachefile“文件”)保存(cachefile“卡特里娜”结尾别的缓存=负载(cachefile);卡特里娜= cache.katrina;结尾

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

摘要= katrina.Abstract;endOfLine =找到(isstrprop(抽象,“cntrl”),1); 抽象=抽象(1:内弗林);numSpaces=60;尽管(~ is空(抽象))k = find(isspace(抽象));n = find(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步:探索卡特里娜层的详细信息

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

katrina.Details.Attributes
ans = struct with fields: Queryable: 0 Cascaded: 0 Opaque: 1 NoSubsets: 1 FixedWidth: 1024 FixedHeight: 1024

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

katrina.details.dimension.
ans = struct with字段:名称:'time'单位:'ISO8601'Inosymbol:''默认:'2005-08-30T17:45z'多值:0靠近值:0当前:0范围:'2005-08-23T17:45z/ 2005-08-30T17:45z / p1d'

范围2005 - 08 - 23 - t17:45z2005 - 08 - 30 - t17:45z有一段时间P1D(一天),如图所示详细信息.Diminsion.extent.字段。

katrina.Details.Dimension.Extent
ans = ' 2005 - 08 - 23 t17:45z / 2005 - 08 - 30 - t17:45z / P1D '

第4步:从服务器检索katrina地图

现在您已经找到了感兴趣的层,可以使用该函数检索光栅映射WMSREAD.并使用该函数显示地图geoshow.自时间读取图层时未指定,默认时间,2005 - 08 - 30 - t17:45z的指定检索Details.Dimension.Default字段。如果是使用互联网标志设置为TRUE,然后在地理域文件中缓存图像并引用矩阵。

cachefile =丢失(“katrina.tif”);如果Userneternet [katrinamap,r] = wmsread(katrina);如果~存在(cachefile“文件”) geotiffwrite (cachefile katrinaMap右)结尾别的[katrinaMap,R]=readgeoraster(缓存文件);结尾

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

州= shaperead (“usastatehi.shp”“UseGeoCoords”,真正的);图usamap(卡特里娜飓风。geoshow(katrinaMap,R) geoshow(states,'facecholor''没有任何')标题({katrina.layertitle,katrina.details.diminess.default},...“口译员”'没有任何'

第5步:找到Nexrad雷达层

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

IEMLAYERS = WMSFIND(“IEM WMS服务”“搜索字段”'servertitle');nexrad =提炼(iemLayers,“nexrad-n0r-wmst”);

同步层与服务器。

cachefile =丢失('nexrad.mat');如果使用因特网nexrad = wmsupdate(nexrad);如果~存在(cachefile“文件”)保存(cachefile“nexrad”结尾别的缓存=负载(cachefile);nexrad = cache.nexrad;结尾

步骤6:获得范围参数

复合这一点奈克斯拉德卡特里娜州层,则需要获取奈克斯拉德层在巧合的时间周期,和并行的地理和图像范围。的细节。维字段通知您图层具有时间维度,

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: end-1)':00z'];

分配拉德林lonlim变量指定的限制奈克斯拉德层。将值设置为限制的值卡特里娜州层,以便地理区域匹配。请注意,奈克斯拉德层的南纬界限不延伸到远南如卡特里娜州层的南部纬度极限。位于地理边界四边形之外的值奈克斯拉德图层设置为背景颜色。

流(“% 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;

步骤7:从服务器检索NEXRAD雷达地图

您可以检索nexradmap.从服务器中指定的katrinamap.对于相同的地理和图像范围,通过向WMSREAD.功能。要准确地检索来自地图的雷达信号,请设置图像格式参数到图像/ PNG.格式。为了便于从背景中检索信号,请将背景颜色设置为黑色([0 0 0])。

检索nexradmap.

黑色= [0 0 0];cachefile =丢失(“nexrad.tif”);如果useInternet [nexradMap,R] = wmsread(nexrad, R)...“Latlim”,拉特林,“Lonlim”,lonlim,“时间”nexradTime,...“背景色”黑色“ImageFormat”“图像/ png”...“ImageHeight”imageHeight,“ImageWidth”,图像宽度);如果~存在(cachefile“文件”)地理迪迪特(CacheFile,Nexradmap,R)结尾别的[nexradMap R] = readgeoraster (cachefile);结尾

显示nexradmap.

图usamap(latlim,lonlim) geoshow(nexradMap,R)'facecholor''没有任何'“EdgeColor”“白色”)标题({nexrad.layertitle,nexradtime},“口译员”'没有任何');

第八步:合成NEXRAD雷达地图与卡特里娜地图

复合这一点nexradmap.带着一份katrinamap.,则需要在中识别非背景像素nexradmap.这个nexradmap.数据通过类double返回为图像,这取决于这个web地图服务器的处理方式PNG格式,所以你需要把它转换成uint8在合并之前。

识别像素的nexradmap.不包含背景颜色的图像。

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

复合的nexradmap.与之katrinamap.

组合=卡特里娜飓风图;组合(指数)=uint8(下一次飓风图(指数)*255);

显示合成的地图。

图usamap(latlim,lonlim) geoshow(combination,R)'facecholor''没有任何') 标题({“12幅卡特里娜飓风图像”...“与NEXRAD雷达合成”, nexradTime})

步骤9:初始化变量以动画卡特里娜和NEXRAD地图

下一步是初始化变量,以使合成动画卡特里娜州奈克斯拉德地图。

属性的时间范围创建变量卡特里娜州层。

程度上= katrina.Details.Dimension.Extent;削减=' / ';slashIndex=strfind(extent,slash);startTime=extent(1:slashIndex(1)-1);endTime=extent(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.对象。

katrinarequest = wmsmaprequest(katrina,nasaerver);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基础图像和向量叠加的动画帧,请通过每天创建循环,来自初步endDay,并取得katrinamap.nexradmap.那天。将映射复制到单个图像中,显示图像,检索帧,并将结果存储到AVI文件的帧中和动画GIF文件的帧。

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

videoFilename = fullfile (pwd,“wmsanimated.avi”);如果存在(videoFilename“文件”删除(videoFilename)结尾作家= VideoWriter (videoFilename);作家。帧速率= 1;作家。质量= 100;打开(作家)

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

无花果=图;Usamap (latlim,lonlim) hstates = geoshow(states, lonlim)'facecholor''没有任何');hmap = [];为了k =跑步:终点%更新时间值并为每个服务器分配时间属性。currentday = num2str(k);KatrinAtime(DayIndex)=截止日期;nexradtime = [katrinatime(1:end-1)':00z'];katrinaRequest。时间= katrinaTime; nexradRequest.Time = nexradTime;%从服务器(或文件)中检索Katrina的WMS映射这个时间段的%。cachefile = datafile([“katrina_”num2str(截止日)“.tif”]);如果useInternet katrinaMap = getMap(nasaServer, katrinaRequest.RequestURL);如果~存在(cachefile“文件”) getiffwrite (cachefile, katrinaMap, katrinaRequest.RasterRef)结尾别的katrinaMap = readgeoraster (cachefile);结尾从服务器(或文件)检索NEXRAD图像的WMS地图这个时间段的%。cachefile = datafile(['nexrad_'num2str(截止日)“.tif”]);如果Underneternet nexradmap = getMap(IEMServer,NexradRequest.Requesturl);如果~存在(cachefile“文件”)geotiffwrite(缓存文件、nexradMap、nexradRequest.RasterRef)结尾别的nexradMap = readgeoraster (cachefile);结尾%标识nexradMap图像中不包含%背景色。index = any(nexradMap > threshold, 3);索引= repmat(Index,[1 1 3]);%复合nexradMap与katrinaMap。组合=卡特里娜飓风图;组合(指数)=uint8(下一次飓风图(指数)*255);%删除旧地图并显示新的合成地图。delete(hmap) hmap = geoshow(combination, katrinaRequest.RasterRef); / /删除hmapuistack (hstates“高级”) 标题({“12幅卡特里娜飓风图像”...“与NEXRAD雷达合成”drawnow, nexradTime})%保存当前帧为RGB图像。currentFrame=getframe(图);RGB=currentFrame.cdata;%为每个RGB帧创建索引图像,以便显示% GIF动画。如果k = = startDay%第一次通过循环,将RGB图像转换为%创建索引图像并将颜色映射保存到%变量,提出。使用cmap转换以后的帧。[框架,提出]= rgb2ind (RGB, 256,'点亮');%使用第一帧的大小和总数用于初始化动画的帧数%大到足以包含所有帧的大小。frameSize=大小(帧);numFrames=结束日-开始日+1;动画=零([frameSize 1 numFrames],“喜欢”、框架);别的%使用颜色图从第一个帧转换和%将此帧转换为索引图像。帧= RGB2IND(RGB,CMAP,'点亮');结尾%将帧存储到GIF文件的动画数组中。framecount = k  -  startday + 1;动画(:,:1,frameCount)=帧;%将RGB帧写入AVI文件。WriteVideo(作者,RGB);结尾

关闭图形窗口和AVI文件。

关闭(图)关闭(作者)

写入动画GIF文件。

filename=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?”

另请参阅

|||||||