卫启云,张学全,王 伟
(1. 太原市基础地理数据中心,山西 太原 030009; 2. 中国电子科技集团第二十八
研究所,江苏 南京 210007; 3 . 武汉大学测绘遥感信息工程国家重点实验室,湖北 武汉 430079)
WEI Qiyun,ZHANG Xuequan,WANG Wei
.NET平台下二维地图控件的设计与实现
卫启云1,张学全2,王伟3
(1. 太原市基础地理数据中心,山西 太原 030009; 2. 中国电子科技集团第二十八
研究所,江苏 南京 210007; 3 . 武汉大学测绘遥感信息工程国家重点实验室,湖北 武汉 430079)
Design and Realization of Two-dimensional Map Controls Based on .NET
WEI Qiyun,ZHANG Xuequan,WANG Wei
摘要:在专题地理信息系统中采用自制的地图控件,具有针对性强、体积小和拥有自主产权等优点。本文从控件结构、数据绘制、图层渲染和地图操作4个方面研究了二维地图控件的设计,并加以实现。
关键词:地图控件;数据绘制;图层渲染;地图操作
中图分类号:P208
文献标识码:B
文章编号:0494-0911(2015)09-0107-02
收稿日期:2015-06-19
作者简介:卫启云(1966—),男,高级工程师,研究方向为数字城市地理空间框架及智慧城市时空信息云平台。E-mail: wqy8504@163.com
abstractGDAL(geospatial data ion library)是一个在X/MIT许可协议下的开源栅格空间数据转换库,它利用抽象数据模型来表达所支持的各种文件格式,此外,还有一系列命令行工具来进行数据转换和处理。
一、引言
组件式GIS开发是当前GIS开发的主流方式,即通过购买ArcObjects、MapX、SuperMap Objects等组件,供用户进行二次开发。这种利用组件工具进行GIS平台开发的方式,具有系统稳定、资源丰富、开发效率高且难度低等优点。然而,在专题地理信息系统中,这种方式存在着极大的缺点:购买价格昂贵,而资源使用率很低;功能太泛,不适合于某一专业GIS系统;没有自主产权,在很大程度上受制于生产厂商。本文将介绍基于.NET的自定义二维地图控件,并在某气象信息系统中加以实现。
二、地图控件的总体设计
二维地图控件包含一些基本的功能:对矢量数据、栅格数据和气象数据的加载;对地图图层进行特定的渲染;支持对地图的缩放、漫游等基本操作。
控件的系统结构如图1所示。
地图控件MapControl的主要类是Map类,它封装了地图投影(Spatial Reference)、视图范围(Extent)等属性。Map包含若干个图层(Layer)。Layer基类又派生为3种类,即矢量图层(FeatureLayer)、栅格图层(RasterLayer)和气象图层(MeterLayer)。
Layer中主要封装了DataSource和Renderer属性。DataSource封装了Layer的数据,即由若干Geometry组成。Geometry的组织结构参考OpenGIS定义的Geometry Object Model。Renderer封装了对Layer数据的渲染方式。
图1 控件的系统结构
三、地图控件的具体实现
GDI+是微软在Windows 2000以后操作系统中提供的新的图形设备接口,其通过一套部署为托管代码的类来展现,这套类被称为GDI+的托管类接口。GDI+主要提供了3类服务:二维矢量图形、图像处理和文字显示。
基于.NET平台使用GDI+绘图,使得应用程序开发人员在输出屏幕和打印机信息时无须考虑具体显示设备的细节,只需调用GDI+库输出的类的一些方法即可完成图形操作,真正的绘图工作由这些方法交给特定的设备驱动程序来完成,GDI+使得图形硬件和应用程序相互隔离,从而使开发人员编写设备无关的应用程序变得非常容易。
OGR是GDAL项目的一个分支,功能与GDAL类似,只不过它提供对矢量数据的支持。很多著名的GIS类产品都使用了GDAL/OGR库,包括Esri的ArcGIS、Google Earth和跨平台的GRASS GIS系统。
以下为调用OGR库读取shapefile文件部分代码:
OSGeo.OGR.Ogr.RegisterAll(); ∥注册所有格式的驱动
OSGeo.OGR.Driverdr=OSGeo.OGR.Ogr.GetDriverByName("ESRI shapefile");∥获取ESRI shapefile驱动
OSGeo.OGR.DataSource ds=dr.Open(path,0); ∥打开数据源
intlayerCount=ds.GetLayerCount();∥获取图层数
OSGeo.OGR.Layer layer=ds.GetLayerByIndex(0); ∥获取第一层
OSGeo.OGR.FeatureDefnogrFDefn=layer.GetLayerDefn();∥获取图层信息
一个图层包括图层名、范围、投影信息等属性,此外,还应定义一个渲染(Renderer)属性。
Renderer的组织结构如图2所示。
从Renderer派生3种渲染类型,即矢量渲染(FeatureRenderer)、栅格渲染(RasterRenderer)和气象渲染(MeterRenderer)。
图2 Renderer类的结构
Renderer的符号(Symbol)属性是用于修饰要素的对象,它派生为3种符号类型,即点符号(PointSymbol)、线符号(PolylineSymbol)和面符号(PolygonSymbol)。如对于面要素,PolygonSymbol可以设置面的边框线型、边框颜色和填充颜色等属性。
地图的缩放操作实际上是对Map的Extent进行操作。放大地图时,即将Extent范围缩小,使其显示在屏幕上处于放大状态;缩小地图时,即将Extent范围变大,使其显示在屏幕上处于缩小状态。
一般在缩放过程中,并不是所有的图形都能够显示在屏幕上。而一般的绘图机制则是把所有图形元素,不管是屏幕内的还是屏幕外的都进行绘制,严重地影响了显示或绘制的速度,同时放大比例越大,影响就越大。因此,应当在绘图前首先判断这一图形元素是否显示在视图屏幕上:如果在,则绘制;否则不予处理。
地图的漫游操作即对当前的视图范围进行移动操作。当鼠标左击进行移动时,计算鼠标的移动距离,并转换为Extent的变化。当松开鼠标时,刷新Extent内的要素,就达到了漫游的效果。
考虑到地图的数据量较大,在进行移动时,不应该实时刷新要素,因为这样会影响显示速度。因此,在鼠标移动时应该只移动图像而不刷新要素,只在最后松开鼠标时刷新要素并显示。
四、利用地图控件开发的GIS平台实例
在数字城市GIS平台中,通过引用该二维地图控件,实现了数据的加载、渲染和缩放漫游等功能,如图3所示。
以下为加载矢量数据和气象数据的部分代码:
图3 数字城市GIS平台
FeatureLayerlayer1=Algorithms.ReadShpFile(dataPath+@"世界地图.shp"); ∥初始化矢量图层,读取shapefile文件
layer1.Renderer=renderer1; ∥图层渲染
MapControl.AddLayer(layer1); ∥加载矢量图层
MeterLayer layer2=new MeterLayer(); ∥气象图层初始化
MeterLayer.DataSource=geometries; ∥设置气象图层数据源
layer2.Renderer=renderer2; ∥图层渲染
MapControl.AddLayer(layer2); ∥加载气象图层
MapControl.Refresh(gaeaViewDrawPhase.gaeaViewAll, null, null); ∥刷新
五、结束语
本文基于 .NET自定义的二维地图控件实现了数据的加载、 图层的渲染及缩放漫游等操作。在专
题地理信息系统中,采用自制的地图控件,有针对性强、体积小和拥有自主产权等优点。当然,自定义二维地图控件需要开发者掌握GIS底层技术和方法,这也增加了系统的开发难度。
参考文献:
[1]刘恺,杨春全,刘达. 基于C#的地理信息控件研究[J].测绘与空间地理信息,2010,33(1):76-77.
[2]苗启广,杨思燕,王宝树,等. 基于GIS技术的军用地图控件的设计[J]. 电光与控制,2003,10(3):56-60.
[3]宋金红,张熠斌,隋立春.基于组件式GIS的城市信息查询系统的设计与开发[J].测绘通报,2011(1):56-58.
[4]张海堂,罗睿. 基于Mapx的多比例尺地图数据无缝显示[J]. 测绘通报,2005(1):32-34.
[5]袁斌.GML地图近代件的设计与实现[J]. 测绘工程,2012(2):64-69.
[6]邢汉发.面向更新的网络化空间标报模型研究[J].测绘学报,2014,43(8):880.