这个示例展示了如何组合和动画来自多个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的新手,这里列出了几个重要的概念。
网络地图服务---开放的地理空间联盟(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);
使用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的匹配LayerTitle
或layername.
属性。的*
字符表示通配符搜索。如果返回多个条目,只选择svs.gsfc.nasa.gov服务器上的第一个条目。
卡特里娜=提炼(卡特里娜飓风,“卡特里娜goes-12 * *可见*近* *动画的);卡特里娜=提炼(卡特里娜飓风,“svs.gsfc.nasa.gov”,“Searchfield”,“serverurl”);卡特里娜飓风卡特里娜= (1);谁卡特里娜飓风
名称大小字节类属性卡特里娜1x1 466 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图像中提取出来的,并覆盖在美国东南部的背景彩色图像上。
请注意,此抽象信息(包括任何印刷问题和不完整的片段)直接从服务器获得。
你可以找到更多关于卡特里娜飓风
通过探索细节
财产的卡特里娜飓风
层。的细节。属性
字段通知您该层具有固定的宽度和高度属性,因此无法修改请求的地图的大小。
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:45z
来2005 - 08 - 30 - t17:45z
有一段时间P1D
(一天),如Details.Dimension.Extent
字段。
katrina.Details.Dimension.Extent
ans = ' 2005 - 08 - 23 t17:45z / 2005 - 08 - 30 - t17:45z / P1D '
现在您已经找到了一层兴趣,您可以使用该功能检索栅格贴图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雷达图像存储在爱荷华州立大学的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;结束
复合了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的];
分配latlim
和lonlim
变量指定的限制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;
分配imageHeight
和imageWidth
变量。
imageHeight = katrina.Details.Attributes.FixedHeight;imageWidth = katrina.Details.Attributes.FixedWidth;
你可以检索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},“翻译”,“没有”);
复合了nexradMap
用副本katrinaMap
,您需要识别非背景像素nexradMap
.的nexradMap
由于该Web地图服务器如何处理,数据作为类双级的图像返回为图像PNG
格式,所以您需要将其转换为uint8
在合并之前。
识别的像素nexradMap
不包含背景色的图像。
阈值= 0;index = any(nexradMap > threshold, 3);索引= repmat(Index,[1 1 3]);
复合的nexradMap
与katrinaMap
.
结合= katrinaMap;组合(索引)= uint8 (nexradMap(指数)* 255);
显示合成的地图。
图usamap(latlim,lonlim) geoshow(combination,R)“FaceColor”,“没有”)标题({“12张卡特里娜飓风的图像”,...“与NEXRAD雷达合成”,nexradtime})
下一步是初始化变量,以使合成动画卡特里娜飓风
和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 =开始时间;
由于动画需要多个对服务器的请求,因此使用WebMapServer
和WMSMapRequest
类。
构造一个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;
当浏览器打开动画GIF或AVI视频文件时,可以在浏览器中查看动画。要创建WMS基图和矢量覆盖的动画帧,创建每天的循环,从startDay
来endDay
,并取得katrinaMap
和nexradMap
那一天。将这些地图合成为单个图像,显示图像,检索帧,并将结果存储到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);
当浏览器打开动画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?”)
wmsfind
|完善
|WMSUpdate.
|wmsread
|USAMAP.
|geoshow
|WMSMapRequest
|WebMapServer