用于构建 GIS 应用程序的地图组件 (GisMap)






4.47/5 (13投票s)
2005年10月30日
3分钟阅读

202156

22076
用于构建 GIS 和 CAD/CAM 应用的地图组件。读取大部分矢量和栅格格式,执行坐标系统转换,通过 web 服务访问航拍照片等等。
引言
GisMap 是一个用于构建 GIS 和 CAM/CAD 应用的 .NET 组件。它是 MVisionTech VisiWorks 数据可视化框架的一部分。GisMap 使用 Canvas 绘制几何形状,并使用 GDAL 项目处理不同的地理矢量和栅格格式。
地图对于定位分布在广阔区域的物体至关重要。许多类型的应用需要数据的地理展示,例如行程安排器、资产管理系统、车队管理、GPS 跟踪等等。所有这些类型的系统构成了 GIS 或地理信息系统。
一个经典的 GIS 系统由包含与对象相关的数据记录的表格和代表对象的几何形状(如多边形和折线)组成。GIS 系统中的表格代表地图中的不同图层。一些图层代表不同的功能对象,例如道路、县和城市,而另一些图层代表相同功能图层的不同分辨率,例如高速公路、主要道路和所有道路。卫星图像和航拍照片经常与其他几何对象结合使用。地理数据有不同的来源,GIS 系统供应商使用不同的文件格式在其系统中存储数据。 GIS 市场的一些主要参与者是 ESRI、MapInfo 和 Oracle。
GisMap 使用名为 GDAL(地理数据抽象层)的开源库来访问不同来源的地理数据。 GDAL 通过其 OGR 库支持大多数栅格格式(图像)和主要矢量格式。它还提供了用于地理坐标系统转换的类。
地理坐标系统是另一回事,存在许多不同的系统,其中一些非常奇特。原因是地球是一个球体(或者说几乎),人们喜欢在测量东西时使用方形坐标。因此,为了测量,他们使用球体各个部分在平面上的投影。然后,这些不同的投影源自不同的地方,取决于测量的是州、国家还是大陆。
最流行的坐标系统是 WGS-84(具有经度和纬度的球坐标系统)和 UTM,UTM 是 WGS-84 的 60 个圆柱投影系统。
上图显示了美国的主要道路,以及德克萨斯州某地的航拍图像。当用户放大和缩小地图时,GisMap 从 TerraService web 服务获取适当的图像大小和分辨率,并显示来自本地存储的形状文件的矢量数据。矢量数据以图层组织,每个图层对应不同的地图分辨率。GisMap 具有相同地理数据的两种不同视图,一种用于导航,另一种用于浏览。两个视图是同步的;导航视图上的小蓝色矩形显示了第二个视图的位置。
图层控件可用于调整不同图层的顺序和可见性。对于每个图层,用户可以指定最小和最大比例以从粗略视图切换到详细视图。
GisMap 有一个 DataGrid
,显示地图中地理对象的属性,当地图处于“查找”模式并且选择了对象时,GisMap 会显示与所选形状相关的记录。
使用代码
拥有地图组件的主要目的是在其他应用程序中使用它。
// first we need a canvas to draw our maps:
Canvas canvasGIS = new Canvas();
...
// then we create an object GisSelector that binds
// graphical shape representation with its tabular data:
GisSelector gisSelector = new GisSelector();
gisSelector.setCanvas(canvasGIS);
...
// To open vector geographical data
// (ESRI shape file for example) we use GisSelector,
// openGisFile returns list of data layers
// availible in the file
ArrayList al = gisSelector.openGisFile(fname);
...
// To open GeoTif images or other raster
// formats supportes by GDAL library
// we need to create image shape object derived
// from CanvasItem and attach it to the canvas:
GeomModel.CanvasLayer lay1 =
new GeomModel.CanvasLayer("geo_image",Color.BlueViolet,0,true);
GDalGIS.GdalImageCanvasItem geo_im =
new GdalImageCanvasItem(im_fname,lay1);
canvasGIS.AddShape(geo_im);
...
// There is another image object that encapsulates
// TerraService aireal photography Web Services:
GeomModel.CanvasLayer lay2 =
new GeomModel.CanvasLayer("terra_image",Color.BlueViolet,0,true);
TerraService.TerraServiceImage t_im =
new TerraService.TerraServiceImage(
"http:// terraserver-usa.com/ogcmap.ashx",lay2);
this.canvasGIS.AddShape(t_im);
设计
GisMap 使用 Canvas
组件创建图形,并使用 GDAL 数据抽象来访问地理数据。对于航拍照片,它使用微软的 TerraServise,这是一种美丽的东西。它覆盖了整个美国,分辨率为每像素 1 米。 GisMap 使用 OpenGIS Web Map 标准 (OGC Web Map Server) 来访问数据。
下面的类图显示了 GisMap 组件的主要类。它使用 Canvas
控件及其几何模型 (GeomModel) 来显示地图,并使用 GDAL 类来处理 GIS 数据、坐标系统和转换。