SharpMap深度分析:地图数据Provider

前面对SharpMap源码做了一个走马观花式的分析,没有深入一些细节性的东西,SharpMap深度分析则就自己觉得比较有代表性的几个方面作一些深入分析。

地图数据Provider

Provider或者Provider模式对于很多人应该都不陌生,在DNN和Asp.net 2.0中都大量应用了Provider模式。目前主流的GIS平台的数据提供也应该基本上都是基于Provider这样的模式,大家比较熟悉的应该是SuperMap提出的多源空间数据引擎的概念。

在SharpMap里,数据Provider是这样使用的:

string ConnStr = "Server=127.0.0.1;Port=5432;UserId=postgres;Password=password;Database=myGisDb;";
myLayer.DataSource = new SharpMap.Providers.PostGIS(ConnStr, "myTable", "the_geom", 32632);

而实际上,在Layer类里,DataSource定义为:

public SharpMap.Data.Providers.IProvider DataSource
{
    ...
}

也就是说,这里的Provider是针对IProvider接口的,这样,对于不同的层,你可以指定不同的数据源(使用不同的数据Provider,而支持不同的数据格式)。下面是Provider接口的类图,定义了接口的属性和操作:

个人认为,Provider的核心思想在于面向接口编程,也就是说通过接口定义需要的服务,至于服务的实现,可以通过具体的方式来实现。就GIS数据引擎来说,就是定义对空间数据需要的操作,例如打开、关闭、读取某个范围内的数据、检索、分析等等这些接口,然后通过继承这个接口来实现对不同的数据的操作。例如对Shape文件的操作和对PostGIS文件的操作是完全不同的,但其接口一致。而在系统内部,对数据的操作,例如放大缩小、变换、显示,只需要针对接口编程,就可以实现支持不同的数据源。

这里的实现和DNN等的不同在于,DNN是通过配置文件和反射机制,来实现不同的Provider的更换,而无须更改代码实现,而SharpMap或其他GIS的类似实现是需要在开发时指定使用的Provider。

Provider的实现还有一个比较重要的问题就是要操作的数据的定义,因为具体的Provider的实现最终要将数据转换为系统内部的数据类型和结构,然后返回。

对于具体的Geometry的结构,基本上是在OGC的规范的基础上实现,对于这部分内容,很多非GIS的面向对象的书也喜欢用这个来讲述类、对象、继承等概念,大家都很熟悉,这里就不多说了。对OGC的Simple Feature实现比较好的一个.net类库是NTS(JTS的.net移植版本),目前正在看他的源码,后面会写一些自己的笔记。SharpMap的一些代码,看注释也是在NTS的基础上实现的。

SharpMap的Provider没有定义数据的修改、编辑,从理论上讲,完全可以实现任意数据的读取、修改,但实际上,数据的读取显示一般来说,实现难度不是很大,因为大家都是点线面及其组合这样的对象;但由于内部结构,拓扑关系,修改就比较困难了。例如SuperMap的产品也只是可以只读读取一些其他格式的数据(如MicroStation DGN,AutoCAD数据),而没有修改功能。

posted on 2006-03-06 17:06  马维峰  阅读(9841)  评论(7编辑  收藏  举报