APP下载

瓦片式震中分布图生成及局部自动更新

2015-04-10郭啟倩武晓红李盛乐

地理空间信息 2015年1期
关键词:瓦片分布图级别

郭啟倩,武晓红,李盛乐

(1.中国地震局 地震研究所, 湖北 武汉 430071;2.西安测绘总站, 陕西 西安 710054)

瓦片式震中分布图生成及局部自动更新

郭啟倩1,武晓红2,李盛乐1

(1.中国地震局 地震研究所, 湖北 武汉 430071;2.西安测绘总站, 陕西 西安 710054)

针对目前在线震中分布图存在的问题,提出瓦片式地震震中分布图。使用ArcGIS Engine开发瓦片切图工具及局部瓦片自动更新程序,结合Google Maps实现瓦片式震中分布图的展示。基于Web GIS的瓦片式震中分布图在显示历史地震和最新地震方面较以往在线震中分布图有很大改善,瓦片局部自动更新程序也克服了瓦片式地图本身更新速度慢的缺陷。

瓦片;震中分布图;局部自动更新; ArcGIS Engine ;Google Maps

目前地震系统可用于在线浏览的震中分布图主要有2类:第1类是在地震信息门户网站直接访问静态震中分布图,该静态图件是由应急人员人工或通过程序生成的,这种方式增加了应急时期的响应时间,且静态图件的比例尺难以满足公众需求。第2类是基于Web GIS的地震震中分布图[1],是目前使用最广泛的在线震中分布图形式。该方法是通过Internet上主流的网络地图,如Google Maps、百度地图、MapABC等公布的基于Web的API接口,在地图上添加覆盖类标注显示地震震中地点。这种方式优点在于其信息更新迅速、访问速度快[2],在显示少量地震,如最近一段时期的地震信息时效果显著,但在显示大量地震,如历史地震信息时,会造成网络响应速度慢,甚至出现页面崩溃情况。本文提出基于Web GIS的瓦片式地震震中分布图,在显示历史地震和最新地震方面较以往在线震中分布图有很大改善,并利用局部瓦片自动更新程序在震后快速更新地图数据,缩短应急响应时间。

1 地图瓦片技术

Web GIS是Internet技术应用于GIS开发的产物。利用Internet在Web上发布和出版空间数据,为用户提供空间数据浏览、查询和分析的功能,已经成为GIS发展的必然趋势。传统的Web GIS服务根据用户请求参数实时渲染地图数据再返回给客户端,由于GIS数据通常是海量的,用户对每次请求的等待时间较长,数据传输与浏览速度较慢,成了Web GIS应用推广的瓶颈。Google Maps将Ajax技术引入Web GIS[3],打破了传统Web GIS根据用户请求来实时渲染数据的服务模式,采用了地图缓存,即瓦片技术提高访问速度,减缓服务器压力。

地图瓦片技术是将地图和影像采用特定的预切割方式进行切片,按一定规则存储在服务器上,客户端异步加载当前屏幕可视区域的瓦片数据。瓦片式地图采用金字塔模型结构(如图1)。这是一种多分辨率的层次模型,每一层对应一个地图级别,从瓦片金字塔的底层到顶层,地图级别及分辨率越来越低,但表示的地理范围不变。当用户提出数据请求时,服务器根据当前的地图级别,只返回屏幕区域对应的瓦片到客户端并缓存,有效避免了一次性请求所有数据导致的服务器压力及带宽浪费,提高了Web浏览器的地图访问能力。目前,越来越多的地图服务网站(如Google Maps、百度地图、MapABC、Microsoft Live Map等)都采用了这种技术来提高地图访问的速度。

图 1 瓦片金字塔结构

地图瓦片技术让Web GIS系统的性能得到极大改善。然而,地图生成瓦片以后,只是以图片的形式存在,地理空间数据发生变化后只有等待后台管理员重建地图缓存才能在客户端得到反映,而重建地图瓦片通常需要几h甚至更长的时间。实际上,地理空间数据变更通常只是局部区域变更,无需对整个地图文档重建瓦片,若能够在后台自动获取更新的地理空间数据,编辑地图文档,并输出局部区域地图瓦片替换旧的瓦片文件,在很大程度上减少耗时,克服瓦片式地图本身更新速度慢的缺陷。

2 瓦片式震中分布图

将地图瓦片技术运用于震中分布图中,可以弥补目前在线震中分布图存在的不足。

1)瓦片式地图利用Ajax实现数据的按需获取、异步加载,根据地震目录资料制作历史地震震中分布地图,预处理为地图瓦片作为专题底图,用户在地震速报页面查看最近地震的同时可加载该地区历史地震震中分布瓦片,无论震例多少,用户一次浏览只需加载当前屏幕范围的地图瓦片,且浏览过的瓦片缓存到客户端,无需重复请求数据,大大提高了网页访问速度,减小服务器压力。

2)瓦片式震中分布图便于和目前互联网主流的地图服务结合,利用API接口将震中分布专题底图与Google Maps、百度地图等叠加,还可利用API实现简单的查询、测距等功能,取得较好的应用效果。

3)地震分层逐级显示,地图级别越高,显示震级越低,震例越多。

4)瓦片式震中分布图分级缩放显示,弥补了静态震中分布图比例尺无法满足用户需求的不足。

5)局部自动更新代替瓦片金字塔重建,改善了瓦片式地图本身存在的更新困难的问题。

3 瓦片切图工具设计和实现

瓦片切图工具是基于Visual Studio2010平台和ArcGIS Engine 10.0,利用C#语言编程实现的。ArcGIS Engine是ESRI公司发布的用于构建定制应用的嵌入式GIS组件库。ArcGIS Engine包括构建ArcGIS产品的所有核心组件,提供COM、.NET和C++的应用程序编程接口(API)。利用ArcGIS Engine提供的编程接口,可以方便地设计GIS程序,操作ArcMap地图文档。

3.1 切图算法流程

切图数据源采用ArcMap地图文档(.mxd格式)。首先确定将要进行瓦片切图的地图的初始地理坐标范围,该范围可自定义,也可利用IEnvelope接口的QueryCoords方法输出。然后选取坐标范围起始点,根据切片级别确定比例尺,由比例尺(dMapScale)、瓦 片 尺 寸(dImageWidth、dImageHeight) 及 跨度(detaX、detaY)循环计算每个瓦片的地理范围(dTempXMin、dTempXMax、dTempYMax、dTempYMin);最后利用IExport接口输出瓦片。瓦片切图算法流程如图2所示。

图 2 切图算法流程图

程序对各个级别切割完成的瓦片按照瓦片切割等级、相应等级的切图列数、相应列下的切图行数进行分级组织存储,便于客户端对瓦片库进行索引和查找。本文采用Google Maps瓦片组织方式存储地图瓦片。Google Maps所使用的地图投影被称作Web Mercator,它与常规墨卡托投影的主要区别就是把地球模拟为球体而非椭球体。程序中起始瓦片所对应的列、行号,即在瓦片坐标系下的X坐标、Y坐标,分别根据切图范围最小经度值、最大纬度值转换而来,结合墨卡托投影函数将经度、纬度值转换为瓦片X、Y坐标,转换算法如下:

//经度转换瓦片X坐标

int getXFromLongitude(double lon,int level)

{

return (int)((lon+180)/360)*Math.Pow(2, level);

}

//纬度转换瓦片Y坐标

int getYFromLatitude(double lat,int level)

{

double sinLat = Math.sin(Math.PI * lat/180);

double y=0.5 - Math.Log((1+sinLat)/(1-sinLat))/ (4*Math.PI);

return(int)(y*Math.Pow(2, level))

}

切图算法根据图幅范围自适应每一地图级别对应的瓦片数,整体执行效率较高,瓦片约以20张/s 的速度输出。

3.2 切图工具开发

切图工具程序实现主要利用ArcGIS Engine中的IExport、IActive View、IEnvelope等接口进行地图瓦片的生成,根据切图等级和切割的行列数不断调整地图的可视范围,然后将当前地图范围的显示内容导出为预定义格式的图片,并按照瓦片库的目录组织结构进行存储[4,5]。工具界面如图3所示。

图 3 切图工具界面图

瓦片导出函数如下:

private void exportToImage(IActiveView pActiveView, string sImagePath, IEnvelope pEnvelope, int right, int bottom)

{

IExportPNG pExpng = new ExportPNGClass(); IExport export = pExpng as IExport;

IEnvelope envelope = new EnvelopeClass();

ITrackCancel cancel = new CancelTrackerClass(); tagRECT grect; grect.left = 0; grect.top = 0;

grect.right = right;

grect.bottom = bottom;

int num = Convert.ToInt32(export.Resolution); envelope.PutCoords((double)grect.left, (double)grect. bottom, (double)grect.right, (double)grect.top);

export.ExportFileName = sImagePath;

export.PixelBounds = envelope;

pActiveView.Output(export.StartExporting(), num, ref grect, pEnvelope, cancel);

export.FinishExporting();

}

4 瓦片局部自动更新

如前所述,瓦片式地图是金字塔形分级存储的图片格式数据,当地理要素发生变化后需要重建瓦片金字塔,这一过程将耗费很长时间。瓦片局部自动更新旨在用更新变化区域瓦片数据的方法替代整体瓦片金字塔重建,更新过程只需要几s。这一改进大大缩短了瓦片数据更新、准备时间,对于及时更新震中分布图优势显著。

瓦片地图局部自动更新程序分为更新地图文档和替换瓦片2个部分。更新地图文档,即根据需要更新的地图要素数据通过后台程序修改.mxd文档。当地图文档更新以后,首先要获取更新后的地图要素对应的坐标范围,然后根据这个坐标范围计算该范围内对应地图瓦片的行列号,接着在后台重新生成这个范围内的地图瓦片,最后以新生成的瓦片替换旧的瓦片,最终实现图形与数据更新的同步[6]。

当点要素发生变化时,根据点要素在地图投影坐标系下的坐标值计算该点在不同地图级别下所在瓦片的行列号(X、Y),生成对应地图级别的瓦片。线要素、面要素发生变化,根据变化要素的最小外包矩形计算该要素地理范围所在瓦片的行列号序列,生成对应地图级别的瓦片集合。下面以更新一个震中点pGeom要素为例,说明瓦片式震中分布图局部自动更新流程。

4.1 更新地图文档

更新地图文档是获取指定地图文档的当前图层,对当前图层添加新的地理要素,保存修改后的.mxd文档作为瓦片数据新的地图数据源。主要利用IFeatureClass、IFeature等接口向指定图层添加新的地图要素,关键代码如下:

IFeatureLayer pFeatureLayer = (IFeatureLayer)m_ pCurrentLayer;

IFeatureClass pFeatureClass = pFeatureLayer. FeatureClass;

//开始创建地理要素

IFeature pFeature = pFeatureClass.CreateFeature(); //定义要素类型

pFeature.Shape = pGeom;

//要素赋字段值

int fi eldindex = pFeature.Fields.FindField("字段名"); pFeature.set_Value(f i eldindex, "字段值"); //保存地理要素pFeature.Store();

由于地震目录采用经纬度记录震中位置,点pGeom要素的坐标值是经过转换处理的投影坐标系下的坐标值。

4.2 替换瓦片

1)将经纬度值转换为对应地图级别下的地图瓦片坐标X、Y,转换算法见§3.1。

2)根据瓦片号计算瓦片地理范围。

double dTempXMin = dTileOriginX + dImageWidth * (detaX - 1);

double dTempXMax = dTileOriginX + dImageWidth * detaX;

double dTempYMax = dTileOriginY - dImageHeight * detaY;

double dTempYMin = dTileOriginY - dImageHeight * (detaY - 1);

IEnvelope envelope = new EnvelopeClass();

envelope.PutCoords(dTempXMin, dTempYMin, dTempXMax, dTempYMax);

pActiveView.Extent = envelope;

其中,dTileOriginX、dTileOriginY分别是该mxd文档的X最小值和Y最大值,dImageWidth、dImageHeight代表瓦片的地理跨度值,detaX、detaY分别是瓦片号X、Y与该mxd文档最小瓦片号OriginX、OriginY的差值。

3)输出瓦片替换旧瓦片。

string sImagePath = sFolderDir + "\" + X+ "\" + Y +".PNG";

exportToImage(pActiveView, sImagePath, envelope, 256,256)。

5 瓦片式震中分布图展示

本文基于Google Maps提供的JavaScript API接口对Google Maps进行二次开发[7]。对于历史地震信息,采用叠加瓦片式震中分布图的方式分震级缩放显示,地图级别越高,能够显示的震级越小,震例越多;对于最近一段时间发生的地震事件A,采用叠加覆盖类标注的方式动态闪烁显示。当新增地震事件B时,后台程序自动将地震事件A写入.mxd地图文档,并更新对应的各级地图瓦片,地震事件B闪烁标注。

5.1 叠加震中分布图瓦片

1)切图数据源准备。按照逐级显示地震的原则,在ArcMap中完成震中分布图制图,地图投影方式采用与Google Maps一致的Web Mercator投影。

2)地图瓦片制作。使用瓦片切图工具制作地图瓦片,不同级别的地图瓦片选择显示对应震级范围的地图数据源,如2级地图显示7级以上地震,10级地图显示3级以上地震。

3)地图瓦片叠加。Google Maps API为基本类型google.maps.Map提供了overlayMapTypes属性叠加自定义瓦片地图,关键脚本如下:

//叠加自定义瓦片

map.overlayMapTypes.insertAt(0, new OverLayer (new google.maps.Size(256, 256)));

//瓦片的tileSize、getTile属性

function OverLayer(tileSize) {}

OverLayer.prototype.tileSize = new google.maps. Size(256, 256);

OverLayer.prototype.getTile = function (coord, zoom, ownerDocument)

{

var overlay = ownerDocument.createElement ('overlay');

overlay.style.width = this.tileSize.width + 'px';

overlay.style.height = this.tileSize.height + 'px';

var strURL = "EQMs7/";

strURL += zoom + "/" + coord.x + "/" + coord.y + ".PNG";

overlay.style.backgroundImage = 'url(' + strURL + ')';

return overlay;

}

其中coord.x、coord.y分别是Google Maps定义的瓦片坐标系中的瓦片坐标值X、Y,§4.2中程序生成的瓦片存储路径为zoom/ coord.x/coord.y,与strURL对应。图4为7级地图叠加Ms5以上地震的震中分布图瓦片。

图 4 瓦片式震中分布图

5.2 标注最新地震事件

对于最新地震事件,采用Google Maps API提供的覆盖类型google.maps.Marker动态闪烁显示,并添加信息窗。图5所示为在6级地理底图上显示全球5级以上地震震中分布图,闪烁标注湖北巴东5.1级地震。

图 5 标注最新地震

6 结 语

瓦片式地震震中分布图结合主流的Web GIS服务平台,弥补了传统在线震中分布图的不足,并改进瓦片数据更新方法,进一步优化了应用效果。功能方面,主要优势在于将历史地震震中分布图作为专题底图,以瓦片形式分级分层显示,地图级别越高,能够显示的地震级数越小,震例越多;同时利用Google Maps API提供的Marker覆盖类显示最新地震震情信息,实现历史地震和最新地震同时显示,效果较好。技术方面,采用局部瓦片自动更新的方法替代瓦片金字塔重建,在区域地理空间数据发生变化后(例如在震中分布图上新增震中点),仅需要更新每个瓦片级别对应该区域的瓦片数据,最大程度地缩短了地图瓦片的更新时间。

[1] 董星宏,贾宁.基于Web GIS的地震震中分布图实现方式探讨[J].高原地震,2011,23(1):63-64

[2] 吴阿丹,李胜乐.生成GoogleMap地震震中分布图的一种方法[J].地震地磁观测与研究,2012,33(2):120-123

[3] 吴云超,王汶,牛铮,等.Ajax在WebGIS中的应用[J].地理与地理信息科学,2007,23(2):43-46

[4] 寇曼曼,王勤忠,谭同德.Google map数字栅格地图算法及应用[J].计算机技术与发展,2012,22(4):204-206

[5] 王小军,刘璐.基于ArcGIS Engine进行瓦片式切图的技术研究[J].测绘与空间地理信息,2010,33(4):49-54

[6] 郭明武,彭青山,李黎.ArcGIS Server中地图瓦片实时在线局部更新方法研究[J].测绘通报,2012(2):35-38

[7] Google. Google Maps JavaScript API V3[EB/OL].https:// developers.google.com/maps/documentation/javascript/ maptypes?hl=zh-CN#TileCoordinates,2014-05-21

P208

B

1672-4623(2015)01-0115-04

10.3969/j.issn.1672-4623.2015.01.038

郭啟倩,硕士,主要研究方向为地震与地理信息系统。

2014-05-21。

项目来源:“十二五”国家科技支撑计划资助项目(2012BAK19B02-05)。

猜你喜欢

瓦片分布图级别
打水漂
一种基于主题时空价值的服务器端瓦片缓存算法
贵州十大地质公园分布图
惯性
级别分明
迈向UHD HDR的“水晶” 十万元级别的SIM2 CRYSTAL4 UHD
新年导购手册之两万元以下级别好物推荐
中国癌症分布图
左右江水冲石器采集分布图
你是什么级别的