(1)Geodatabase是什么?html
ArcGIS操做基于GIS文件格式和存储于地理数据库(Geodatabase)中的地理信息。Geodatabase是ArcGIS的本地数据结构,是用于编辑和数据管理的基本数据格式。它并非一个数据库,只是联系数据库与GIS的一种工具。数据库
空间数据库系统是描述、存储和处理空间数据及其属性数据的数据库系统,按是否对空间数据和属性数据进行一体化组织分为两种:混合型空间数据库和集成性空间数据库。在后者方案中,为实现对空间对象的一条记录(record)变长的非结构化特征在关系型数据库的存储和处理(空间图形数据不能直接采用通用的关系数据管理系统),以及维护空间数据的拓扑关系,在对空间数据和属性数据集成的研究实践中,提出面向对象数据库以及易于实现的较为折中的对象-关系模型数据库。编程
(2)Geodatabase的类型数组
Geodatabase是面向对象的空间数据存储模型,将地理数据存储在普通的文件File Geodatabase中、Personal database(微软的Access数据库的.mdb文件)中或者多用户的关系数据库Enterprise Geodatabase(好比Oracle, Microsoft SQL Server, 或者IBM DB2)。服务器
目前,结合Oracle对Geodatabase进行开发和管理的方式有两种:1.使用Oracle Spatial的状况下使用Oracle Spatial SQL类型;2.使用ArcSDE SQL类型——ArcSDE是一种基于中间件的对象-关系数据库模型。ArcSDE自己只是一个能在多种DBMS平台上提供高级的、高性能的GIS数据管理借口。网络
(3)术语“地理数据库”在ArcGIS中有多个含义:数据结构
地理数据库是各类类型地理数据集(Geodataset)的集合。数据集是在 ArcGIS 中组织和使用地理信息的主要途径。地理数据库包含三种主要数据集类型:架构
建立这些数据集类型的集合是设计和构建地理数据库的第一步。用户一般是以构建若干上述三种基本数据集来开始构建地理数据库的。而后,用户可使用更高级的功能(例如添加拓扑、网络或子类型)来添加或扩展地理数据库,以便建模 GIS 行为、维护数据完整性和处理重要的空间关系集。并发
高级地理数据类型实现对要素类、栅格和属性表的扩展框架
大量的Geodatabase元素用来扩展简单的表,要素类、栅格数据集,包括添加丰富的行为,数据完整性、数据管理等能力。Geodatabase的模式包括定义、完整性规则和行为。其中包括坐标系属性coordinate systems、坐标分辨率coordinate resolution、要素类feature classes、拓扑topologies、网络networks、栅格目录raster catalogs、关系relationships和属性域domains。模式信息存储在DBMS的Geodatabase元数据表的集合中,这些表定义了数据的完整性和行为。
另外,Geodatabase(ArcSDE)还支持事务和版本化,除了支持可在超大规模高性能数据库中使用的多种数据类型(如注记、拓扑、网络、地形和地址定位器)之外,还支持功能完善的事务框架,可对多种数据管理工做流程和操做进行管理。
Geodatabase存储的数据范围
Geodatabase的存储不只包括简单的空间坐标和属性数据的表格,还包括这些地理数据集的模式和规则。Geodatabase的三种基础数据集(要素类,属性表和栅格数据集)和其余的Geodatabase元素都以表格的形式存储。在Geodataset中空间表示或者以矢量要素的形式存储,或者以栅格数据存储。几何对象和传统的属性字段一块儿存储在表的列中。
Geodatabase几何要素如何存储?
Geodatabase将地理要素以表格的形式存储,每行记录表明一个要素。在 ArcGIS 中,几何数据类型用于指示表中所存储几何的类型(点、线、面、多点或多面体)。经过 ArcGIS 建立的存储为几何类型的字段称为 SHAPE。空间(图形)信息存储在Shape字段中,数据类型是Geometry(以下表)。例如多边形要素集,在Shape列为每一个要素存储了多边形类型,值Polygon用于描述Shape列的几何坐标和几何形状,表示在每一行定义了一个polygon。更多详情参见ArcGIS字段数据类型
Geodatabase的一个关键策略就是利用RDBMS来管理从简单要素集到海量数据集,多用户并发操做的GIS数据集。二维表为几何数据集提供了基本的存储机制。SQL语言具备强大的查询和操做表的功能,Geodatabase正是基于想利用这些功能而设计的。
在Geodatabase中,每一个要素类(FeatureClass,见下)在一个单独的表中被管理。在要素类表中:每一个要素类是一个表;单独的要素被存储为行;Shape存储每一个要素的geometry (point, line, polygon);Object ID列存储每一个要素的惟一标识符。在ArcSDE Geodatabase中,关系数据库存储每一个要素类为一个表。有三种DBMSs(Oracle, DB2,和Informix)提供了SQL访问Geodatabase中的要素的geometry。
FeatureClass的概念
ArcGIS是采用Geodatabase做为地理数据模型的,而在Geodatabase中经常使用的要素类有四种:点、线、多边形和注记,这四种要素类在ArcGIS产品中具备重要概念意义。要素类是具备相同几何类型和属性的要素的集合。对于实际应用中遇到高级地理要素,能够依据属性特色,结合网络模型和拓扑模型进行建模。好比,下水道管线和入孔井盖组成了一个雨水管线网络;相邻的地块共享了公共的边界,大多数地块用户经过使用topology来保持在数据集中共享要素的完整性。
如何肯定一个要素类?
在ArcGIS中,要素类是具备相同空间参考和属性设置的相同要素的集合。注意:当在Geodatabase中建立一个要素类时,须要设置要素类型以定义要素类的类型(点、线、多边形等等)。一般,要素类是点、线或多边形的集合,具体有7种要素类型。
1) 点-用来表达那些很小且不能用线或多边形来表示的地理要素(如GPS观测站)。
2) 线—用来表达那些长条形的,很是狭窄也不能用多边形表示的地理要素,如街道中心线和溪流。线也能够表达那些有长度却没有面积的要素,如轮廓线和边界。
3) 多边形-是一个封闭的图形,用来表示均质要素的形状和位置,如州、县、土地、土壤类型或者土地利用类型区等。
4) 注记-地图文本,包括文本如何组织的属性;例如,除了每一个注记的文本字符串。还包括其余属性,如放置文字形状,字体,字体大小和其余显示属性。注记也能够是feature-linked,也能够包含子类。
5) 维度—一种特殊的注记,它显示具体的长度或距离;例如,为了显示一个建筑物或一块地的一条边的长度,或者两个不一样要素之间的距离。维度常常用于GIS设计、工程和工具应用中。
6) 多点—由不止一个点组成的要素。Multipoints一般用于管理大量点集合的数组,如激光雷达点串,它们能够包含几十亿个点。使用一个单独的列表示这样的点几何是不可行的。聚类这些多点行可使Geodatabase处理大块点集合。
7) Multipatches—一个3D几何图形用于表达要素的外部表面或者外形,这个要素占用一个离散的二维面积或者三维空间的体积。Multipatches由平面的3D环和三角形组成。Multipatches能够被用于表达任何简单到复杂的对象,如球体和立方体到表面和建筑物。
要素数据集Feature Datasets
要素数据集是共用一个通用坐标系的相关要素类的集合。要素数据集用于按空间或主题整合相关要素类。它们的主要用途是,将相关要素类编排成一个公用数据集,用以构建拓扑、网络数据集、地形数据集或几何网络。Feature Datasets是在FeatureClass之上的一个概念,不一样的FeatureClass具备拓扑关系时,应把它们组织在一个Feature Datasets里面,一样在AO开发中是一个很重要的基础性的类/Class。更多参见本文Geodatabase的体系结构
四、Geodatabase基本功能/任务
设计一个Geodatabase;
创建一个Geodatabase;
加载数据集和栅格到Geodatabase中;
用高级数据类型扩展要素类;
用域、关联和子类型扩展表;
扩展栅格数据集;
加载和维护Geodatabase中每一个数据集的数据;
管理Geodatabase的更新和事务;
管理File或者Personal Geodatabase;
管理ArcSDE Geodatabase。
相关软件:ArcCatalog、ArcMap
说明:用户可轻松建立地理数据库并向其添加行为,而且使用ArcGIS for Desktop中的数据管理工具时不须要进行编程工做。在ArcMap(用于编辑、分析地图和以及根据数据建立地图的应用程序)中查询和编辑地理数据库时,能够很轻松地利用地理数据库中的数据和行为,而无需进行任何自定义。经过建立子类型、验证规则、关系和几何网络将行为添加到地理数据库。可使用ArcMap经过编辑地理数据库中的一些现有要素并添加一些新要素来利用该行为。
打开ArcCatalog,并利用Folder Connections链接到地理数据文件位置:
在文件夹图标上右键,选择New选项,新建我的Geodatabase:
此时建立的地理数据库myPGdb.mdb是一个空的,须要向里面建立或添加要素及其它内容。通常选择导入,能够用要素类、表、栅格数据集丰富数据库:
用户也能够本身新建要素(数据)集,以及表、关系、栅格目录等,随后在新建的项目中编辑或添加相应地理要素,注意添加的数据必须知足自定义的种种规则:
(注:早期版本的Geodatabase与高版本的进行数据交换时有时会发生错误,这时能够在高版本环境下新建数据集,再将坐标系、字段、记录等依次添加进去。)
(注:要指定要素类型,以下为线状要素Line Features):
接下来设置坐标系,能够选择将已有的坐标系信息导入,此处略;
而后进入字段设计,能够添加须要的字段,编辑其属性,如别称、数据类型、是否为空、默认值等,设计好以后保存。
->添加/编辑要素数据项
在上面建立的空<线状地物>要素类上右键Load,装载数据:
接下来进行字段匹配与编辑:
点击完成,能够在Preview查看是否成功。
属性域是描述字段类型合法值的规则。多个要素类和表能够共享数据库中存储的属性域。例如,在供水管网中,不一样用途的支管的压力值能够在不一样psi之间。
要素类的子类型:经过建立子类型,可使各个要素使用各不相同的属性域、默认值或连通性规则,相似于程序设计中的枚举数据类型。
对象之间的关系:对象之间具备1:1,1:n,m:n的关系,例如经过宗地与全部者之间的关系类,在使用ArcMap中的数据时,能够轻松找出哪些全部者拥有哪些宗地。
点击数据库名字前的 + 号,展开数据集,在须要扩展的数据集上右键Properties,打开属性面板:
在本文使用的数据库例子中,字段<BSM>(标识码)表明了不一样地块类别,相同类型的地块拥有同一个BSM,故能够用<BSM>创建子类型Subtypes:
一样,在Subtypes选项卡下面,紧接着,是编辑字段属性域Domain功能(注:Domain选项卡用于设置地理坐标范围,与表字段无关):
关系在Geodatabase中做为一种类/Class来设计,用户使用时须要对它进行建立,在数据库上右键New->Relationship Class
填写关系类名称,选定创建关系的两个要素类:
选择关系类型:
选择关联字段:
要素数据集是一组按空间或主题相关、共享一个通用坐标系的要素类。要素数据集用于保存参与共享拓扑、网络数据集、几何网络或地形的要素类。
必须使用要素数据集来保存参与如下任何地理数据库功能的要素类集合:
右键Import,向Feature Datasets添加要素类,这一步是下列操做的前提;
右键New->Geometric Network最后一项,
选择用于创建几何网络的数据类:
一样,右键New->Topology,能够创建拓扑:
(注:本文以ArcSDE for Microsoft SQL Server为例。)
采用默认实例名MSSQLSERVER,设置sa用户密码,采用双登陆模式。
安装完成后,以sa用户登陆,建立sde账户,密码使用sde。打开sde账户属性,赋予其所有最高权限。建立名为sde的数据库以做后用。
安装图解参见另外一篇文章<点此连接>
安装成功的标志为esri_sde服务成功启动。查看方法:在计算机图标上右键“管理”,在“服务与应用程序”中找到“服务”,启动ArcSde Service(esri_sde)。
打开ArcCatalog,双击Database Connection下的Add Spatial Database Connection:
成功链接时以下图所示:
此时能够把gis-HP sde看成前面讲述的地理数据库,进行新建要素类/数据集。
在SQL Server中查看以下:
输入SQL语句:SELECT TOP 10 * from sde.dbo.POLYGONFEATURE,结果列出表中前10条记录。
这样就能够在ArcGIS和DBMS中共同管理地理数据了。
严格来讲,Geodatabase并非数据库。在ArcGIS和相关的用户系统中,经过Geodatabase这一规范化的地理数据模型,数据库管理系统(DBMS)能够被看成是开放的空间数据库系统,这时通用关系数据模型的简单性和灵活性使数据库管理系统支持的应用程序范围很是普遍。数据的存储和提取由存储层DBMS实现,高端的数据整合和数据处理功能则由应用层ArcGIS提供。
只是向DBMS添加对空间属性的空间类型以及SQL支持并不足以支持GIS,拓扑、网络、线性参考系、栅格目录、注记、terrain、地图图层等都是GIS用以基于DBMS中所存储的简单空间表现形式来实现GIS行为的高级对象。
从上面所述,能够看到Geodatabase在应用上的特征:
a)Geodatabase有一个普遍的信息模型来表达和管理地理信息。这个信息模型的实现是经过一系列简单数据表,这些表是存储在要素类、栅格数据集和属性表中的。
b)高级的GIS数据对象经过增长GIS行为、规则来管理空间完整性,以及增长工具来处理要素、栅格和属性表的大量的空间关系。
c)Geodatabase能够访问和处理多种数据格式的地理数据。Geodatabase支持Shapefiles, CAD文件, TIN, Grids, CAD数据,imagery,还有其余大量GIS数据源。
d) Geodatabase具备一个事务处理模型来管理GIS的数据工做流。
Geodatabase采用两层结构:数据存储层和应用层。数据存储层是将GIS数据存储为File、XML、DBMS等多种格式(关系型数据库),而应用层则是维护数据的高级逻辑和行为,例如Feature Classes、Raster Dataset、Topology、Network、Address Locators等等(面向对象的思想)。多层的Geodatabase体系结构被称为object-relational模型/ORDB。
DBMS做为一种存储地理数据集的实现机制而被使用。可是,DBMS并无彻底定义地理数据的语义。所以能够认为:Geodatabase采用两层体系结构,数据存储层和应用层,在数据存储层实现数据存储和检索,在应用层实现高层数据完整性和信息处理。ArcSDE正是基于基于这种思想被设计出来的。
DBMS管理Geodatabase有何区别吗?
如上所述,Geodatabase的存储模型是以DBMS原则为基础,利用了一系列简单却基本的关系数据库概念。DBMS(File Geodatabase的文件系统)提供了简单而又合适的数据模型存储和操做表。包括如下的关键概念:
对ArcSDE Geodatabases来讲,还有大量其余的DBMS功能能够应用:
例如,一个要素类以DBMS表的形式存储。每一行表明一个要素,每一行中列描述了该要素的各类特征或属性,表中的某一列存储了该要素的几何形状(如point, line或polygon coordinates)。假设shape字段存储了polygon形状,在DBMS中大量的列类型用于shape字段,能够是典型的binary large object (BLOB)类型或者是扩展的空间类型,它们可以被一些DBMS所支持。如,ESRI提供了一个空间列类型用于在ArcSDE Geodatabases存储要素,支持这种类型的关系数据库有Oracle, IBM DB2, 和Informix。SQL操做表中的行、列。这些列类型(numbers, characters, dates, BLOB's, spatial types等等)在SQL代数中被认为是对象。DBMS管理这些简单的数据类型和表,同时其余应用逻辑实现更复杂的对象行为和完整性约束。
Geodatabase空间数据的物理存储形式
DBMS中的地理数据库存储包含两组表:数据集表(用户定义的表)和系统表(元数据)。
(1) 数据集表 - 地理数据库中的每一个数据集都存储在一个或多个表中。这些数据集表使用系统表管理数据。
(2) 系统表 - 地理数据库系统表用于追踪每一个地理数据库的内容。它们实质上描述的是用于指定全部数据集定义、规则和关系的地理数据库方案。这些系统表包含并管理元数据,全部这些元数据均为实现地理数据库属性、数据验证规则和行为所需。
ArcGIS 10中有四个主系统表:
GDB_Items:包含地理数据库中的全部项(例如要素类、拓扑和属性域)的列表
GDB_ItemTypes:包含识别的项类型(例如表)的预约义列表
GDB_ItemRelationships:包含各个项之间的方案关联,例如要素数据集中包含哪些要素类
GDB_ItemRelationshipTypes:包含识别的关系类型(例如 DatasetInFeatureDataset)的预约义列表
在许多状况下,用户可以使用数据库管理系统(DBMS)的事务框架来管理地理数据库的编辑和更新。GIS用户会遇到许多长事务工做流极其关键的状况。在大多数状况下,经过使用多用户DBMS和ArcSDE并利用版本化方法来管理对GIS数据库的更新,能够应对这些状况。
使用基于版本的事务模型的GIS数据编译工做流能够作到:
基于版本的地理数据库事务模型相对而言十分简单,即把更新记录在变动表中。版本会显式地将地理数据库的对象状态记录在添加表和删除表这两个增量表中。
地理数据库可扩展标记语言(XML)表明了ESRI的地理数据库与其余外部系统之间开放的信息交换机制。ESRI将完整的地理数据库方案和内容做为XML规范进行公开的发布和维护,而且提供了一些实现示例来阐述如何实如今异类系统之间共享数据更新。
经过使用地理数据库XML规范,极大地简化了地理数据库的XML地理空间信息双向交换。外部应用程序能够接收XML数据流,其中包括:
地理数据库XML是用于在ArcGIS用户和外部用户间共享数据的主要交换机制。
ArcSDE是数据库系统中管理地理数据库的接口,经过该接口能够往关系数据库中加入空间数据,提供地理要素的空间位置及形状等信息,是ArcGIS与关系数据库之间的GIS通道。它容许用户在多种数据管理系统中管理地理信息,并使全部的ArcGIS应用程序都可以使用这些数据。
(1)高性能的DBMS通道
ArcSDE是多种DBMS的通道,它自己不是一个关系数据库或数据存储模型。标准的SQL并不支持空间数据。ArcSDE不但支持每一个DBMS提供的独特功能,并且能为底层DBMS提供它们所不具有的功能支持。
(2)开放的DBMS支持
包括:Oracle、Oracle with Spatial or Locator、Microsoft SQL Server、Informix以及IBM DB2,PostgreSQL等。
多用户ArcSDE为用户提供了大型空间数据库支持,而且支持多用户编辑。
(3)连续、可伸缩的数据库
GIS工做流和长事务处理GIS中的数据管理工做流。
(4)丰富的地理信息数据模型
(5)灵活的配置
ArcSDE通道可让用户在客户端应用程序内,或跨网络、跨计算机地对应用服务器进行多种多层结构的方案配置。
数据的存储和提取由存储层DBMS实现,而高端的数据整合和数据处理功能则由应用层ArcGIS提供。
ArcSDE用于高效的存储、索引、访问和维护DBMS中的矢量、栅格、元数据及其余空间数据。
ArcSDE使用DBMS支持的数据类型,以表格的形式管理底层存储的空间数据,并可以使用SQL在DBMS中访问这些数据。ArcSDE同时也提供了开放的客户端开发接口(C API和JAVA API),经过这些接口,用户定制的应用程序也能够彻底访问底层的空间数据表。
概述小字部分简要介绍了对象-关系模型数据库ORDB,它是面向对象思想与数据库管理系统结合的一个折中产物。ORDB与GIS结合,具备以下优点:支持基本类型扩充;支持复杂对象;支持继承;支持规则。
经过中间件(如ArcSDE),实现从空间对象模型到数据库存储的映射,能够避免对DBMS内核的直接修改,消除数据库和最终用户间接口的差别。这样子的数据库通常包括用户-中间件-数据存储层的那个3个层次,而中间件的主要任务就是分析并执行空间对象访问命令。
(1)要素类Feature Class
表示具备相同几何形状的空间实体,分为点状、线状、面状要素类等。
(2)对象类Object Class
表示非空间实体,不能在地图上直接表示,但与地图上的地图要素直接关联。
要素类和对象类的主要区别是:前者存储了空间信息,对象类则没有。
(3)要素数据集Feature Datasets
由一组具备相同空间参考(Spatial Reference)的要素类组成,用于存放矢量数据。
(4)栅格数据集Raster Datasets
用于存放栅格数据,支持海量数据与影像镶嵌。可创建金字塔索引。
(5)TIN数据集TIN Datasets
由一系列不规则的三角形构成,表明了地表的起伏。
(6)关系类Relationship Class
用于定义两个不一样的要素类或对象类之间的关联关系。
(7)属性域Domain
定义属性的有效取值范围。
(8)几何网络Geometric Network
在若干要素类的基础上创建的类,可包括网络的边要素和点要素。
(1)Geodatabase中的主要类
Geodatabase中的主要类分为工做区部分和数据集部分,工做区部分主要负责对Geodatabase中的各类数据源进行宏观管理,而数据集部分主要用于对数据库中各类具体的数据进行描述和管理。
WorkspaceFactory类
该类可被建立。用于生成Workspace,链接属性通常使用PropertySet对象定义,并提供浏览、管理基于文件系统的Workspace方法。该类实现IWorkspaceFactory和IWorkspaceFactory2两个接口,派生多种特定数据库工做空间类。
IWorkspaceFactory接口提供建立和打开Workspace的方法,如Open方法用于打开ArcSDE数据库。
Workspace类
Workspace是一个用于存放空间数据和非空间数据的容器,能够存放FeatureDatasets、RasterDatasets和Tables等各类数据。该类实现IWorkspace、IWorkspace2等接口。
一个Workspace能够被看做是文件系统中的目录,也能够被看做一个关系数据库。
FeatureDataset组件类
存储同空间参考的多个Feature Class的数据集,能够存储Geometric Network和Relationship Class。实现IFeatureDataset接口,其CreateFeatureClass方法可用于建立新的Feature Class。
(2)Geodatabase中的其它经常使用类
包括与空间数据入库相关的类、与查询相关的类。
与空间数据入库相关的类实现了各类数据格式的转换,如FeatureDataConverter、FieldChecker、EnumFieldError等。
与查询相关的类有QueryFilter和SpatialFilter。
程序界面设计以下:
运行程序前保证ArcSDE服务ersi_sde开启.
部分代码以下:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Text; 7 using System.Windows.Forms; 8 using ESRI.ArcGIS.esriSystem; 9 using ESRI.ArcGIS.Carto; 10 using ESRI.ArcGIS.Controls; 11 using ESRI.ArcGIS.SystemUI; 12 using ESRI.ArcGIS.Geometry; 13 using ESRI.ArcGIS.Geodatabase; 14 using ESRI.ArcGIS.DataSourcesFile; 15 using ESRI.ArcGIS.Display; 16 using ESRI.ArcGIS.DataSourcesGDB; 17 using ESRI.ArcGIS.DataSourcesRaster; 18 19 namespace lesson1 20 { 21 public partial class Form1 : Form 22 { 23 public Form1() 24 { 25 InitializeComponent(); 26 } 27 28 private void Form1_Load(object sender, EventArgs e) 29 { 30 IAoInitialize pao = new ESRI.ArcGIS.esriSystem.AoInitialize(); 31 pao.Initialize(esriLicenseProductCode.esriLicenseProductCodeEngineGeoDB); 32 33 } 34 // 工做空间 35 IWorkspace workspace; 36 //矢量数据工做空间 37 IFeatureWorkspace featureWorkspace; 38 //影像数据工做空间 39 IRasterWorkspaceEx rasterWorkspace; 40 //矢量数据集 41 IFeatureDataset featureDataset; 42 //影像数据集 43 IRasterDataset rasterDataset; 44 private void button1_Click(object sender, EventArgs e) 45 { 46 // SDE空间链接属性 47 IPropertySet propertySet = new PropertySet(); 48 propertySet.SetProperty("server", this.textBox1.Text); 49 propertySet.SetProperty("instance", this.textBox2.Text); 50 propertySet.SetProperty("database", this.textBox3.Text); 51 propertySet.SetProperty("user", this.textBox4.Text); 52 propertySet.SetProperty("password", this.textBox5.Text); 53 propertySet.SetProperty("version", "SDE.DEFAULT"); 54 IWorkspaceFactory workspaceFactory = new SdeWorkspaceFactory(); 55 //打开SDE工做空间 56 57 workspace = workspaceFactory.Open(propertySet, 0); 58 MessageBox.Show("链接SDE空间数据库成功"); 59 60 } 61 //建立数据集(矢量数据集和影像数据集) 62 private void button2_Click(object sender, EventArgs e) 63 { 64 featureWorkspace = workspace as IFeatureWorkspace; 65 rasterWorkspace = workspace as IRasterWorkspaceEx; 66 //定义空间参考 67 ISpatialReferenceFactory spatialReferenceFactory = new SpatialReferenceEnvironment(); 68 ISpatialReference spatialReference = spatialReferenceFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_Beijing1954); 69 spatialReference.SetDomain(-1000, -1000, 1000, 1000); 70 71 IEnumDatasetName enumDatasetName; 72 IDatasetName datasetName; 73 string dsName = ""; 74 enumDatasetName = workspace.get_DatasetNames(esriDatasetType.esriDTFeatureDataset); 75 datasetName = enumDatasetName.Next(); 76 bool isExist = false; 77 //建立矢量数据集 78 dsName = "SDE." + this.textBox6.Text; 79 while (datasetName != null) 80 { 81 if (datasetName.Name == dsName) 82 { 83 isExist = true; 84 } 85 datasetName = enumDatasetName.Next(); 86 } 87 if (isExist == false) 88 { 89 featureDataset = featureWorkspace.CreateFeatureDataset(this.textBox6.Text, spatialReference); 90 } 91 //建立影像数据集 92 isExist = false; 93 enumDatasetName = workspace.get_DatasetNames(esriDatasetType.esriDTRasterDataset); 94 datasetName = enumDatasetName.Next(); 95 96 dsName = "SDE." + this.textBox6.Text; 97 while (datasetName != null) 98 { 99 if (datasetName.Name == dsName) 100 { 101 isExist = true; 102 } 103 datasetName = enumDatasetName.Next(); 104 } 105 if (isExist == false) 106 { 107 //设置存储参数 108 IRasterStorageDef rasterStorageDef = new RasterStorageDef(); 109 rasterStorageDef.CompressionType = esriRasterCompressionType.esriRasterCompressionUncompressed; 110 rasterStorageDef.PyramidLevel = 1; 111 rasterStorageDef.PyramidResampleType = rstResamplingTypes.RSP_BilinearInterpolation; 112 rasterStorageDef.TileHeight = 128; 113 rasterStorageDef.TileWidth = 128; 114 //设置坐标系统 115 IRasterDef rasterDef = new RasterDef(); 116 UnknownCoordinateSystem system = new UnknownCoordinateSystem(); 117 ISpatialReference rasterDpatialRefrence = system as ESRI.ArcGIS.Geometry.ISpatialReference; 118 rasterDef.SpatialReference = rasterDpatialRefrence; 119 120 IGeometryDef geometryDef = new GeometryDef(); 121 IGeometryDefEdit geometryDefedit = (IGeometryDefEdit)geometryDef; 122 geometryDefedit.AvgNumPoints_2 = 5; 123 geometryDefedit.GridCount_2 = 1; 124 geometryDefedit.set_GridSize(0, 1000); 125 geometryDefedit.GeometryType_2 = esriGeometryType.esriGeometryPolygon; 126 127 UnknownCoordinateSystem system2 = new UnknownCoordinateSystem(); 128 ISpatialReference spatialReference2 = system2 as ESRI.ArcGIS.Geometry.ISpatialReference; 129 geometryDefedit.SpatialReference_2 = spatialReference2; 130 rasterDataset = rasterWorkspace.CreateRasterDataset(this.textBox7.Text, 1, rstPixelType.PT_LONG, rasterStorageDef, "DEFAULTS", rasterDef, geometryDef); 131 132 } 133 134 } 135 //加载矢量数据到SDE数据库 136 private void button3_Click(object sender, EventArgs e) 137 { 138 featureWorkspace = workspace as IFeatureWorkspace; 139 this.openFileDialog1.Filter = "shp file (*.shp)|*.shp"; 140 this.openFileDialog1.Title = "打开矢量数据"; 141 this.openFileDialog1.Multiselect = false; 142 string fileName = ""; 143 if (this.openFileDialog1.ShowDialog() == DialogResult.OK) 144 { 145 fileName = this.openFileDialog1.FileName; 146 string filepath; 147 string file; 148 int lastIndex; 149 lastIndex = fileName.LastIndexOf(@"\"); 150 filepath = fileName.Substring(0, lastIndex); 151 file = fileName.Substring(lastIndex + 1); 152 //读取SHP数据 153 IWorkspaceFactory shpwpf = new ShapefileWorkspaceFactory(); 154 IWorkspace shpwp = shpwpf.OpenFromFile(filepath, 0); 155 IFeatureWorkspace shpfwp = shpwp as IFeatureWorkspace; 156 IFeatureClass shpfc = shpfwp.OpenFeatureClass(file); 157 158 //导入SDE数据库 159 IFeatureClass sdeFeatureClass = null; 160 FeatureClassDescription fClassD = new FeatureClassDescription(); 161 IFeatureClassDescription featureClassDescription = fClassD as IFeatureClassDescription; 162 IObjectClassDescription objectClassDescription = featureClassDescription as IObjectClassDescription; 163 IFields fields = shpfc.Fields; 164 IFieldChecker fieldChecker = new FieldChecker(); 165 IEnumFieldError enumFieldError = null; 166 IFields validateFields = null; 167 fieldChecker.ValidateWorkspace = featureWorkspace as IWorkspace; 168 fieldChecker.Validate(fields, out enumFieldError, out validateFields); 169 featureDataset = featureWorkspace.OpenFeatureDataset(this.textBox6.Text); 170 try 171 { 172 sdeFeatureClass = featureWorkspace.OpenFeatureClass(shpfc.AliasName); 173 } 174 catch (Exception ex) 175 { 176 } 177 //在SDE数据库中建立矢量数据集 178 if (sdeFeatureClass == null) 179 { 180 sdeFeatureClass = featureDataset.CreateFeatureClass(shpfc.AliasName, validateFields, objectClassDescription.InstanceCLSID, objectClassDescription.ClassExtensionCLSID, shpfc.FeatureType, shpfc.ShapeFieldName, ""); 181 } 182 IFeatureCursor featureCursor = shpfc.Search(null, true); 183 IFeature feature = featureCursor.NextFeature(); 184 IFeatureCursor sdeFeatureCursor = sdeFeatureClass.Insert(true); 185 IFeatureBuffer sdeFeatureBuffer; 186 //添加实体对象 187 while (feature != null) 188 { 189 sdeFeatureBuffer = sdeFeatureClass.CreateFeatureBuffer(); 190 IField shpField = new Field(); 191 IFields shpFields = feature.Fields; 192 for (int i = 0; i < shpFields.FieldCount; i++) 193 { 194 shpField = shpFields.get_Field(i); 195 int index = sdeFeatureBuffer.Fields.FindField(shpField.Name); 196 if (index != -1) 197 { 198 sdeFeatureBuffer.set_Value(index, feature.get_Value(i)); 199 } 200 } 201 sdeFeatureCursor.InsertFeature(sdeFeatureBuffer); 202 sdeFeatureCursor.Flush(); 203 feature = featureCursor.NextFeature(); 204 } 205 //加载数据到Mapcontrol 206 IFeatureLayer sdeFeatureLayer = new FeatureLayer(); 207 sdeFeatureLayer.FeatureClass = sdeFeatureClass; 208 this.axMapControl1.Map.AddLayer(sdeFeatureLayer as ILayer); 209 this.axMapControl1.Extent = this.axMapControl1.FullExtent; 210 this.axMapControl1.Refresh(); 211 } 212 213 } 214 //加载影像数据到SDE数据库 215 private void button4_Click(object sender, EventArgs e) 216 { 217 this.openFileDialog1.Filter = "TIFF file (*.tif)|*.tif"; 218 this.openFileDialog1.Title = "打开影像数据"; 219 this.openFileDialog1.Multiselect = false; 220 string fileName = ""; 221 if (this.openFileDialog1.ShowDialog() == DialogResult.OK) 222 { 223 fileName = this.openFileDialog1.FileName; 224 string filepath; 225 string file; 226 int lastIndex; 227 lastIndex = fileName.LastIndexOf(@"\"); 228 filepath = fileName.Substring(0, lastIndex); 229 file = fileName.Substring(lastIndex + 1); 230 231 //导入SDE数据库 232 rasterWorkspace = workspace as IRasterWorkspaceEx; 233 IWorkspaceFactory tifwpf = new RasterWorkspaceFactory(); 234 IWorkspace tifwp = tifwpf.OpenFromFile(filepath, 0); 235 IRasterWorkspace tifrwp = tifwp as IRasterWorkspace; 236 IRasterDataset rasterDataset = tifrwp.OpenRasterDataset(file); 237 IRasterDataset sdeRasterDataset = null; 238 lastIndex = file.LastIndexOf(@"."); 239 file = file.Substring(0, lastIndex); 240 try 241 { 242 sdeRasterDataset = rasterWorkspace.OpenRasterDataset(file); 243 } 244 catch (Exception Ex) 245 { 246 } 247 if (sdeRasterDataset == null) 248 { 249 IGeoDataset geoDataset = rasterDataset as IGeoDataset; 250 IRasterSdeServerOperation rasterSdeServeroperation; 251 252 IBasicRasterSdeConnection sdeCon = new BasicRasterSdeLoader(); 253 IPropertySet propertySet = new PropertySet(); 254 propertySet = workspace.ConnectionProperties; 255 //创建与SDE数据库的链接 256 sdeCon.ServerName = propertySet.GetProperty("server").ToString(); 257 sdeCon.Instance = propertySet.GetProperty("instance").ToString(); 258 sdeCon.UserName = propertySet.GetProperty("user").ToString(); 259 sdeCon.Password = "sde"; 260 sdeCon.Database = propertySet.GetProperty("database").ToString(); 261 sdeCon.SdeRasterName = file; 262 sdeCon.InputRasterName = fileName; 263 rasterSdeServeroperation = sdeCon as IRasterSdeServerOperation; 264 //保存影像数据到SDE数据库中 265 rasterSdeServeroperation.Create(); 266 rasterSdeServeroperation.Update(); 267 rasterSdeServeroperation.ComputeStatistics(); 268 IRasterLayer rasterLayer = new RasterLayer(); 269 sdeRasterDataset = rasterWorkspace.OpenRasterDataset(file); 270 rasterLayer.CreateFromDataset(sdeRasterDataset); 271 this.axMapControl1.Map.AddLayer(rasterLayer as ILayer); 272 this.axMapControl1.Extent = this.axMapControl1.FullExtent; 273 this.axMapControl1.Refresh(); 274 } 275 } 276 } 277 278 } 279 }