`
Virgo_S
  • 浏览: 1150936 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

加载地图数据的几种方法(AE + C#)

阅读更多
任何系统都离不开数据的加载,下边就AE中几种常用的数据加载做一个列举。以便查阅:

1、加载个人数据库
个人数据库是保存在Access中的数据库。其加载方式有两种:通过名字和通过属性加载(也许不只这两种,AE中实现同一功能可以有多种方式)。
A、通过设置属性加载个人数据库。
首先通过IPropertySet接口定义要连接数据库的一些相关属性,在个人数据库中为数据库的路径,例如:
IPropertySet  Propset = new PropertySetClass(); 
           Propset.SetProperty("DATABASE",@"D:\test\Ao\data\sh\MapData.mdb" );
      当定义完属性并设置属性后就可以进行打开数据库的操作了,在ArcEngine开发中存在IWorkspaceFactory、 IFeatureWorkspace、IFeatureClass、IFeatureLayer等几个常用的用于打开和操作数据空间地物的接口。 IWorkspaceFactory是一个用于创建和打开工作空间的接口,它是一个抽象的接口,我们在具体应用时要用对应的工作空间实例化它,如下:
IWorkspaceFactory Fact = new AccessWorkspaceFactoryClass ();
如果我们打开的是SDE数据库就要用SdeWorkspaceFactoryClass实例化Fact。当我们完成了工作空间的实例化后就可以根据上边设置的属性打开对应的Access数据库了。打开方式如下:
         IFeatureWorkspace Workspace = Fact.Open(Propset,0) as IFeatureWorkspace;
打开Access工作空间后接下来的事情是做什么了,很简单,找到对应的地物类,赋给相应的层,通过MapControl控件添加对应的层,然后刷新地图。以下为添加某一层的代码:
       IFeatureClass Fcls = Workspace.OpenFeatureClass("District");
       IFeatureLayer Fly = new FeatureLayerClass();
       Fly.FeatureClass = Fcls;
       MapCtr.Map.AddLayer (Fly);
       MapCtr.ActiveView.Refresh();
其中District为地物类的名字,MapCtr为AE中MapControl的对象。上边的通过属性设置加载数据空间的方式还可以用于SDE 数据库,在SDE数据库加载时会介绍。
以下为通过设置属性加载Access数据库的完整C#代码:
public void AddAccessDBByPro()
{
       IPropertySet  Propset = new PropertySetClass(); 
       Propset.SetProperty("DATABASE",@"D:\test\Ao\data\sh\MapData.mdb" );
       IWorkspaceFactory Fact = new AccessWorkspaceFactoryClass ();
       IFeatureWorkspace Workspace = Fact.Open(Propset,0) as IFeatureWorkspace;
         
       IFeatureClass Fcls = Workspace.OpenFeatureClass ("District");
       IFeatureLayer Fly = new FeatureLayerClass();
       Fly.FeatureClass = Fcls;
 
       MapCtr.Map.AddLayer(Fly);
       MapCtr.ActiveView.Refresh();
}
B、通过数据库名字加载个人数据库
在这我先把完整的代码写出来,让您先跟上边的代码做个对比。以下为完整的代码:
public void AddAccessDBByName()
{
      IWorkspaceName  pWorkspaceName = new WorkspaceNameClass() ;
    pWorkspaceName.WorkspaceFactoryProgID = "esriDataSourcesGDB.AccessWorkspaceFactory";
      pWorkspaceName.PathName = @"D:\test\Ao\data\sh\MapData.mdb";
      IName n = pWorkspaceName as IName ;
      IFeatureWorkspace Workspace = n.Open() as IFeatureWorkspace;
                                                             
     IFeatureClass Fcls = Workspace.OpenFeatureClass ("District");
     IFeatureLayer Fly = new FeatureLayerClass();
     Fly.FeatureClass = Fcls;
     MapCtr.Map.AddLayer (Fly);
     MapCtr.ActiveView.Refresh();
}
细心的人已经注意到,打开Access工作空间后接下来的代码是一样的,都是找到对应的地物类,赋给相应的层,通过MapControl控件添加对应的层,然后刷新地图。现在讲解一下上边的代码,首先是创建一个个人数据库工作空间名,在指定工作空间名的ProgID,以确定打开的是什么类型的工作空间,例如在打开Access个人数据库时使用的是下边的代码:
  IWorkspaceName  pWorkspaceName = new WorkspaceNameClass() ;
pWorkspaceName.WorkspaceFactoryProgID = "esriDataSourcesGDB.AccessWorkspaceFactory";
pWorkspaceName.PathName = @"D:\test\Ao\data\sh\MapData.mdb";
属性WorkspaceFactoryProgID可以确保工作空间是AccessWorkspaceFactory,即个人数据库,同时指定要打开数据库的路径。为了打开数据库,我们通过AE的类图可以发现打开工作空间必须使用IName接口(个人认为,不一定正确,可以思考一下看有其他办法没有),所以接着定义IName对象,并把工作空间名转换成IName类型并赋值给IName对象,然后通过IName对象的Open()方法打开相应的工作空间,代码如下:
IName n = pWorkspaceName as IName ;
IFeatureWorkspace Workspace = n.Open () as IFeatureWorkspace;
接下来的事情就是上边提到。
2、加载SDE数据库
什么是SDE数据库?这个问题要详细地讲解将花费大量的时间,但我可以告诉你SDE空间数据库可以是任何关系数据库。ESRI公司为了使空间数据能保存在关系数据库中,并且能很好的查询相关的空间属性而开发的一个中间件,使用SDE能很好的将空间数据保存在关系数据库中。如Orcale, SQL Server 等。SDE具体细节的了解请查找相关的资料,这里只介绍怎么连接SDE数据库。SDE数据库的联机分为直接连接和通过SDE连接。当服务器的性能比较好的时候可以采用SDE连接,否则采用直接连接,这样可以减轻服务器的任务。建议采用直接连接,其实,SDE连接方式和直接连接的方式只是一个属性参数设置的问题。跟个人数据库采用属性连接的方式一样,先定义一个属性对象,然后设置属性参数,接着定义一个工作空间并用 SdeWorkspaceFactoryClass()实例化它,接着加在加载图层,至于加载图层的代码,与加载个人数据库中图层的方法一样,其实不只加载这两种数据类型,加载其他类型的数据时也是采用相同的方法加载图层,只是工作空间采用不同的实例而已,下边为完整的对吗”//”后的为注析:
public void AddSDELayer(bool ChkSdeLinkModle)
{
     //定义一个属性
     IPropertySet  Propset = new PropertySetClass(); 
     if (ChkSdeLinkModle==true) // 采用SDE连接
     { 
            //设置数据库服务器名,服务器所在的IP地址
           Propset.SetProperty ("SERVER", "192.168.2.41");
            //设置SDE的端口,这是安装时指定的,默认安装时"port:5151"
           Propset.SetProperty ("INSTANCE", "port:5151");
            //SDE的用户名
           Propset.SetProperty ("USER", "sa");
            //密码
           Propset.SetProperty ("PASSWORD", "sa");
          //设置数据库的名字,只有SQL Server  Informix 数据库才需要设置
           Propset.SetProperty ("DATABASE", "sde");
           //SDE的版本,在这为默认版本
           Propset.SetProperty ("VERSION", "SDE.DEFAULT");
     }
     else // 直接连接
     {
           //设置数据库服务器名,如果是本机可以用"sde:sqlserver:."
           Propset.SetProperty ("INSTANCE", "sde:sqlserver:zhpzh");
            //SDE的用户名
           Propset.SetProperty ("USER", "sa");
            //密码
           Propset.SetProperty ("PASSWORD", "sa");
          //设置数据库的名字,只有SQL Server  Informix 数据库才需要设置           
          Propset.SetProperty ("DATABASE", "sde");
          //SDE的版本,在这为默认版本
          Propset.SetProperty ("VERSION", "SDE.DEFAULT");
    }
    //定义一个工作空间,并实例化为SDE的工作空间
    IWorkspaceFactory Fact = new SdeWorkspaceFactoryClass();
    //打开SDE工作空间,并转化为地物工作空间
    IFeatureWorkspace Workspace = (IFeatureWorkspace )Fact.Open(Propset,0);
    /*定义一个地物类,并打开SDE中的管点地物类,写的时候一定要写全.如SDE中有一个管点层,你不能写成IFeatureClass Fcls = Workspace.OpenFeatureClass ("管点");这样,一定要写成下边的样子.*/
       IFeatureClass Fcls = Workspace.OpenFeatureClass ("sde.dbo.管点");
           
       IFeatureLayer Fly = new FeatureLayerClass ();
       Fly.FeatureClass = Fcls;
       MapCtr.Map.AddLayer (Fly);
       MapCtr.ActiveView.Refresh ();
    }
不知道注意到了没有,直接连接跟SDE连接的最大的不同是直接连接不要设置端口,同时他们的参数设置也不一样,好好注意参数的设置。

3、加载CAD图层
CAD图层的加载可以分为:分图层加载和整幅图加载
A、分图层加载
我们可以把CAD图分为点、线、面、标注加载到MapControl中,跟加载其他数据一样,首先要定义一个工作空间,并用 CadWorkspaceFactoryClass()实例化它,当得到了工作空间后就可以打开相应的工作空间,然后再打开指定的层类型。下边为完整的代码:
 public void AddCADByLayer()
    {
      //定义工作空间,并用CadWorkspaceFactoryClass()实例化它
   IWorkspaceFactory Fact = new CadWorkspaceFactoryClass();
   //打开相应的工作空间,并赋值给要素空间,OpenFromFile()
   //中的参数为CAD文件夹的路径
IFeatureWorkspace Workspace = Fact.OpenFromFile(@"I:\test\",0)  as IFeatureWorkspace;      
       /*打开线要素类,如果要打开点类型的要素,需要把下边的代码该成:
   IFeatureClass Fcls = Workspace.OpenFeatureClass ("modle.dwg:point");
由此可见modle.dwg为CAD图的名字,后边加上要打开的要素类的类型,中间用冒号隔开,大家可以想想多边形和标注是怎么打开的。 */
     IFeatureClass Fcls = Workspace.OpenFeatureClass ("modle.dwg:polyline");            
       IFeatureLayer Fly = new FeatureLayerClass ();
       Fly.FeatureClass = Fcls;
MapCtr.Map.AddLayer (Fly);
       MapCtr.ActiveView.Refresh ();
}
B、整幅CAD图的加载
当我们要加载整幅CAD图时,需要使用下边的代码,这跟加载地物类有一定的区别,详细地介绍请看代码中的注析:
public void AddWholeCAD()
{
       /*下边的两行代码是定义一个CAD工作空间,然后打开它,但这次不是赋值给
    IFeatureWorkspace对象,而是赋值给IWorkspace定义的对象*/
IWorkspaceFactory Fact = new CadWorkspaceFactoryClass();
       IWorkspace Workspace = Fact.OpenFromFile(@"I:\test\",0);     
  //定义一个CAD画图空间,并把上边打开的工作空间赋给它
       ICadDrawingWorkspace dw =  Workspace as ICadDrawingWorkspace;
  //定义一个CAD的画图数据集,并且打开上边指定的工作空间中一幅CAD图
  //然后赋值给CAD数据集
       ICadDrawingDataset ds = dw.OpenCadDrawingDataset ("modle.DWG");
  //通过ICadLayer类,把上边得到的CAD数据局赋值给ICadLayer类对象的
  //CadDrawingDataset属性
       ICadLayer CadLayer = new  CadLayerClass();
       CadLayer.CadDrawingDataset = ds;
        //利用MapControl加载CAD层
       MapCtr.Map.AddLayer (CadLayer);
     MapCtr.ActiveView.Refresh ();
}
通过上边的代码和相关的解析,大家可能对整幅CAD图的加载有一个了解,但要具体搞清楚它的含义,也不那么容易。这留给大家去慢慢体会,在这我谈谈我自己的体会,但不一定正确。要打开数据集,首先要打开它的工作空间,至于什么是工作空间,我也说不太明白,但我的理解是,如果数据是保存在文件中的,工作空间大概就是它对应的文件夹,如果是数据库中的数据,我想大概就是对应的数据库。打开数据空间后,在这因为是整幅CAD图加载,所以跟以前的有点不同,这也就是相当整个CAD图就是一个数据集,所以要转到CAD画图的工作空间,然后把CAD图作为CAD数据集打开。为了在MapControl中加载 CAD层,必须使用ICadLayer控件的对象,因为MapCtr.Map.AddLayer ()方法中只能是ICadLayer的对象。
分享到:
评论

相关推荐

    加载地图数据的几种方法

    【加载地图数据的几种方法】 在地理信息系统(GIS)中,加载地图数据是核心操作之一,确保用户能够查看和分析所需的地理信息。本文将详细探讨如何在ArcEngine(AE)环境中加载个人数据库,特别是保存在Microsoft ...

    AE+C#二次开发

    在IT行业中,AE+C#的二次开发主要指的是利用ArcGIS Engine和C#编程语言进行地理信息系统(GIS)的定制化开发。ArcGIS Engine是Esri公司提供的一个强大的开发工具包,它允许开发者创建桌面、Web和移动应用,以实现...

    AE开发 C#编程 反距离插值

    它提供了丰富的GIS功能,包括地图显示、空间分析、数据管理等,支持多种编程语言,其中C#是常用的一种。开发者可以利用ArcGIS Engine的API,结合C#的强大编程能力,构建定制化的GIS解决方案。 反距离插值(Inverse ...

    AE与C#进行开发读取地图

    本教程“AE与C#进行开发读取地图”可能涉及将C#程序与AE脚本集成,以读取和处理地图数据。 在C#中,读取地图通常涉及到GIS(地理信息系统)技术。GIS是一个用于处理地理空间数据的系统,它可以解析地图文件,提取...

    C#+ArcEngine:加载打开Shp矢量和栅格数据

    本主题将深入探讨如何利用C#编程语言和ArcEngine API来加载和打开两种常见的地理数据格式:Shapefile(矢量数据)和栅格数据。 1. **Shapefile矢量数据** Shapefile是一种广泛使用的矢量数据格式,用于存储地理...

    [源码]用C#+Ae 切换mxd的数据源

    本教程主要探讨如何使用C#编程语言结合ArcGIS Engine(通常简称为Ae)来实现MXD(Map Document)中图层数据源的动态切换,包括从SDE(Spatial Database Enterprise,Esri的分布式地理数据库)到MDB(Microsoft ...

    c#开发的地图编辑程序

    在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows桌面应用和.NET框架相关项目时。本项目涉及的是利用C#进行ArcGIS的二次开发,创建一个地图编辑程序。ArcGIS是由Esri公司提供的一个强大的地理信息系统...

    基于C#+AE构建GIS桌面端应用系统框架

    【标题】"基于C#+AE构建GIS桌面端应用系统框架" 涉及的主要知识点包括C#编程语言、Adobe After Effects(AE)软件以及地理信息系统(GIS)的应用。这一项目旨在利用C#作为主要开发语言,结合AE进行图形界面设计,...

    地理信息系统基于c#和AE开发

    4. **菜单栏**:GIS应用通常包含丰富的菜单,用于执行各种操作,如加载地图、编辑数据、执行分析等。C#可以轻松实现这样的用户界面设计。 5. **属性查询**:用户可以查询地图要素的非空间属性,例如,查找某个地区...

    最短路径分析源码(基于ArcEngine9.3+C#)

    开发者可能需要考虑如何有效地加载网络数据,如何选择合适的算法(如Dijkstra算法、A*算法等),以及如何分批次处理请求以减少内存占用。 通过这个源码,开发者不仅可以学习到最短路径分析的基本原理,还能深入理解...

    C#+AE实现PersonalGeodatabase和shp文件入库

    3. 加载数据:读取shp文件中的几何和属性数据,然后使用`IFeatureClass.Insert`方法将这些数据插入新创建的FeatureClass。 4. 执行数据导入:使用`ESRI.ArcGIS.DataSourcesShapefile.ShapefileWorkspaceFactory`...

    基于C#+AE构建GIS桌面端应用系统框架-全代码

    1. 数据管理:包括地图数据的加载、存储和检索,如Shapefile、GeoTIFF、GeoJSON等格式的数据处理。 2. 地图显示:使用控件展示地图,并支持缩放、平移、图层管理等功能。 3. 查询分析:提供空间查询、缓冲区分析、...

    AE中保存mxd文档的几种方式.docx

    本文将详细介绍AE中保存MXD文档的几种常见方法,这些方法通常涉及到IMapDocument和IMxdContents接口。 1. **使用IMapDocument接口的ReplaceContents和Save方法** 当您对现有MXD文档进行了修改后,可以使用...

    AE打开shp文件,并检查特定字段的属性

    SHAPEFILE是ESRI公司开发的一种用于存储地理空间矢量数据的文件格式,它通常包含.shp、.dbf等几个相关联的文件,共同构成完整的空间数据结构。 首先,我们需要理解C#中的GIS编程基础。C#提供了多种库和框架,如...

    点图层转为栅格文件(C#2005+AE9.2).rar

    本项目"点图层转为栅格文件(C#2005+AE9.2).rar"就是一个实例,它利用C#编程语言以及ArcEngine(AE)9.2这个GIS开发组件,实现了将点图层数据转换为栅格格式的功能。下面我们将详细讨论其中涉及的技术点和步骤。 ...

    基于C#+AE构建GIS 公路灾害信息查询系统QuerySystem.rar

    公路灾害信息查询系统QuerySystem是基于C#编程语言与ArcGIS Engine(简称AE)开发的一款...总的来说,C#+AE构建的GIS公路灾害信息查询系统是现代交通管理中的一个重要工具,体现了信息技术在公共安全领域的应用价值。

    从零开始:AE二次开发中获取A点到B点的最佳路径(5)文章中的地图数据

    总之,通过ArcGIS Engine的二次开发,结合C#编程,我们可以利用Mxd文件中的地图数据和几何网络,实现从A点到B点的最佳路径计算。这个过程不仅展示了GIS的强大功能,也为各种业务场景提供了智能化的解决方案。在不断...

    运用C#开发AE实例

    在IT行业中,GIS(Geographic Information System,地理信息系统)是一个重要的领域,它涉及到地图制作、地理数据分析、空间决策支持等多个方面。C#是Microsoft开发的一种面向对象的编程语言,广泛应用于Windows平台...

    C#开发显示Geo Tiff影像文件

    Geo Tiff是一种特殊的TIFF(Tagged Image File Format)文件,它包含了地理空间信息,如坐标系统、投影方式等,使得图像可以与地球表面的位置对应。在本教程中,我们将深入探讨如何使用C#语言来读取和显示Geo Tiff...

Global site tag (gtag.js) - Google Analytics