您的位置:首页 > 产品设计 > 产品经理

基于.NET 2.0的GIS开源项目SharpMap分析手记(九):SharpMap中Styles和Geometries名称空间下有关类的分析

2008-03-11 13:57 666 查看
基于.NET 2.0的GIS开源项目SharpMap分析手记(九):SharpMap中Styles和Geometries名称空间下有关类的分析粟卫民 http://www.gisdev.cn/ http://blog.csdn.net/suen/ 日期:2007-6-15转载自:心帆http://group.qq.com/group_index.shtml?groupid=8755486

1 Styles名称空间下有关类的分析

1.1 概述

Style,译为样式,是在绘制图形时使用。 GIS中,系统在保存数据时,有的格式对每一个要素有其的显示样式,比如Mapinfo;有的不保存,比如Shapefile。无论是否保存,在绘制图形时,都需要使用样式来显示一个要素。比如一个要素是用来表示公路,一个要素用来表示河流,他们在文件存储时是没有太大的区别,而在绘制时,由于使用了不同的样式,就可以很明显的看出来。

1.2 与其他模块的关系

样式的使用,在SharpMap中,主要是有图层绘制(又称为图层渲染)时使用,具体见VectorLayer.cs中的Render方法。 在VectorLayer中,包含有一个样式对象(见private Styles.VectorStyle _Style;),说明SharpMap的思路是一个图层只能有一种显示样式(专题图时例外)。同时,SharpMap与Shapefile文件格式非常近,一个图层也只有一种类型的数据(要么都是点,要么都是线,要么都是面)。而Mapinfo则不是这样,一个图层可以包含有点线面各种数据。SharpMap使用这样的方式,也是出于简单易行的目的。

1.3 本身的构成

SharpMap中,实现IStyle接口的有两个类,VectorStyle和LabelStyle。 VectorStyle是用来绘制矢量要素的,点或者线或者面都可以使用这个类的对象来进行绘制,但是不同的几何类型是使用VectorStyle对象中的不同成员(似乎在设计时有缺陷,比方如果这个图层都是线,那VectorStyle中的_FillStyle就不用,但这好像不太合理)。查看VectorStyle的几个成员,很容易明白各个成员的意义。 LabelStyle用来绘制标注文本,可以设置其字体,颜色,大小,背景发光,以及水平对齐和垂直对齐方式等等,应该说对一般的文本显示来说够用了。 SharpMap中由于使用的是样式,没有符号库的概念,所以只有使用一些GDI+中的基本画笔、画刷对象,不能绘制出复杂的符号,尤其是线符号是没办法解决的,比方说国界的符号,桥梁的符号等等。

2 Geometries名称空间下有关类的分析

2.1 Geometries概述

Geometry在此处指的是现实世界中的各种事物抽象出来的几何描述,从大的方面来讲,就是点、线、面三种类型,个人认为译为几何类型比较合适。例如,一个城市可以抽象为一个点,一条道路可以用一条线来描述,大面积的湖泊则可以用面来描述。 应该注意还有一个词汇Feature,一般译为要素。要素在理解上是对现实世界中的一个对象的完整描述,现实中的对象,除了用几何类型来描述其位置信息,还应该有其他的属性信息。例如,一个城市,可以用一个点描述其位置信息,再加上城市的名称、人口数、面积等等其它属性,就构成了Feature。简单的说,就是Geometry加上其他的属性信息可以构成Feature。 SharpMap中的Geometry使用的是OpenGIS中对几何类型的规范,在本文的第三部分中将会详细说明Geometry下的各个子类。

2.2 与系统其他类的关系

Geometry是SharpMap中的基础,用来的它的地方主要是在数据访问与图层绘制以及空间分析和空间关系判定时。 GIS中,矢量数据一般是以记录的形式存储在文件或者数据库中(一个要素对应一条记录),一个底层平台软件,需要将数据读取出来,然后在内存中构建成Feature,而大部分的空间分析与操作,需要提取Feature中的Geometry来进行,比方判断两个对象是否包含。 数据访问需要解决的问题就是要将文件或者数据库中的要素读取出来,构建内存中的要素。 如果系统设计的要素不全,有些文件中的Geometry就完全正确的读取。比如Mapinfo中有圆对象, 而SharpMap的Geometry没有相关的类,这时要么把圆对象抛弃,要么用转换的方法,比如可以在圆周上加密点,然后以面对象构建它。 从抽象的角度来看,系统的几何类型是越少越好,但是从功能和兼容其他数据的角度,系统的几何类型是越丰富越好,这是一对矛盾。应该说使用OpenGIS中的几何类型,也可以描述出现实世界了。任何一个软件不可能解决所有的问题。 图层绘制,就是需要将内存中Geometry绘制成屏幕上的图形,这个地方一般来说都需要Geometry。(有一种做法其实也可以不用Geometry,那就是读取一条要素后,放入一个事先开辟好的足够大的内存空间,然后直接绘制出来。但是这不太合理) 空间分析使用Geometry是很容易理解的,很多分析都是直接在Geometry类的基础上做的,比方说点、线、面的缓冲区就可以如此。 空间关系的判定也需要使用,比方说要判断对象是否相交时,如果没有构建两个Geometry,就没办法判断这两个几何体是否相交。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐