APP下载

基于多源地图服务的专题地图生成算法

2015-02-07

地理空间信息 2015年4期
关键词:专题地图图例瓦片

徐 亮

(1. 福建省基础地理信息中心,福建 福州350001)

基于多源地图服务的专题地图生成算法

徐 亮1

(1. 福建省基础地理信息中心,福建 福州350001)

在B/S体系结构下,实现基于地图切片和ArcGIS Server地图服务的专题地图动态生成算法。分析了地图切片的组织特点及其像素与坐标的转换方法,运用标准的REST访问接口和GDI+技术,设计并实现了多尺度、多源数据的裁剪、拼接以及在特定位置渲染地图要素的算法。并以山东省测量标志动态监管信息系统为例,证明了该方法的可行性。

地图切片;专题地图;多源;REST接口;GDI+

数据是GIS研究的基石,分布式地图服务是人们为了实现数据成果共享而采用的一种技术手段,当前在线电子地图几乎都使用分布式切片技术来提供一种低成本、流畅的、数据丰富的在线服务,并且将服务免费共享给其他用户使用。随着各种OGC地图服务标准的制定,网络上呈现出很多标准化的地图服务,这些不同来源的地图数据,使人们有了更多的选择。然而,有时对地图切片的简单浏览并不能满足用户的特定需求,他们希望利用网络地图作为自己的基础数据,并结合自己的专题业务数据,制作一幅专题地图,以满足特定的应用需求。但是,这些服务是基于网络形式发布的,即便提供了方便的访问接口,也很难满足用户的特殊需求。对此问题,国内的研究绝大多数局限于抓取切片和单数据源切片拼接[1-3]。

1 专题图生成方法

专题图在服务器端生成,客户端向服务器发送请求,并附带多源数据相关参数和输出的专题图参数,服务器端程序对请求进行处理,根据参数进行相关计算,并从远程地图服务器提取地图数据,然后按一定的规则进行拼接、异源数据叠加、裁剪等数据处理,最后绘制专题地图辅助要素,并将处理好的结果输出到客户端(图1)。

图1 专题数据处理流程

1.1 GDI+技术

GDI是Window操作系统的图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。GDI+是GDI的改进版本,是面向对象编程的图形框架,相对于GDI具有更高的编程效率、更快的绘图速度、更稳定的内存资源管理。

GDI处理图像是在Window坐标空间进行的,Window有3种坐标空间,分别为逻辑坐标、设备坐标、物理坐标。GDI+绘图时,是在逻辑坐标系下进行的,它与地理坐标系不同,它的位置可以由用户自己设定,和具体的硬件设备无关[4]。它以像素点作为坐标单位,坐标原点可以用户自行设定,一般在一个图形画布的左上角,X轴水平向右为正,Y轴竖直向下为正,与地理坐标系的Y轴方向相反。

目前电子地图的开发多是基于MapObjects、Mapx等GIS控件或是直接利用高级语言从底层开发,其本质还是利用Windows提供的图形绘制接口(GDI)编程实现图形显示[5]。

1.2 地图瓦片

地图瓦片(map tile,又称“地图缓存”)是按照一定的数学规则,在预先设定的不同比例尺下,把整个地图切割成一定规格大小的图片,并保存图片副本拷贝到地图服务器中。当服务器收到客户端对地图服务的请求时,就会根据切割和存储规则,找到图片并发送到客户端,从而有效地减轻GIS服务器的负荷,提升地图浏览速度。

瓦片的切割是基于金字塔模型进行的,该模型是一种多分辨率层次模型,从金字塔的底层到顶层,地理范围不变,但分辨率越来越低。如图2所示,在切割金字塔瓦片的同时建立线性四叉树编码[6],然后发布成符合标准OGC WMTS服务规范的地图服务。根据这个规范定义的标准接口,可以获取任意位置的地图瓦片。

图2 瓦片金字塔模型[6]

1.3 瓦片索引转换

瓦片在空间上的组织方式表示为行列号,以左上角为编号原点,定义为(0,0),即行号为0,列号为0,然后行列坐标轴分别向右和向下延伸。在标准OGC的WMTS服务规范中,提供了获取瓦片的GetTile接口,它需要2个基本参数,即行号和列号,可以根据地图分辨率和瓦片像素大小计算特定地理范围所对应的瓦片行列号。首先,根据瓦片地图服务元数据提供的当前输出比例尺的地图分辨率,可以计算出一个切片像素大小 (切片像素大小一般为256×256) 所代表的地理范围,然后通过地图范围和用户选取的地理范围,计算出对应的切片坐标范围。计算公式如下:

picHWDegree = Resolution * picHW

左下点列号=(ExtentXMIN + FullExtentXMAX)/ picHWDegree-1

右上点列号=(ExtentXMAX + FullExtentXMAX)/picHWDegree-1

左下点行号=(FullExtentYMAX - ExtentYMIN)/ picHWDegree-1

右上点行号=(FullExtentYMAX - ExtentYMAX)/picHWDegree-1

其中,Resolution为地图分辨率;picHW为切片像素长宽;picHWDegree为切片像素大小对应的地理坐标 范 围;ExtentXMIN、ExtentXMAX、ExtentYMIN、ExtentYMAX为用户选取范围的最小x坐标、最大x坐标、最小y坐标、最大y坐标;FullExtentXMAX、FullExtentXMAX、FullExtentYMAX、FullExtentYMAX为地图范围的最小x坐标、最大x坐标、最小y坐标、最大y坐标。

1.4 叠加偏移

考虑到算法的一般性原则,采取所有叠加图和要素添加到专题图后再进行裁剪的方法。在将非底图地图服务数据添加到底图上时,需要计算X和Y轴的偏移量。如果叠加的是WMS服务或MapServer服务,那么可以输出一张与用户选取范围相同的图片,这样只需要考虑左上角的偏移量。WMS或MapServer在ArcGIS Server中,默认输出最大像素大小为2 048×2 048的图片,当输出范围超过这个像素范围时,这种情况与输出的瓦片形式的叠加图类似,需要先拼接选择范围内的所有图片再进行叠加。左上角偏移像素的计算公式如下:

offsetX =(ExtentXMIN/picHWDegree%1)*picHW

offsetY =(1-( ExtentYMAX/picHWDegree%1))* picHW

1.5 辅助要素的绘制

图例是地图上表示地理事物的符号,它有助于用户更方便地使用地图、理解地图内容。图例包含标题、图层名、地图符号及其所代表的值、值范围或意义,一般放置在一侧或一角。图例的布局按左对齐的方式进行排版,放置在右下角,图例绘制流程如下:

1)根据图例内容、间距以及排列方式计算适应的图例画布的高度和宽度。

2)通过专题地图的总长宽和图例画布,计算画布距离左边界和上边界的间距,在地图右下角绘制图例的矩形画布。

3)图例名称水平居中绘制,因此需要根据名称字体样式和字符长度计算图例名所占空间的高度和宽度,然后根据上一步计算的画布宽度,得到水平居中的绘制起点。

4) 按一定的行间距换行,左对齐绘制图层名称。

5)按一定的行间距换行,绘制图层符号以及符号注释文本。

6)按3)和4)的步骤循环绘制出所有图层的图例。

PmGSTd1 cDNA全长为977 bp,ORF为720 bp,5′端非编码区 166 bp,3′端非编码区 78 bp(图 1)。该基因编码 240个氨基酸,N端 1-18号氨基酸(MKHSLALLAIAFLQTAIA)为信号肽(图1双划线部分),可以推测其为 1个分泌蛋白;另外,3′端存在一个可能的AATAAA加尾信号(图1下划线部分)。PmGSTd1编码氨基酸的理化性质如表 1所示,PmGSTd1编码240个氨基酸,分子质量为27.28 kD;该蛋白呈弱疏水性,结构稳定;等电点为8.41,说明此蛋白在pH=8.41的溶液中最不稳定,溶解度最小。

1.6 拼接、裁剪、叠加的实现

切片或矢量图片的拼接、叠加、裁剪关键在于计算偏移像素,拼接的偏移是根据绘制的切片行列号计算得到的,叠加计算按§1.4中所述思路,裁剪的偏移是要计算左上角和右下角的偏移像素,并根据选取范围和§1.4中的计算思路计算得到。本研究采用GDI+进行实现,使用到的关键类包括System.Drawing.Bitmap、System.Drawing.Image和 System.Drawing.Graphics,前者封装了一个位图,Image类保存切片或矢量图片;后者封装了一个绘图图面,它提供了绘图的主要方法。以下是实现拼接的示例代码:

//创建位图

Bitmap bitmap = new Bitmap(width, height);

//在位图中创建绘图图面

Graphics g = Graphics.FromImage(bitmap);

//设置绘图参数

g.CompositingQuality = CompositingQuality. HighQuality;

g.InterpolationMode= InterpolationMode. HighQualityBicubic;

g.SmoothingMode = SmoothingMode.HighQuality;

g.Clear(Color.White);

//获取一个切片,并根据,偏移量和切片长度和宽度,绘制到位图上

//url服务地址,row,col,是请求的行列号

Image tile = getImage(string.Format(url, row, col))

g.DrawImage(tile,new Rectangle(tileOffsetX,tileOffse tY,picWidth, picWidth));

其中,tileOffsetX=tileOffsetY=当前拼接的切片所在画布中的行列数×picWidth。Width和Height为画布的长和宽,是将选取的地理范围转换成像素得到的,为一个切片像素大小的整数倍。

2 应用实例

本示例调用了天地图山东的WMTS服务和系统在ArcGIS Server中发布的Map Services服务,通过多源数据叠加融合生成一幅标志点专题地图,各种数据源的资源访问均使用Rest访问接口实现,它暴露的所有资源和操作都可以通过每个GIS服务的端点获得[7]。WMTS的REST接口如下:

string url =”http://www.sdmap.gov.cn/tileservice/{0}?

SERVICE=WMTS&VERSION=1.0&username=test 123&password=test123&REQUEST=GetTile&LAYER=0 &STYLE=default&FORMAT=mage/png&TILEMATRIX SET=sss&TILEMATRIX={1}&TILEROW={2}&TILEC OL={3}";

其中,{0}为地图类型变量;{1}为比例尺;{2}和{3}分别为行列号变量。调用以下代码获取切片数据:

HttpWebRequest req=(HttpWebRequest)WebRequest. Create(url);

HttpWebResponse resp = (HttpWebResponse)req. GetResponse();

Stream stream = resp.GetResponseStream();

return System.Drawing.Image.FromStream(stream);

Map Services服务的REST接口与之类似,但是需要调用服务的Export操作接口,并调用以上代码获取图片数据。图3为本项目效果图,可控制是否输出图例。

图3 生成的专题图

3 结 语

以天地图山东地图服务为背景底图,以项目的业务数据为专题数据进行处理,可根据用户需要,依据标准OGC服务接口,生成特定范围和比例尺、用于特定使用场合的标准专题地图。结果表明,本方法可以较合理地生成标准专题地图。

[1] 王晓东,刘慧平,乔瑜.利用Bing Maps地图切片实现网络地图服务[J].国土资源遥感, 2010(2):122-127

[2] 刘亚东,李青元,谭海,等.开源库GDAL及其在影像拼接中的应用[J].数字技术与应用,2010(2):88-89

[3] 韦胜.ArcEngine环境下实现瓦片地图的访问与拼接[J].武汉大学学报:信息科学版,2012(6):737-740

[4] 王社伟,朱如鹏.Windows操作系统中的GDI坐标系统[J].计算机与现代化,2003(4):13-15

[5] 车森,刘海砚,刘辉,等.GDI+在电子地图可视化中的应用[J].测绘科学,2008(1):226-228

[6] 苏旭明,谭建成. WebGIS中瓦片地图关键技术研究[J].北京测绘,2012(2):9-12

[7] 许卓明,栗明,董逸生.基于RPC和基于REST的Web服务交互模型比较分析[J].计算机工程,2003,29(20):6-8

P208

B

1672-4623(2015)04-0168-03

10.3969/j.issn.1672-4623.2015.04.060

徐亮,硕士,工程师,研究方向为数据库技术和GIS应用。

2015-01-22。

项目来源:福建省测绘地理信息科技创新基金资助项目(201309)。

猜你喜欢

专题地图图例瓦片
打水漂
一种基于主题时空价值的服务器端瓦片缓存算法
惯性
基于数据库的专题地图编制问题探讨
基于数据库的专题地图编制问题探讨
找拼图
犬狗的画法(六)
基于CorelDRAW与MAPGIS的专题地图制作技巧
如何让学生巧用图例解决数学问题
可爱的小鸟