AE数据加载

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

1、 数据加载问题:

任何系统都离不开数据的加载,下边就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为地物类的名字,MapCtrAE中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连接 

         {  

        //设置数据库服务器名 

           Propset.SetProperty ("SERVER", "zhpzh");

           //设置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的对象。

版权说明

  如果标题未标有<转载、转>等字则属于作者原创,欢迎转载,其版权归作者和博客园共有。
  作      者:温景良
  文章出处:http://wenjl520.cnblogs.com/  或  http://www.cnblogs.com/

分类: ArcEngine
0
0
« 上一篇: ArcEngine 图层渲染(转)
» 下一篇: ArcEngine中使用上下左右键移动地图
posted @ 2009-02-10 09:15 温景良(Jason) Views( 1797) Comments( 0) Edit 收藏
 
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
6月前
|
存储 SQL 分布式计算
Spark中的数据加载与保存
Spark中的数据加载与保存
|
JavaScript 前端开发 Java
14jqGrid - 一次性加载数据
14jqGrid - 一次性加载数据
77 0
|
2月前
|
数据采集 JSON 数据处理
加载数据模型:在数据采集中实现动态数据处理
在现代网络爬虫技术中,动态数据处理对于提升采集效率和准确性至关重要。本文以拼多多为例,探讨了如何通过加载数据模型实现动态数据处理,并结合代理IP、Cookie、User-Agent设置及多线程技术提升数据采集效率。文中详细分析了动态数据模型的必要性、代理IP的应用、Cookie和User-Agent的设置,以及多线程技术的实现。通过Python代码示例展示了如何加载拼多多的商品数据模型,并实时获取商品信息,显著提升了数据采集的速度和稳定性。此方法在面对复杂网站结构和防爬虫机制时表现出色,适用于多种应用场景。
106 1
加载数据模型:在数据采集中实现动态数据处理
|
2月前
|
数据采集 存储 数据处理
通过load->model()加载数据模型:在采集中实现动态数据处理
本文介绍了在现代网络爬虫技术中,动态数据处理的重要性和实现方法。文章以采集小红书短视频为例,详细讲解了如何通过`load->model()`方法加载数据模型来处理动态数据。首先,强调了动态数据处理在爬虫技术中的必要性,尤其是对于需要实时更新或用户交互的网页。接着,通过安装必要的Python库,使用代理IP技术,设置User-Agent和Cookie,以及动态加载数据模型的步骤,展示了如何构建一个高效的爬虫系统。文章还提供了完整的代码示例,包括环境准备、代理IP配置、请求头设置、数据模型加载和数据解析等关键步骤,成功应用于小红书短视频数据的采集。
101 13
通过load->model()加载数据模型:在采集中实现动态数据处理
|
3月前
|
机器学习/深度学习 缓存 PyTorch
异步数据加载技巧:实现 DataLoader 的最佳实践
【8月更文第29天】在深度学习中,数据加载是整个训练流程中的一个关键步骤。为了最大化硬件资源的利用率并提高训练效率,使用高效的数据加载策略变得尤为重要。本文将探讨如何通过异步加载和多线程/多进程技术来优化 DataLoader 的性能。
393 1
|
3月前
|
机器学习/深度学习 数据采集 PyTorch
高效数据加载与预处理:利用 DataLoader 优化训练流程
【8月更文第29天】 在深度学习中,数据加载和预处理是整个训练流程的重要组成部分。随着数据集规模的增长,数据加载的速度直接影响到模型训练的时间成本。为了提高数据加载效率并简化数据预处理流程,PyTorch 提供了一个名为 `DataLoader` 的工具类。本文将详细介绍如何使用 PyTorch 的 `DataLoader` 来优化数据加载和预处理步骤,并提供具体的代码示例。
670 1
|
6月前
|
数据采集 机器学习/深度学习 PyTorch
PyTorch中的数据加载与预处理
【4月更文挑战第17天】了解PyTorch中的数据加载与预处理至关重要。通过`Dataset`和`DataLoader`,我们可以自定义数据集、实现批处理、数据混洗及多线程加载。`transforms`模块用于数据预处理,如图像转Tensor和归一化。本文展示了CIFAR10数据集的加载和预处理示例,强调了这些工具在深度学习项目中的重要性。
|
6月前
|
存储 数据库连接 数据处理
数据加载与保存:Pandas中的数据输入输出操作
【4月更文挑战第16天】Pandas是Python数据分析的强大工具,支持多种数据加载和保存方法。本文介绍了如何使用Pandas读写CSV和Excel文件,以及与数据库交互。`read_csv`和`to_csv`用于CSV操作,`read_excel`和`to_excel`处理Excel文件,而`read_sql`和`to_sql`则用于数据库的读写。了解这些基本操作能提升数据处理的效率和灵活性。
|
6月前
|
存储 分布式计算 Java
HDFS的数据读取流程是怎样的?请描述数据读取的过程。
HDFS的数据读取流程是怎样的?请描述数据读取的过程。
107 0
35zTree - 一次性加载大数据量
35zTree - 一次性加载大数据量
41 0
35zTree - 一次性加载大数据量