zoukankan      html  css  js  c++  java
  • 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数据),而没有修改功能。

  • 相关阅读:
    NVIC
    ONE WIRE
    对话框
    STM32_USART
    [Java]eclipse的使用
    [转] Android资源管理框架(Asset Manager)简要介绍和学习计划
    [其他]网站收录
    [Java]Java简介
    [网络技术]网关 路由器 OSI
    [安卓]安卓模拟器(Android Emulator)
  • 原文地址:https://www.cnblogs.com/maweifeng/p/344082.html
Copyright © 2011-2022 走看看