FDO开发教程.docx
《FDO开发教程.docx》由会员分享,可在线阅读,更多相关《FDO开发教程.docx(10页珍藏版)》请在冰豆网上搜索。
FDO开发教程
优选docx
FDO开发教程
使用C#开发FDO应用程序
1.FDO概览
FDO(FeatureDataObjects)为AutoDesk为解决当前GIS多种不同数据来源提供的一种数据访问技术。
FDO技术既与AutoDesk的GIS产品集成,也同时作为一项独立的、开源的技术提供给开发人员。
FDO允许用户无缝的直接访问多种空间/非空间的数据库和文件格式,而不需进行数据转换,也不会丢失数据,因此可以提高生产效率和节省时间。
FDO具有以下特点:
对地理空间要素数据提供了一致的访问接口
平台无关,支持Windows和Linux
开源,支持标准,尽可能遵循OGC相关规范
简单易用,既可与AutoDesk产品集成,也可用于独立软件
易扩展。
开发人员可以通过提供新的provider访问尚未支持的数据格式
目前FDO支持的数据源列表:
数据(Provider)
功能
访问性
ESRIArcSDE
访问位于Oracle或SQLServer数据库之上的ArcSDE。
支持模式的描述,以及在现有模式中插入、选择、更新和删除要素数据;不支持创建或删除模式
读/写
MySql
支持空间数据类型和空间查询操作。
API可以收集信息、传送例外、列出数据存储,以及创建连接对象。
MySQL架构支持多种存储引擎、特征和功能。
读/写
AutoDeskSDF
Autodesk的空间文件格式SDF,支持多种要素/属性,提供了访问大型数据集的高性能,以及与其它Autodesk产品的互操作性。
支持空间索引,是空间数据库的有效的替代品。
读/写
ESRISHP
基于ESRISHP的数据存储是由用于几何信息、索引和属性信息的分开的文件所组成。
每个SHP文件和它关联的DBF文件被当作一个带有单一几何特性的要素类。
不支持锁定。
读/写
ODBC
支持XYZ要素对象,并能在任何关系型数据库表中使用X、Y和可选的Z来定义要素类;不支持创建或删除模式。
对象位置被存储于对象定义中的不同特性中
读/写
WebMapping
Services
(OGCWMS)
WebMapService(WMS)从地理信息中动态的创建具有空间参照的地图,通常输出成为PNG、GIF、或JPEG格式,或基于矢量的ScalableVectorGraphics(SVG)或WebComputerGraphicsMetafile(WebCGM)格式
只读
WebFeature
Services
(OGCWFS)
支持客户/服务器环境,从一个或多个WebFeatureServices站点上取得GML编码的地理空间数据。
要素几何信息是使用GML编码的,其它的客户/服务器通信都是使用XML编码。
注意对于这个Provider没有公开的API文档;索引的WFS功能都可通过基本的ProductNameAPI获取。
只读
OracleSpatial
支持空间索引、长事务处理和持久锁定。
API可收集provider信息、传送客户服务意外、列出数据存储,以及创建连接对象
读/写
MSSQLServer
API支持模式的读/写访问,以及空间/非空间数据的读/写访问
读/写
光栅文件
支持多种图像和GIS数据格式(例如JPEG、PNG、MrSID和其它)。
支持带有地理参照的基于文件的光栅图像和基于文件的栅格数据
读/写
OGR
一种通用的矢量数据访问程序,支持许多中GIS数据源
只读
FDO获取和支持:
1.AutoDesk产品。
开源地理空间基金会(OSGeo,OpenSourceGeospatialFoundation)。
2.使用C#开发FDO应用程序
1.1.FDO基本概念
1.1.1.FDO的数据结构
Feature(要素):
要素是对现实世界物体的抽象。
一个要素直接或间接的关联地理位置信息。
一个空间要素具有一个或多个几何属性,比如,一条道路可以抽象为一条曲线,一个消防栓可以抽象为一个点;非空间要素没有几何信息,但它与一个具有几何信息的空间要素相关联,比如一条道路可以包含一个人行道,人行道就是没有几何信息的非空间要素。
Schema(数据框架):
Schema是对用于建模现实世界的数据结构的描述。
Schema不是数据本身,而是描述数据的数据(即元数据)。
例如,一个用于建模城市道路的Schema包含了一个道路类,一个道路类又包含了“名称”属性等,对道路的定义和其他相关的类构成了该Schema。
实际应用中,可以将Schema理解为一个与要素相关联的表结构。
FeatureClass(要素类):
同类要素的集合构成一个要素类。
一个要素类具有相同的Schema,它包含一个名称和一系列属性的定义,包含0个或多个几何属性。
Property(属性):
一个要素类包含若干属性的定义。
每条属性都有特定的类型,可以是一个简单类型,如string,double等,也可以是一个复杂类型,如地址(地址本身又由一系属性构成比如街名,门牌号等)。
DataProperty(数据属性):
数据属性是非空间属性。
一条数据属性的值可以是以下类型:
boolean,byte,date/time,decimal,single,double,Int16,Int32,Int64,string,binarylargeobject,characterlargeobject等。
GeometricProperty(几何属性):
几何属性是一个对象类型,描述要素的几何信息。
一个几何属性可以限制为只使用一种形状,如点,也可以使用多种维数形状,如一个对象是点状,而另一个对象是线状。
形状的组合也是允许的。
默认的几何属性可以表示点、线、面、体中的任何一种。
一个几何属性只可以有一种坐标维数。
默认为XY。
另有Z值和M值可选。
Geometry(几何形状):
几何形状由一系列XY或XYZ坐标点定义。
几何形状具体有以下几种类型:
Point点
线(一个或多个连接起来的线段,由一系列顶点的位置定义)
曲线(一个互相连接起来的线段和圆弧段的集合)
多边形(一个具有外边界的表面,可以有0个或多个内环;内环是闭合的,连接起来的线段,由一系列顶点的位置定义)
曲线多边形(一个具有外边界的表面,可以有0个或多个内环;内环是闭合的,连接起来的曲线)
多重点(多个点,可以是不相交的)
多重线(多条线,可以是不相交的)
多重曲线(多个曲线,可以是不相交的)
多重多边线(多个多边形,可以是不相交的)
多重曲线多边形(多个曲线多边形,可以是不相交的)
多重几何形状(包含多种几何形状的集合,可以是不相交的)
目前FDO还不支持“实体”类型(即三维形状)。
FdoIConnection:
:
GetGeometryCapabilities()可以用来查询特定的数据提供程序是否支持指定的形状类型和坐标维数。
ObjectProperty(对象属性):
对象属性是一种复杂的属性类型,可以包含若干个基本类型或对象类型。
如前面提到的地址类型就是一个复杂类型。
SpatialContext(空间参考):
空间参考是用于描述要素集合的基本元数据和参数信息。
空间参考一般包括坐标系的定义,椭球参数,单位,空间范围等。
DataStore(数据存储):
数据存储是一个存放对象的容器。
数据存储可以包含具有一种Schma或多种Schma的数据(与具体的provider有关)。
1.1.2.FDO数据操作
Command(命令):
FDO使用命令的方式对要素进行各种操作,包括访问、更新、查询、分析等。
每一个命令对象执行一种特定类型的操作。
数据提供程序可以对现有的命令进行扩展并可以增加针对该Provider的新命令。
命令执行针对一个特定的连接,也可以被包含在一个事务中处理。
Expression(表达式):
表达式用于构造一个过滤器。
一个表达式可以是一个过滤器或者一个大表达式的从句。
Filter(过滤器):
过滤器用于程序识别数据存储中对象的子集。
例如,可以用一个过滤器识别出200米范围内的所有包含2个干球道的道路类型的要素,很多FDO命令使用过滤器来对特定的要素进行操作。
Locking(锁定):
用户可以通过锁定排除其他用户对数据的使用,并对该数据进行更新。
锁定分为事务锁定和持续锁定。
事务锁定是临时的、只在事务范围内生效的锁定。
持续锁定一直保持锁定状态,直到用户解除锁定,或其他授权的用户解除锁定。
Transaction(事务):
事务使用一定的方式对数据进行更改。
对数据存储的更改会被记录在事务的属性里。
例如,原子属性表示所有更改是否发生。
对数据存储来说,事务把一系列命令当作一个独立的,不可分割的(原子的)更改。
所有的命令或者全部执行成功,或者全部取消。
程序通过提交让一系列操作生效,或者通过回滚让一系列操作取消。
数据存储会自动检测一个事务中执行失败的命令,并自动进行回滚操作。
事务具有以下属性:
Atomic(原子的):
一个事务中命令产生的所有更改是否发生。
Consistent(连续的):
在保证系统设定参数稳定和其他数据完整性规则的前提下,事务使数据存储保持一个连续的状态,即每一步更改都对外可见。
Isolated(孤立的):
事务在提交前,被该用户所作的更改对其他用户不可见。
Durable(持久的):
事务成功提交后,会被保存在硬盘上,无论程序损坏还是处理失败,所作更改都不会丢失。
1.2.FDO编程实践(C#)
以下内容讲述了如何创建一个SDF文件并向其中写入属性和几何数据。
1.1.1.建立一个SDF连接
以下代码创建一个SDF的连接。
IConnectionIConn=().CreateConnection("");
“”是SDFprovider的字符串,传入其他provider的字符串即可建立与其他数据的连接。
1.1.2.创建SDF文件
以下代码在指定位置创建一个SDF文件。
ICreateDataStorecmd=asICreateDataStore;
vardsprops=;
("File","D:
\\");
();
这是FDO操作数据的典型方式,先创建一个命令,然后对命令进行一些设置,然后执行命令。
一个操作完成。
CreateCommand提供了一个参数用于指定命令的类型,不同的命令可以完成不同类型的操作。
创建的命令需要强制转换到我们需要的接口类型,方便后续使用。
有了文件之后,就可以打开连接。
="File=D:
\\;ReadOnly=FALSE";
();
1.1.3.建立Schma
以下代码建立要素集的Schma(数据框架)。
IApplySchemapSdfSchemaCom=asIApplySchema;
FeatureSchemapSchema=newFeatureSchema("Tongji","");
ClassCollectionpClassCollection=;
FeatureClasspFeatureClass=newFeatureClass("Road","");
PropertyDefinitionCollectionpProDefCol=;
DataPropertyDefinitionCollectionpDataProDefCol=;
//标示数据
DataPropertyDefinitionpIdentityDataPro=newDataPropertyDefinition("FeatId","");
=;
=true;
=false;
=true;
(pIdentityDataPro);
(pIdentityDataPro);
//添加一条道路长度的属性
DataPropertyDefinitionpDataPro=newDataPropertyDefinition("道路长度","");
=;
=false;
=true;
=false;
(pDataPro);
//几何数据
GeometricPropertyDefinitionpGeoPro=newGeometricPropertyDefinition("Geometry","");
=2;
=false;
=false;
=false;
(pGeoPro);
=pGeoPro;
(pFeatureClass);
=pSchema;
();
建立Schma同样采用命令的方式。
以上代码先建立了一个“道路”的要素类,然后为该类建立了一个“Tongji”的Schma,然后再为该Schma赋予标识属性(“FeatId”)、数据属性(“道路长度”),几何属性。
最后设置命令的FeatureSchma属性为刚建立好的Schma属性,最后执行命令完成操作。
1.1.4.写入数据
以下代码向要素集中写入属性数据和几何数据。
//向SDF写入数据
//写入属性数据
IInsertpInsertCom=asIInsert;
IdentifierpClassName=newIdentifier("Road");
=pClassName;
PropertyValueCollectionpPropertyCol=;
DataValuepDataValue=newDataValue,;
PropertyValuepPropertyValue=newPropertyValue("道路长度",pDataValue);
intvalueCollectionIndex=(pPropertyValue);
//写入几何数据
FgfGeometryFactorypFgfGeoFactory=newFgfGeometryFactory();
CurveSegmentCollectionpcurveSegments=newCurveSegmentCollection();
//创建并写入一个曲线(道路)
DirectPositionCollectionpPosCol=newDirectPositionCollection();
(0,0));
(100,100));
(pPosCol));
ICurveStringpCurveString=(pcurveSegments);
GeometryValuepGeoValue=newGeometryValue(pCurveString));
valueCollectionIndex=(newPropertyValue("Geometry",pGeoValue));
IFeatureReaderpReader=();
//关闭连接
();
写入数据同样是使用命令的方式。
上述代码首先建立一个插入命令,然后建立一条数据属性对象并且插入到属性表中。
然后再建立一个曲线对象,并插入几何属性。
最后执行命令。
之前建立的标识数据并没有填充数据,因为它是一个自增长的字段,所以当增加一条记录时该字段会自动生成而不需要程序去填充。