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为地物类的名字,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连接

{

//设置数据库服务器名

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

//设置SDE的端口,发布sde服务时的端口

Propset.SetProperty ("INSTANCE", "port:5154");

//SDE的用户名

Propset.SetProperty ("USER", "sde");

//密码

Propset.SetProperty ("PASSWORD", "sa");

//设置数据库的名字,只有SQL Server Informix 数据库才需要设置

Propset.SetProperty ("DATABASE", "sz20160901");

//SDE的版本,在这为默认版本

Propset.SetProperty ("VERSION", "SDE.DEFAULT");

}

else // 直接连接

{

//设置数据库服务器名,如果是本机可以用"sde:sqlserver:."

Propset.SetProperty ("INSTANCE", "sde:sqlserver:127.0.0.1");

//SDE的用户名

Propset.SetProperty ("USER", "sde");

//密码

Propset.SetProperty ("PASSWORD", "sa");

//设置数据库的名字,只有SQL Server Informix 数据库才需要设置 Propset.SetProperty ("DATABASE", "sz20160901");

//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 ("sz20160901.dbo.SN_0328_地铁站");

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

AE数据加载的更多相关文章

  1. ScrollView嵌套ListView,GridView数据加载不全问题的解决

    我们大家都知道ListView,GridView加载数据项,如果数据项过多时,就会显示滚动条.ScrollView组件里面只能包含一个组件,当ScrollView里面嵌套listView,GridVi ...

  2. python多种格式数据加载、处理与存储

    多种格式数据加载.处理与存储 实际的场景中,我们会在不同的地方遇到各种不同的数据格式(比如大家熟悉的csv与txt,比如网页HTML格式,比如XML格式),我们来一起看看python如何和这些格式的数 ...

  3. flask+sqlite3+echarts3+ajax 异步数据加载

    结构: /www | |-- /static |....|-- jquery-3.1.1.js |....|-- echarts.js(echarts3是单文件!!) | |-- /templates ...

  4. Entity Framework关联查询以及数据加载(延迟加载,预加载)

    数据加载分为延迟加载和预加载 EF的关联实体加载有三种方式:Lazy Loading,Eager Loading,Explicit Loading,其中Lazy Loading和Explicit Lo ...

  5. JQuery插件:遮罩+数据加载中。。。(特点:遮你想遮,罩你想罩)

    在很多项目中都会涉及到数据加载.数据加载有时可能会是2-3秒,为了给一个友好的提示,一般都会给一个[数据加载中...]的提示.今天就做了一个这样的提示框. 先去jQuery官网看看怎么写jQuery插 ...

  6. 如何评估ETL的数据加载时间

    简述如何评估大型ETL数据加载时间. 答:评估一个大型的ETL的数据加载时间是一件很复杂的事情.数据加载分为两类,一类是初次加载,另一类是增量加载. 在数据仓库正式投入使用时,需要进行一次初次加载,而 ...

  7. 浅谈Entity Framework中的数据加载方式

    如果你还没有接触过或者根本不了解什么是Entity Framework,那么请看这里http://www.entityframeworktutorial.net/EntityFramework-Arc ...

  8. 实现虚拟模式的动态数据加载Windows窗体DataGridView控件 .net 4.5 (一)

    实现虚拟模式的即时数据加载Windows窗体DataGridView控件 .net 4.5 原文地址 :http://msdn.microsoft.com/en-us/library/ms171624 ...

  9. Android Volley和Gson实现网络数据加载

    Android Volley和Gson实现网络数据加载 先看接口 1 升级接口 http://s.meibeike.com/mcloud/ota/cloudService POST请求 参数列表如下 ...

随机推荐

  1. 浅析IList与List的区别

    List和IList是.net开发中经常遇到的两种类型,用法上经常会让初学者摸不到头脑,下面简要的分析一下这两种类型的区别 1.IList<T>是接口,继承自ICollection< ...

  2. aspx返回json数据

    JQuery.getJSON 从aspx页面返回JSON数据 . -- ::| 分类: asp.net |举报|字号 订阅 . 发送请求的WebForm1.aspx <%@ Page Langu ...

  3. HDU 2669 第六周 I题

    Description The Sky is Sprite.  The Birds is Fly in the Sky.  The Wind is Wonderful.  Blew Throw the ...

  4. 获得当前时间的PRO

    1.没有参数的存储过程 create or replace procedure get_timeas    cur_time varchar2(10);begin  select to_char(sy ...

  5. 【Go】 格式处理

    格式化字符串 在golang里面获取时间戳并不难.只要加载time包.time.Now().Unix() fmt.Sprintf("%d",int64),自此,go语言的int转换 ...

  6. 用 HTML 编写博客栏目

    “生活中不是缺少美,而是缺少发现美的眼睛. -----罗丹 在之前阅读师哥师姐们博客的时候,尤其是那些感觉非常优秀博客的时候就注意到了一个东西..... ----------------------- ...

  7. 【转载】link和@import的区别

    link和@import的区别 原文地址:http://www.cnblogs.com/zbo/archive/2010/11/17/1879590.html 页面中使用CSS的方式主要有3种:行内添 ...

  8. Asp.net弹出层并且有遮罩层

    长久以来,asp.net弹出层并且有遮罩层问题都是一个难以解决的问题,鉴于此,我决定写个弹出层发布出来,供大家使用... 这里的doing层是遮罩层,divLogin层是登陆层 若有其他问题请留言或邮 ...

  9. cmd下windows批处理,获取当前系统时间,生成日志文件名

    示例: rdGetRTData_log%date:~0,4%%date:~5,2%%date:~8,2%.txt 生成格式: rdGetRTData_log20151103.txt 编写Windows ...

  10. c# 应用程序部署发布

    转自:http://blog.csdn.net/chenyujing1234/article/details/7558185 最近做了C#软件,发布给客户用时,发现客户运行不起来,原因是客户电脑上没有 ...