此示例演示如何合成来自多个Web地图服务(WMS)层的数据并设置其动画。
底层来自NASA戈达德太空飞行中心的科学可视化工作室(SVS)图像服务器。该层中的数据显示2005年8月23日至8月30日卡特里娜飓风期间的卫星云数据。该层由从GOES-12图像提取的云数据组成,并覆盖在美国东南部的彩色图像上。
下一代雷达(NEXRAD)图像,由爱荷华州立大学的爱荷华环境Mesonet (IEM)网络地图服务器收集,与云数据定期合成。
特别是,本示例将向您展示如何:
使用WMS数据库查找Katrina和NEXRAD图层
在特定时间步从WMS服务器检索卡特里娜基本地图
同时从WMS服务器检索NEXRAD映射
将基本地图与包含NEXRAD图像的地图合成
在投影坐标系统中查看合成地图
检索、合成和动画多个时间序列
创建动画的视频文件和动画GIF文件
如果您是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,文件名);
使用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
数据库只存储层信息的一个子集。例如,来自层的抽象信息、关于层的属性和样式信息的详细信息以及层的坐标参考系统不返回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图像中提取出来的,并覆盖在美国东南部的背景彩色图像上。
请注意,此抽象信息(包括任何印刷问题和不完整的片段)是直接从服务器获得的。
你可以找到更多关于卡特里娜飓风
通过探索细节
财产的卡特里娜飓风
层。这个细节。属性
字段通知您该层具有固定的宽度和高度属性,因此无法修改请求的地图的大小。
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:45z
来2005 - 08 - 30 - t17:45z
有一段时间P1D
(一天),如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); / /当前位置如果~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雷达图像存储在爱荷华州立大学的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;结束
复合了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的];
分配latlim
和lonlim
变量来指定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;
您可以检索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},“翻译”,“没有”);
复合了nexradMap
有一份katrinaMap
,则需要识别图像中的非背景像素nexradMap
.这个nexradMap
由于web地图服务器的处理方式,数据以类double的图像形式返回PNG
格式,所以您需要将其转换为uint8
在合并之前。
识别图像的像素nexradMap
不包含背景色的图像。
阈值=0;索引=任何(nexradMap>阈值,3);索引=repmat(索引[1 3]);
复合的nexradMap
与katrinaMap
.
结合= katrinaMap;组合(索引)= uint8 (nexradMap(指数)* 255);
显示合成的地图。
图usamap(拉特利姆、隆利姆)地理展示(组合,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
.
卡特里娜飓风时间=开始时间;
由于动画需要多个对服务器的请求,因此使用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=black;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”);如果存在(视频文件名,“文件”)删除(视频文件名)结束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);
当浏览器打开动画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?”)
wmsfind
|完善
|wmsupdate
|wmsread
|美国地图
|geoshow
|WMSMapRequest
|WebMapServer