基于GIS的地图瓦片生成方法的设计与实现
2019-08-27张铁
【摘要】针对传统地图调用模式效率低、时效性差等问题,本文提出了一种基于GIS的地图瓦片生成方法,可将生成的瓦片地图作为背景底图,提高了地图的浏览、查询、地理分析等出图效率。经测试,该方法可实现对地图分块切割,达到了以“空间换取时间”的目标。
【关键词】地图瓦片 GIS 时效性
0引言
随着智慧城市快速推进,城市基础地理信息服务的重要性日益突出,政府相关部门非常重视地理空间信息服务工作。传统的Web GIS系统采用实时请求地图服务器工作模式,该模式极大地消耗了网络负载和服务器负载,导致时效性差、工作效率低,无法满足多用户、高并发的地理空间信息资源共享服务需求。然而,Google Maps的出现打破了人们对传统Web GIS工作模式的看法,同时也给大家提供了研究思路和解决方法。Google Maps将全球地图和影像采用特定的预切割方式进行切片,并将切好的地图图像存储在服务器上,当用户访问地图时,将从Google Maps的服务器上请求图片到本机缓存,这样就很大程度上减轻服务器压力,提高了请求数量和访问速度。鉴于此,为了提高公众服务平台空间信息资源共享的服务效率和能力,开发基于基于GIS的地图瓦片生成方法十分必要。
1地图瓦片生成方法机理
地图切片技术是目前大多数电子地图网站使用的技术,地图分块切割后将地图若干不同的瓦片组合划分不同的等级显示,再由客户端呈现出无缝拼接地图的浏览技术。地图瓦片技术将配置好的一定坐标范围的地图,按照固定的若干个瓦片级别和指定图片尺寸(如128,256像素),切成若干行及列的正方形图片,以指定的格式保存成图像文件,按一定的命名规则和组织方式存储到目录系统中或是数据库系统里,形成金字塔模型的静态地图缓存,地图切图所获得的地图切片也叫瓦片。对每个地图切片所表示的地理范围,进行下一个缩放级别的地图切片生成,直至所要表示地图的最大比例尺,形成地图切片的金字塔结构,地图切片的数量呈指数级别的增长。瓦片式地图采用金字塔结构模型如下图1所示。瓦片式地图采用多分辨率层次模型的结构,从瓦片金字塔的第一层到最后一层,地图显示的细节越来越清晰,但是地图表示的地理范围是不变的。
为了实现对GIS系统的图层信息的提取处理,首先需要参考Google Maps地图瓦片预生成技术对地图按照Google Maps标准进行切割。本文对提取的图层信息进行标准化处理后,统一存储为Google Maps格式(每个tile为256× 256像素的.png格式的图像)。本文采用预切割方式对地图进行切片,并将切好的地图图像存储在服务器上,当用户访问地图时,将从服务器上请求图片到本机缓存,这样很大程度上提高请求数量和访问速度。采用的地图转换参数标准如表1所示。
2地图瓦片生成方法设计与实现
2.1地图瓦片生成算法流程
参考GoogleMaps标准,地图瓦片生成算法流程如图2所示。
2.2地图瓦片生成方法实现结果
2.2.1代码实现
private void getWorkspace() //建立一个工作空间
private void createDatasource()//得到数据源
ds=workspace.getDatasources().open(info)//在工作空间中打开数据源。
public OneLevelMapTilesGet(int layerId,int maxLayerId,Vector v){}//单层切图
public OneLevelMapTilesGet(int layerId,int maxLayerId,Vector v,int tag)
private void getMap(){}从数据源中得到地图,包括加上背景图层。
DatasetVector dv =(DatasetVector)ds.getDatasets().get("backColor_1");
name=ds.getDatasets().getAvailableDatasetName("backColor");
dv=ds.getDatasets().create(newDatasetVectorInfo(name,DatasetType.REGION));
dv為数据集向量,以上为画背景图层图形所需的必要设置。
rs.addNew((Geometry)gr);
rs.refresh();
map.getLayers().add(dv, true);
将背景图层加到map中。
if(layer.getName().equals("房屋@pbn-catv"))
{
GeoStyle g=new GeoStyle();
g.setLineColor(Color.GRAY);
g.setLineWidth(0.1);
LayerSettingVector lsv=new LayerSettingVector();
lsv.setStyle(g);
layer.setAdditionalSetting(lsv);
}
map.open(mapName);//打开地图
Dimension d=newDimension(cib.getMapTileWidth(),cib.getMapTileHeight());
map.setImageSize(d);
double scale=cib.getInitMapScale();
map.setScale(scale);
Rectangle2D r=new Rectangle2D(cib.getMapInitPosition_Left(),cib.getMapInitPosition_Bottom(),cib.getMapInitPosition_Right(),cib.getMapInitPosition_Top());
map.setViewBounds(r);
public void maptoTiles(){}//切图。
String path=cib.getMapOutputPath();//图片存储路径
{map.outputMapToPNG(path+"\\\\1\\\\"+"1_0_0", true);//输为PNG图片
logger.info("The 1 layer has been completed!");//切图完成
private void close(){}//使用完数据源,工作空间,地图后,进行释放。
2.2.2实现结果
根据SuperMap GIS中的沈阳市地图信息,对其进行标准图片的生成,根据本文地理信息标准图片生成算法可知:当切图等级为n时,输出的图片数量是2n-1×2n-1,即当切图等级设置为3时输出的图片数量16张,以此类推。
3结论
立足有线电视网络管理中的地图调用效率低下问题,提出了一种基于GIS的地图瓦片生成算法,采用该算法可实现对地图的精细化切割,自由度较大,同时基于该算法生成的地图具有浏览、查询、地理分析等功能,极大地提高了网络管理效率,测试效果良好,能够满足有线电视网络管理需求。
参考文献:
[1]巫细波,胡伟平.Google Maps运行机制以及应用研究[J].华南师范大学(自然科学版),2009(2):106-110 .
[2]张康寿,等.基于RIA和Web Services的WebGIS系統的开发[J].地理空间信息:2009.
[3]耿庆斋,缪纶,段媛媛,等.基于Google Maps API的地图服务系统研究及应用[J].中国水利水电科学研究院学报,2009(3):62-66.
[4]刘冰,谢轲,陈小乐,等.基于GIS的瓦片式地图切图算法的设计与实现[J].科技信息,2011(7):60-61.
[5]王小军,刘璐.基于ArcGIS Engine进行瓦片式切图的技术研究[J].测绘与空间地理信息, 2010(8).
基金项目:徐州市科技计划项目(No. KC16GX038)。
作者简介:张铁(1970.12-),男,高级工程师,研究方向为网络管理.