首页 > 代码库 > ArcGIS Engine开发之旅04---ARCGIS接口详细说明
ArcGIS Engine开发之旅04---ARCGIS接口详细说明
原文 ArcGIS Engine开发之旅04---ARCGIS接口详细说明
ArcGIS接口详细说明... 1
1.IField接口(esriGeoDatabase)... 2
2.IFieldEdit接口(esriGeoDatabase)... 2
3.IFields接口(esriGeoDatabase)... 2
4. IRow接口(esriGeoDatabase)... 3
5. ITable接口(esriGeoDatabase)... 3
6. IArea接口(esriGeometry)... 4
7. IEnvelope接口(esriGeometry)... 4
8. IPoint接口(esriGeometry)... 5
9. IPointArray接口(esriGeometry)... 5
10. IPointCollection接口(esriGeometry)... 6
11. IPolyline接口(esriGeometry)... 6
12. IGeometry接口(esriGeometry)... 6
13. IFeature接口(esriGeoDatabase)... 7
14. IFeatureLayer接口(esriCarto)... 8
15. IFeatureClass接口(esriGeoDatabase)... 8
16. IFeatureCursor接口(esriGeoDatabase)... 9
17. ISpatialFilter接口(esriGeoDatabase)... 9
18. IQueryFilter接口(esriGeoDatabase)... 11
19. IFeatureSelection接口(esriCarto)... 11
20. IMap接口(esriCarto). 11
21. IPropertySet接口(esriSystem). 12
22. IFeatureWorkspace接口(esriGeoDatabase)... 12
23. IWorkspaceEdit接口(esriGeoDatabase)... 12
24. IWorkspaceFactory接口(esriGeoDatabase)... 13
25. ITopologicalOperator接口(esriGeometry)... 13
- 1. IField接口(esriGeoDatabase)
IField接口的第一个属性AliasName(只读,获得字段的别名)
IField接口的第二个方法CheckValue(Value)(方法,对于指定的属性字段,基于字段类型判断参数值是否有效,有效,则返回True,否则返回False)
例子代码:
IFeatureClass pFC_SCP_PT;
editPT = new FieldClass();
editPT.Precision_2 = 8;
editPT.Scale_2 = 3;
editPT.Name_2 = "ELEV1";
editPT.Type_2 = esriFieldType.esriFieldTypeDouble;
IField接口的其他属性均为只读属性,常用有Name(只读,获得字段的名称)
- 2. IFieldEdit接口(esriGeoDatabase)
所有该接口的属性均为可读可写,经常用与对新建字段的设置,因为字段一旦被设置,其基本属性就不能被更改,所以就需要该接口类型的变量去转换,方法为:
IFeatureClass pFC_SCP_PT;
IFieldEdit editPT = new FieldClass();
pFC_SCP_PT.AddField((IField)editPT);
如果在vb中去编写代码,则赋值和获取均为同一属性,而在C#中,为了区分设置和获取,属性均有两个,类似于Name和Name_2,这样就可以区分了,普遍用设置的带有_2的那个属性。
IFieldEdit接口的第一个属性Name (读写,设置或者获取该变量类型变量字段的名称)
IFieldEdit接口的第二个属性Precision(读写,设置或者获取该变量类型变量字段的长度)
IFieldEdit接口的第三个属性Scale(读写,设置或者获取该变量类型变量字段的精度)
IFieldEdit接口的第四个属性Type(读写,设置或者获取该变量类型变量字段的类型)
- 3. IFields接口(esriGeoDatabase)
IFields接口的第一个属性Field(Index)(只读,以用于获取具体的字段,返回类型为IField)
IFields接口的第二个属性FieldCount(只读,以用于获取属性的数量)
利用上面两个接口并用索引去依次循环获得每一列的属性pField(Ifield接口)
IFields接口的第三个方法FindField(Name)(方法,输入想要查找的属性域字段的名称,如果有,则返回该属性域字段在此Fields的索引,没有则返回-1)
IFields接口的第四个方法FindFieldByAliasName(Name)(方法,与第三个方法类似,此时输入的为该列属性字段的别名,此方法不经常用)
4. IRow接口(esriGeoDatabase)
IRow接口的第一个方法Delete(方法,删除该行)
IRow接口的第二个属性Fields(只读,获取该Feature要素的字段集合,返回值为IFields类型)此方法类似于IFeature接口的Fields属性
IRow 接口的第三个方法Store(方法,保存该行。)此方法类似于IFeature接口的Store方法
IRow接口的第四个属性Table(只读,获取该行所在的表格,返回值为ITable类型)
IRow接口的第五个属性Value(Index) (读写,获取该行在参数索引的字段的值,注意,索引Index是从0开始的。)
object.Value(Index ) = [ value ]
IRow接口的第六个属性HasOID(只读,判断指出该行是否有OID)
IRow接口的第七个属性OID(只读,获取该行的OID值)
5. ITable接口(esriGeoDatabase)
ITable是把要素类当成一个表格来看,每一列对应一个字段(Field),每一行对应一个要素(Feature),所以对要素类(IFeatureClass)接口的操作均可以类似的在Itable接口中找到。
两个接口可以进行如下强制转化:
IFeatureClass pFC;
ITable pTable;
pTable =(ITable)pFC;
ITable接口的第一个方法AddField(Field)(方法,增加一个属性字段到这个表,其中传入的参数为一个IField接口的变量,此变量可以由其他表获得并赋值给要操作的表,可用IFeilds接口的Field属性来获得)
ITable接口的第二个方法GetRow(OID) (方法,通过OID来从表格数据库中获取一行,返回一个IRow接口的变量)此方法类似于IFeatureClass接口的GetFeature方法
ITable接口的第三个方法GetRows(oids, Recycling) (方法,得到一个游标ICursor,通过一个oids的OID数组参数和一个Recycling的布尔类型的参数,一般为True)此方法类似于IFeatureClass接口的GetFeatures方法
ITable接口的第四个方法RowCount(QueryFilter) (方法,得到满足查询过滤器条件的行数。此方法IFeatureClass接口没有,所以是一个很好的有条件查询要素数量的一个方法)
6. IArea接口(esriGeometry)
IArea接口的第一个属性Area(只读,返回一个double类型的数值,为此Area的面积)
IArea接口的第二个属性Centroid(只读,返回一个IPoint类型的变量,为此Area的重心)
IArea接口的第三个属性LablePoint(只读,返回一个IPoint类型的变量,为此Area的标签的位置,一般都在此Area的内部)
IArea接口的第四个方法QueryCentroid (Center ) (方法,Center参数为一个IPoint类型的变量,通过调用此方法将重心点赋值给参数Center)
IArea接口的第五个方法QueryLablePoint (LablePoint ) (方法,LablePoint参数为设置IPoint类型的变量,通过调用此方法将标签点赋值给参数LablePoint)
7. IEnvelope接口(esriGeometry)
IEnvelope接口的第一个方法CenterAt(pPoint) (方法,将这个矩形的边框移动到参数pPoint的位置,但是其他属性不变,如它的Width和Height)
IEnvelope接口的长宽属性Height和Width属性(读写,可以通过该属性获取或设置该边框的长和宽)
IEnvelope接口的4个顶点属性UpperLeft、UpperRight、LowerLeft和LowerRight(读写,返回IPoint类型的四个顶点,比直接获得最值坐标更加方便严谨)
IEnvelope接口的最值坐标属性XMax、XMin、YMax和YMin(读写,可以通过该属性获取或设置该边框的四个顶点的坐标)
IEnvelope接口的第五个方法Union (inEnvelope ) (方法,将参数输入的几何边框和调用该方法的几何边框求并集,并将结果赋值给第一个边框,即调用此方法的object)
例子代码:
IEnvelope接口的第六个方法Union (inEnvelope ) (方法,返回与输入参数相交的区域的几何边框,并将结果赋值给第一个边框,即调用此方法的object)
IEnvelope接口的第七个方法PutCoords (XMin, YMin,XMax,YMax) (方法,将新建的一个边框的4个极坐标设置为输入的参数)
IEnvelope接口的第八个方法QueryCoords (XMin, YMin,XMax,YMax)(方法,将已有的一个边框的4个极坐标输出到参数当中以备后用)
IEnvelope接口的第九个方法Expand (dx, dy, asRatio) (方法,按照输入的dx与dy参数来放大或者缩小当前的边框,用与对ArcMap窗体的中心放大或缩小,或者点击屏幕获得点击点的坐标,并将中心点设置成点击点,并进行一定比例的放大或者缩小)
例子代码:
一般情况设置为True,来控制倍数的放大
IEnvelope接口的第十个方法Offset (X, Y)(方法,将已有的一个边框的按照输入参数的大小来进行水平竖直的移动)
8. IPoint接口(esriGeometry)
IPoint接口的第一个方法PutCoords(X,Y)(方法,设置该点的坐标)或者直接调用可以读写的属性X和Y,将坐标赋值给X和Y
例子代码:
Dim pPoint AsIPoint
Set pPoint = NewPoint
pPoint.PutCoords100,100
IPoint接口的第二个方法QueryCoords(X,Y)(方法,得到该点的坐标)
例子代码:
Dim pPoint asIPoint
Dim dX asDouble,dYasDouble
pPoint.QueryCoordsdX,dY
IPoint接口的第三个方法ConstrainAngle (constraintAngle, anchor, allowOpposite ) (方法,如果第三个参数allowOpposite为True,则将第二个参数anchor这个点作为一个原点,然后以第一个参数 constraintAngle为与x轴的角度,做一条直线,再将调用此参数的点向该直线做垂线并交于一个新点,并将调用此方法的点移动到该点)
IPoint接口的第四个方法ConstrainDistance(constraintRadius, anchor ) (方法,以第二个参数anchor这个点为圆心,然后以第一个参数constraintRadius为半径做一个圆,将调用此参数的点移动到该点与圆心做线段交于该圆的交点上)
9. IPointArray接口(esriGeometry)
IPointArray接口的第一个方法Add(p) (方法,向该类型的数组变量添加Point)
IPointArray接口的第二个属性Count (只读,获得该数组变量中Point的个数,返回Long类型变量)
IPointArray接口的第三个属性Element(Index)(只读,获得该数组变量中位于参数Index索引位置的点Point,返回一个Point类型的变量)
IPointArray接口的第四个方法Insert (Index, p ) (方法,向索引位置Index插入一个点Point)
IPointArray接口的第五个方法Remove (Index ) (方法,移除索引位置Index的点Point)
IPointArray接口的第六个方法RemoveAll (方法,移除所有在此数组中的点)
10. IPointCollection接口(esriGeometry)
IPointCollection接口的第一个方法AddPoint(inPoint [,before] [,after]) (方法,向该类型的点集变量添加Point,第一个参数为添加的Point,第二个第三个参数为可选择的参数,默认添加进点集的末尾)
IPointCollection接口的第二个属性Point(i) (只读,获得该点集变量中第i个位置的Point,返回IPoint类型变量,i从0计算开始)
IPointCollection接口的第三个属性PointCount (只读,获得该点集变量中点的个数,返回Long类型变量,切记,如果一个PointCollection变量是由闭合的Geometry转换而来的话,那么点的个数比节点数多一个,因为是闭合的,所以首位节点是同一个点)
11. IPolyline接口(esriGeometry)
IPolyline接口的第一个属性FromPoint与ToPoint(读写,设置或者读取该点的起始点和终止点,返回都是IPoint类型的变量)
IPolyline接口的第二个方法QueryFromPoint (from )(方法,返回IPoint类型的变量到参数from)
IPolyline接口的第三个方法QueryToPoint (to ) (方法,返回IPoint类型的变量到参数to)
IPolyline接口的第四个方法Generalize (maxAllowableOffset ) (方法,用道格拉斯普克发来简化polyline)
IPolyline接口的第五个方法Weed (maxAllowableOffsetFactor ) (方法,和方法Generalize类似,均为简化polyline的方法,不同的是参数。)
12. IGeometry接口(esriGeometry)
IGeometry接口的第一个属性Dimension(只读,返回一个类型为esriGeometryDimension的该图形的几何维度)
1 esriGeometryNoDimension
2 esriGeometry0Dimension
3 esriGeometry1Dimension
4 esriGeometry2Dimension
5 esriGeometry25Dimension
6 esriGeometry3Dimension
IGeometry接口的第二个属性Extent(只读,返回一个类型为IEnvelope的该图形的几何范围的最大边框)
IGeometry接口的第三个属性GeometryType(只读,返回一个类型为esriGeometryType的该图形的几何类型)
esriGeometryNull = 0
esriGeometryPoint = 1
esriGeometryMultipoint = 2
esriGeometryPolyline = 3
esriGeometryPolygon = 4
esriGeometryEnvelope = 5
esriGeometryPath = 6
esriGeometryAny = 7
esriGeometryMultiPatch = 9
esriGeometryRing = 11
esriGeometryLine = 13
esriGeometryCircularArc = 14
esriGeometryBezier3Curve = 15
esriGeometryEllipticArc = 16
esriGeometryBag = 17
esriGeometryTriangleStrip = 18
esriGeometryTriangleFan = 19
esriGeometryRay = 20
esriGeometrySphere = 21
13. IFeature接口(esriGeoDatabase)
IFeature接口的第一个属性Class(只读)
IFeature接口的第二个方法Delete(方法,删除该行。因为一个Feature在表格中对应的就是一行数据,删除该行就能相应的删除这个Feature)
IFeature接口的第三个属性Extent(只读,获取该Feature要素在地图上的一个矩形范围,返回值为IEnvelope类型)
IFeature接口的第四个属性FeatureType(只读,获取该Feature要素的要素类型,返回值为枚举类型的esriFeatureType)
IFeature接口的第五个属性Fields(只读,获取该Feature要素的字段集合,返回值为IFields类型)
IFeature接口的第六个属性Shape(读写,获取该Feature要素的图形,返回值为IGeometry类型,或者各种实体化的类型,如IPolyline)
IFeature接口的第七个属性ShapeCopy(只读,克隆该Feature要素的几何图形,返回值为IGeometry类型)
IFeature 接口的第八个方法Store(方法,保存该行。)
此属性可用于对Feature要素的几何图形进行操作,步骤如下:
用IFeature.ShapeCopy方法获取一个已经存在的Geometry,或者新建一个Geometry
对Geometry进行操作
通过IFeature.Shape属性将Geometry写入
通过IFeature.Store方法保存该Feature要素
IFeature接口的第九个属性Value(读写,利用字段的索引进行对该要素该字段的值的读写)
注意,索引Index是从0开始的。
object.Value(Index ) = [ value ]
IFeature 接口的第十个属性Table(只读,将该行要素转换成ITable格式的数据,即可对一张表进行数据操作,具体方法查看ITable接口)
14. IFeatureLayer接口(esriCarto)
IFeatureLayer接口的第一个属性FeatureClass(读写,设置或者读取此layer的要素类)
IFeatureLayer接口的第二个属性MaximumScale(读写,设置或者读取此layer显示的最大比例尺)
IFeatureLayer接口的第三个属性MinimumScale(读写,设置或者读取此layer显示的最小比例尺)
IFeatureLayer接口的第四个方法Search (queryFilter, recycling ) (方法,创建一个游标去查询相应设置的过滤器的查询)
IFeatureLayer接口的第五个属性Visible(读写,设置或者读取此layer的可见性)
IFeatureLayer接口的第六个属性AreaOfInterest(只读,读取此layer的最大范围,回返一个IEnvelope接口的变量)
15. IFeatureClass接口(esriGeoDatabase)
IFeatureClass 用于访问控制要素类行为和属性的成员
IFeatureClass接口是获取和设置要素类属性的主要接口。例如,使用IFeatureClass接口获取要素类类型、获取满足查询条件的要素数目或在要素类中创建新要素。
IFeatureClass接口继承了IObjectClass接口。
成员
AddField 向这个类中添加一个字段
AddIndex 向这个类中添加一个索引
AliasName 这个类的别名
AreaField 几何区域字段
CLSID 与这个对象类实例相关的组件类的GUID
CreateFeature 创建一个新要素,系统自动分配一个ID,没有属性值
DeleteField 从对象类中删除字段
DeleteIndex 从对象类中删除索引
EXTCLSID 与这个要素类的扩展类相关的组件类的GUID
Extension 这个对象类的扩展
ExtensionProperties 这个对象类的扩展属性
FeatureClassID 要素类的唯一标识符
FeatureCount 指定查询获得的要素数目
FeatureDataset 包含要素类的要素数据集
FeatureType 要素类中的要素类型
Fields 要素类的字段集合
FindField 指定名称的字段索引
GetFeature 根据对象ID获得要素
GetFeatures 由一系列ID获得Rows的指针
HasOID 指出要素类是否是否有一个要素表示字段(OID)
Indexes 要素类的索引集合
Insert 返回一个可以插入新要素的指针
LengthField 图形长度字段
ObjectClassID 对象类的唯一标识符
OIDFieldName 与OID相关的字段名称
RelationshipClasses 该类参与的关系类
Search 根据指定的查询返回要素的指针
Select 根据查询返回包含对象ID的选择集合
ShapeFieldName 默认Shape字段的名称
ShapeType 要素类中默认Shape的类型
Update 按照查询返回一个更新要素的指针
继承的接口
IObjectClass 获得对象类的信息
IClass 获得类的信息和管理类
实现IFeatureClass的类
FeatureClass FeatureClass对象
NAClass(NetworkAnalyst) 网络分析中将要素输入,以及产生输出要素
NetCDFFeatureClass(DataSourceNetCDF)内存中呈现的NetCDF要素类
RasterCatalog Geodatabase表中的栅格数据集合
RelQueryTable 用于连接有相同数据的两个数据集
RouteEventSource(Location)Route event source对象
TemporalFeatureClass(TrackingAnalyst) 控制时态要素类的设置
XYEventSource XY event source对象
[C#]
//e.g., nameOfFeatureClass=”states”;
//on ArcSDE use ISqlSyntax::QualifyTableName的完全限定表名。
public IFeatureClass getIFeatureClass(IWorkspace workspace,string nameOfFeatureClass)
{
//cast for the feature workspace from the workspace
IFeatureWorkspace featureWorkspace=(IFeatureWorkspace)workspace;
//open the featureclass
return featureWorkspace.OpenFeatureClass(nameOfFeatureClass);
}
几个常用的成员
15.1、IFeatureClass.AddField 方法
[C#]
public void AddField(IField Field)
IFeatureClass.AddField(Field) 方法,增加一个属性字段到这个要素类,其中传入的参数为一个IField接口的变量,此变量可以由其他要素类获得并赋值给要操作的要素类,可用IFeilds接口的Field属性来获得。
返回的错误
-2147220649-FDO_E_TABLE_DUPLICATE_COLUMN
表中已存在指定名称的字段。
-2147220961-FDO_E_NO_SCHEMA_LICENSE
无权修改要素类的结构。使用ArcView的license,向参与集合网络、拓扑和混合关系类(feature-linked annotation)的要素类添加字段能引发这个错误。
15.2、IFeatureClass.DeleteField 方法
[C#]
public void DeleteField(IField Field);
IFeatureClass.DeleteField(Field) 方法,删除一个属性字段,其中传入的参数为一个IField接口的变量。
返回的错误
-2147219878-FDO_E_FIELD_CANNOT_DELETE_WEIGHT_FIELD
不能删除geometric network中与权重相关的字段。
-2147219877-FDO_E_FIEID_CANNOT_DELETE_REQUIRED_FIELD
不能删除所要求的字段。如果字段设为required,可以使用IFieldEdit::Required属性移除required状态,然后就可以删除field了。
-2147220961-FDO_E_NO_SCHEMA_LICENSE
无权修改要素类的结构。使用ArcView的license,向参与集合网络、拓扑和混合关系类(feature-linked annotation)的要素类添加字段能引发这个错误。
-2147215862-FDO_E_SE_DBMS_DOES_NOT_SUPPORT
不能从DB2中删除字段。
DeleteField从从表、对象类或要素类中删除指定字段。Geodatabase需要的和不能删除的字段包括:OBJECTID字段、SHAPE和shape依赖的字段例如SHAPE_Length、网络要素类激活的AncillaryRole和Weight字段、亚字段-如果要删除一个subtype字段,必须以subtype字段删除。
[C#]
//e.g.,fieldName=”MyField”
Public void IClass_DeletField(IFeatureClass featureClass,string fieldname)
{
//The following sample code demonstrates one methodology for deleting
//a field using DeleteFields
IFields fields=featureClass.Fields;
IField field=fields.get_Field(fields.FindField(fieldname));
//IFeatureClass interface inherits from IClass
featureClass.DeleteField(field);
}
15.3、IFeatureClass.CreateFeature 方法
[C#]
public IFeature CreateFeature();
CreateFeature在要素类中创建一个新要素。这个要素仅分配一个唯一的对象ID(OID),没有其他属性值。使用IFeature::Store方法将这个要素存储到database中。当工作在版本要素类上时,CreateFeature应当在edit时期调用。调用IWorkspaceEdit::StartEditing可以开始edit session。对Topology或Geometric Network要素的编辑要在edit阶段进行,并且要包含edit operation。
调用CreateFeature之后,并不自动设置默认的子类型,也不初始化默认值。如果要素没有子类型,调用IRowSubtypes::InitDefaultValues来初始化默认值。可以调用IRowSubtypes::SubtypeCode来设置要素的要素的子类型。
在要素类上调用CreateFeature方法(通过IFeatureClass接口)同调用CreateRow方法(通过ITable接口)的效果相同,不过IFeatureClass的方法返回一个row对象昂的IFeature接口。
创建一个新要素的步骤是:
1) 创建要素
2) 为要素创建几何图形。
3) 在要素中存储几何图形。
4) 存储要素。
15.4、IFeatureClass.CreateFeatureBuffer 方法
[C#]
public IFeatureBuffer CreateFeatureBuffer();
CreateFeatureBuffer方法创建一个feature缓冲区,并返回IFeatureBuffer类型的变量,然后再对这个变量进行操作。结合insert cursor可以使用这个方法在要素类中创建新要素。调用IFeatureClass的CreateFeatureBuffer方法和调用ITable中的CreateRowBuffer的作用相同,只是IFeatureClass的方法返回一个row buffer的IFeatureClass指针。
15.5、IFeatureClass.FeatureCount 方法
[C#]
public int FeatureCount(IQueryFilter QueryFilter);
FeatureCount返回满足某些属性或IQueryFilter指定的空间查询的要素的数量。如果没有指定IQueryFilter,返回要素类中所有要素的数量。
15.6、IFeatureClass.FeatureDataset 属性
这个只读属性返回包含该要素类的数据集的IFeatureDataset接口。如果要素类是一个独立的要素类(无dataset),那么这个动能将会返回一个null值。一个coverage要素类返回指向自身的IFeatureDataset接口。Shapefiles返回一个null指针。
15.7、IFeatureClass.GetFeature 方法
[C#]
public IFeature GetFeature(int ID)
通过给定的对象ID(OID)返回要素的IFeature接口。适用于通过OID寻找提顶要素。使用cursor可以遍历要素类中所有要素。
调用要素类的GetFeature方法(使用IFeatureClass接口)同调用GetRow方法(使用要素类的ITable接口)的效果相同,只是IFeatureClass返回IFeature接口。
[C#]//e.g, nameOfField=”City_Name”
public void IFeatureClass_GetFeature(IFeatureClass featureClass,string nameOfField)
{
//get the index of the field we are interested in
int fieldIndexValue=http://www.mamicode.com/featureClass.FindField(nameOfField);
//get feature with OID 11,because it is known to exist
//This method is typically used to get a feature by know OID
//If you wish to loop through a series of features,use a Cursor.
IFeature feature=featureClass.GetFeature(1);
Console.WriteLine("The {0} field conains a value of{1}",nameOfField,feature.get_Value(fieldIndexValue));
}
15.8、IFeatureClass.GetFeatures 方法
[C#]
public IFeatureCursor GetFeatures(object fids,bool Recycling);
GetFeatures返回包含要素类所有要素OID的IFeatureCursor。这个方法可以用来遍历已知OID的要素集。
调用IFeatureClass的GetFeatures方法和调用ITable的GetRows方法效果相同,只是返回IFeatureCursor接口。
[C#]
//e.g,nameOfField=”Symbol”
public void IFeatureClass_GetFeatures(IFeatureClass featureClass,string nameOfField)
{
//get the index of the field we are interested in
int fieldIndexValue=http://www.mamicode.com/featureClass.FindField(nameOfField);
System.Collections.Generic.List<int> constructoidList=new System.Collections.Generic.List<int>();
constructoidList.Add(1);
constructoidList.Add(2);
constructoidList.Add(3);
constructoidList.Add(4);
constructoidList.Add(10);
int[] oidList=constructoidList.ToArray();
IFeatureCursor featureCursor=featureClass.GetFeatures(oidList,false);
IFeature feature=featureCursor.NextFeature();
//loop through the returned features and get the value for the field
while(feature!=null)
{
//do something with each feature(ie update geometry or attribute)
Console.WriteLine("The {0} field contains a value of {1}",nameOfField,feature.get_Value(fieldIndexValue));
feature=featureCursor.NextFeature();
}
}
15.9、IFeatureClass.Search 方法
[C#]
public IFeatureCursor Search(IQueryFilter filter, bool Recycling);
Search返回满足条件的IFeatureCursor。如果IQueryFilter没有给定值,feature cursor返回要素类的所有要素。再用IfeatureCursor的NextFeature的方法依次得到每一个Feature。
Recycling参数控制row的allocation行为。每次调用简单要素对象时,Recycling cursors可以rehydrate该对象,并可以最优化只读访问,例如在绘图时。多次调用cursor的NextFeature,维持recycling cursor返回的引用并不合法。不能修改要素对象返回的recycling cursor。使用Non-recycling cursor每次返回一个单独的要素。non-recycling返回的要素可以修改、存储各种行为。Geodatabase保证在编辑阶段non-recycling要素的唯一语义。如果搜索的要素已经被应用程序引用,将返回一个要素的地址。
Search方法返回的non-recycling要素指针并不用来更新cursor中的要素。Update方法返回的feature cursor可以用来更新要素。
[C#]
//下面的例子使用属性查询和空间查询获得要素的子集。
//在要素类中,遍历所有要素,并计算它们的的总面积。
public void IFeatureClass_Search(IFeatureClass featureClass)
{
//在这个函数中将使用空间过滤器,并结合属性查询进行搜索。
//在搜索中不必执行两种过滤类型,可以单独使用每一种。
//创建一个envelope在空间上限制搜索。
//(注意:只有高级geometries、envelopes和geometrybags可以使用)
ESRI.ArcGIS.Geometry.IEnvelope envelope=new ESRI.ArcGIS.Geometry.EnvelopeClass();
envelope.PutCoords(508786,681196,513033,684341);
//创建一个空间查询
ISpatialFilter spatialFilter=new SpatialFilterClass();
//指定一个查询的的几何图形
spatialFilter.Geometry=(ESRI.ArcGIS.Geometry.IGeometry)envelope;
//确定在要素类上查询的几何字段
string shpFld=featureClass.ShapeFieldName;
spatialFilter.GeometryFiled=shpFld;
//指定要使用的空间操作
spatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelIntersects;
//创建where表达式,这里只要要素
//在envelope中有一个子类型"COM"
spatialFilter.WhereClause="subtype=‘COM‘";
//将spatial filter赋给IQueryFilter接口
IQueryFilter queryFilter=new QueryFilterClass();
queryFilter=(IQueryFilter)spatialFilter;
//在要素类上进行搜索,使用cursor保存结果
IFeatureCursor featureCursor=featureClass.Search(queryFilter,false);
//第一个返回的要素
IFeature feature=featureCursor.NextFeature();
//获得“Area”字段
IFields fields=featCursor.Fields;
int areaIndex=fields.FindField("Area");
//保存总面积的变量
double searchedArea=0;
//遍历所有要素计算总面积
while(feature!=null)
{
searchedArea=searcheArea+(double)feature.get_Value(areaIndex);
feature=featureCursor.NextFeature();
}
Console.WriteLine("The total area of searched features is {0}",searchedArea);
System.Runtime.InteropServices.Marshal.ReleaseComObject(featureCursor);
}
15.10、IFeatureClass.Select 方法
[C#]
public ISelectionSet Select(IQueryFilter QueryFilter, esriSelectionType selType, esriSelectionOption selOption, IWorkspace selectionContainer);
Select返回一个满足条件的ISelectionSet。如果IQueryFilter中无值,将选择要素类的所有要素。调用IFeatureClass的Select方法同调用ITable中的相应方法效果相同。调用Select时,selectionContainer不需要参数。实参应为Null(C#,VB.Net)或者Nothing(VB6)。(注意:提供workspace类型的selectionContainer只读参数将会失败,因为Select会将选择的结果写入workspace。
IFeatureClass Select Example
[C#]
public void IFeatureClass_Select_Example(IFeatureClass featureClass)
{
//创建查询过滤器并附予一个where从句
IQueryFilter queryFilter=new QueryFilterClass();
queryFilter.WhereClause="Shape_Area>77000";
//使用query过滤器选择要素
//调用Select时不需要selectionContainer参数。在C#和VB.Net中赋给其Null值
ISelectionSet selectionSet=featureClass.Select(queryFilter,esriSelectionType.esriSelectionTypeIDSet,esriSelectionOption.esriSelectionOptionNormal,null);
//计算选择的要素数目
Console.WriteLine("{0}features where selected from{1} with where clause {2}",selectionSet.Count,featureClass.AliasName,queryFilter.WhereClause);
}
16. IFeatureCursor接口(esriGeoDatabase)
IFeatureCursor接口用于遍历从FeatureLayer等搜索出来的结果,可用来访问要素类中的一系列要素。虽然它并没有继承ICursor接口,但它的操作方法同ICursor一样,这样在处理features时,不像rows那样,可以不使用QI。
成员
DetleteFeature,
Fields,
FindField,
Flush,
InsertFeature,
NextFeature,
UpdateFeature.
16.1、IFeatureCursor.NextFeature方法
[C#]
public IFeature NextFeature();
IFeatureCursor.NextFeature方法,将游标向前跳到下一个位置,并且返回该位置的Feature.
当你使用cursor获取非geodatabase的要素时,返回的空间参考为指定的类型。
不能确保要素的几何图形仍然在该空间参考中。例如,若使用非recycling cursor,你获得的要素可以与其他人共享,任何人在任何时间都能改变其空间参考。如果想恢复或获得指定的空间参考,开发者要测试要素的空间参考或几何图形。
16.2、IFeatureCursor.UpdateFeature方法
[C#]
public void UpdateFeature(IFeature Object);
IFeatureCursor.UpdateFeature(Feature) 方法,对当前游标位置的Feature进行更新)
[C#]
public void IFeatureCursor_UpdaterFeature_Example(IFeatureClass featureClass)
{
IQeryFilter queryFilter=new QueryFilterClass();
queryFilter.WhereClause="ZONING=‘U‘";
IFeatureCursor updateCursor=featureClass.Update(queryFilter,false);
int fieldIndex=featureClass.FindField("ZONING");
IFeature feature=updateCursor.NextFeature();
While(feature!=null)
{
m++;
feature.set_Value(fieldIndex,"C");
updateCursor.UpdateFeature(feature);
feature=updateCursor.NextFeature();
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(updateCursor);
16.3、IFeatureCursor.InsertFeature方法
用参数传进来的属性值插入一个新的要素到数据库中,返回该插入新的Feature的ID值,其中参数类型为IFeatureBuffer。
17. ISpatialFilter接口(esriGeoDatabase)3sNews.Net——最具影响力的中国地理空间信息门户网站 M"@/L;~D&c,i&c
用于返回和修改filter使用的空间关系(空间拓扑查找的功能,即:在图形上通过某一范围查找空间制定要素)。是一个包含空间和属性限制的QueryFilter。因此可以使用SpatialFilter来限制从要素类中获得的要素集。ISpatialFilter继承IQueryFilter接口,因此可以指定一个whereclause、返回的colunms或者指定输出图形的空间参考。使用spatial filter执行空间查询,常将其作为IFeatureClass::Search、IFeatureClass::Select或feature layers上相似方法的参数。
17.1、ISpatialFilter.Geometry属性
Geometry是源图形,根据与其的关系执行空间选择。
17.2、ISpatialFilter. GeometryField属性
GeometryField是图形字段名,将其中的图形与源图形比较。
17.3、ISpatialFilter. SpatialRel属性
SpatialRel属性将一个esriSpatialRelEnum传入来指定空间关系。
ISpatialFilter Example
[C#]
NOTE:要用到ISpatialFilter的三个方法Geometry,GeometryField和SpatialRel。
public void ISpatialFilter_(IFeatureClass featureClass)
{
//Create a point to use for the search;
ESRI.ArcGIS.Geometry.IPoint point=new ESRI.ArcGIS.Geometry.PointClass();
point.PutCoords(-117.946,35.823);
//Getting a reference;
ISpatialFilter spatialFilter=new SpatialFilterClass();
//Setting the Geometry,GeometryField and SpatialRel parameters;
spatialFilter.Geometry=point;
spatialFilter.GeometryField=featureClass.ShapeFieldName;
spatialFilter.SpatialRel=esriSpatialRelEnum.esriSpatialRelIntersects;
//Execute the spatiafilter;
IFeatureCursor featureCursor=featureClass.Search(spatialFilter,false);
}
18. IQueryFilter接口(esriGeoDatabase)3sNews.Net——最具影响力的中国地理空间信息门户网站 M"@/L;~D&c,i&c
IQueryFilter接口的第一个属性WhereClause(读写,为过滤器设置条件语句)
各种不同的数据,设置条件查询语句的语法是不相同的,如一个shp文件在设置字段的时候要加“””双引号,而在SDE数据连接中,则什么都不加;在gdb文件的语句中,符号是“*”,而在SDE或者shp文件查询中则是“%”
IQueryFilter接口的第二个属性SubFields(读写,为过滤器设置提供赛选的字段,用逗号来分隔每一个逗号,如果不设置该属性,则当做所有字段均为查找字段)
19. IFeatureSelection接口(esriCarto)
IFeatureSelection接口的第一个方法SelectFeatures (Filter, Method, justOne ) (方法,根据指定的标准过滤器filter和方法,选择要素,第一个参数为QueryFilter类型的变量,第二个参数为esriSelectionResultEnum类型的变量,第三个参数为布尔型变量,通常为false)
20. IMap接口(esriCarto)
IMap接口的第一个属性Layers (uid, recursive ) (只读,第二个参数为True的时候,该属性获取第一个参数uid指定的Layers,赋值给一个IEnumLayer的变量)
IMap接口的第二个属性LayerCount(只读,返回该map里面Layer的个数)
IMap接口的第三个属性Layer(Index) (只读,返回指定索引index位置的Layer)
IMap接口的第四个方法AddLayer(Layer) (方法,向该map添加一个Layer)
IMap接口的第五个方法AddLayers(Layers, autoArrange) (方法,添加一个EnumLayer变量的layers到该map,第一个参数为IEnumLayer类型,第二个参数为bool型变量)
IMap接口的第六个方法ClearLayers(方法,将所有的layer从map中移除)
IMap接口的第七个方法ClearSelection(方法,将该map中选择的要素清空)
IMap接口的第八个属性SelectionCount(只读,返回该map被选中要素的个数)
IMap接口的第九个方法SelectFeature(Layer,Feature) (方法,从一个Layer中选择一个Feature)
IMap接口的第十个属性MapScale(读写,获取或者设置当前map的地图比例尺,double类型)
IMap接口的第十一个方法MoveLayer(Layer,toIndex) (方法,把一个Layer从当前的位置移动到指定的索引位置)
IMap接口的第十二个方法SelectByShape(Shape, env, justOne) (方法,从Layer中依靠一个图形的范围shape和一个选择的环境env来选择要素,而在所有图层中只从IFeatureLayer的图层中进行选择)
21. IPropertySet接口(esriSystem)
IPropertySet接口的第一个方法SetProperties (names, values ) (方法,设置属性)
IPropertySet接口的第二个方法SetProperty (name, value ) (方法,设置属性)
22. IFeatureWorkspace接口(esriGeoDatabase)
IFeatureWorkspace接口用于访问和管理地理数据库中的要素的重要成分 -- 数据集,如Tables,ObjectClasses,FeatureClasses,FeatureDatasets,和RelationshipClasses。所有的Open方法(例如OpenTable)都要以dataset的名称作为输入。在企业数据库上工作时,就需要使用完全限定名(例如,”database.owner.tablename”或”owner.tablename”)。
处理地理数据库时(personal,file或ArcSDE),workspace将运行一个实例datasets的对象表。不同的opendatasets的方法返回一个对其的引用。
IFeatureWorkspace是用workspace创建和打开对象、对象类的主接口。
成员:
CreateFeatureClass,
CreateFeatureDataset,
CreateQueryDef,
CreateRelationshipClass,
CreateTable,
OpenFeatureClass,
OpenFeatureDataset,
OpenFeatureQuery,
OpenRelationshipClass,
OPenRelationshipQuery,
OpenTable。
常用的成员:
22.1、IFeatureWorkspace.CreateFeatureClass方法
[C#]
public IFeatureClass CreateFeatureClass(string Name,IFields Fields,UID CLSID,UID EXTCLSID,esriFeatureType FeatureType,string ShapeFieldName,string ConfigKeyword);
CreateFeatureClass方法可以用来创建独立的要素类。除了CreateTable所需的参数外,还要指定FeatureType参数(如esriFTsimple,esriFTComplexEdgeFeature和其他)和shapeFieldName。ShapeFieldName表示要素类几何图形字段的名称。在调用CreateFeatureClass之前,设置好GeometryDef对象的空间参考以及空间索引。
在Geodatabase wokspace中创建FeatureClass要包含一些必须的字段。从你要创建的对象类型的类描述中可以获得所需字段(IObjectClassDescription的RequiredFields字段)。
CLSID参数用来指定实例化对象的GUID。如果未传入参数,地理数据库将使用与esriGeoDatabase.Feature有关的CLSID。多数例子中该法可行。如果要素类有自定义的Feature而不是esriGeoDatabase.Feature,这时或以后调用要素类的IClassSchemaEdit接口传入GUID。
EXTCLSID可选参数指定实例化FeatureClassExtension对象的GUID。该对象至少要支持IClassExtension接口。使用configurationKeyword参数可以控制RDBMS中的表的物理布局—例如,在Oracle数据库中,configuration keyword控制表创建的空间、初始化、next extents和其他属性。ArcSDE的configurationKeyword由ArcSDE data adimistrator设置。
在9.2地理数据库之前的workspace中,GeometryDef引用一个低精度的空间参考。9.1和之前的版本只支持低精度的空间参考,9.2要求高精度的空间参考。使用IControlPrecision2::IsHighRecision来管理空间参考的精度。使用IGeodatabaseRelease接口释放geodatabase。
注意:不支持下列表和要素名称前缀:”gdb_”,”sde_”,”delta_”
22.2、IFeatureWorkspace.OpenFeatureClass方法
[C#]
public IFeatureClass OpenFeatureClass(string Name);
使用完全限定名可以打开workspace中任何已存在的要素类。地理数据库中的每一个要素类都有唯一的完全限定名,使用OpenFeatureClass可以直接打开要素类。
使用IDatabaseConnectionInfo接口确定User和Database。ISQLSyntax::QualifyTableName可以用来确定要素类的完全限定名。使用IWorkspace2接口的NameExists来确定geodatabase中的要素类是否有适当的名称。
打开参与topology或geometric network的要素类将在内存中打开所有参与的要素类。
OpenFeatureClass名称参数的一些例子。
Coverage要素类
building:polygon
Oracle 要素类(如果已经连接到要素类,则不需要owner前缀。
gdb.Buildings
SQLServer要素类
fdo_data.gdb.Buildings
Informix要素类
Bladetest2:gdb.Buildings
VPF要素类
Ks032193:veg:vgfarea(library:coverage:feature class)
VPF数据的library名称区分大小写,并且要和LAT中存储的一致(Library Attribute Table)
与Topology有关的4个表格:T_#_DirtyAreas,T_#_PolyErrors,T_#_LineErrors和T_#_PointErrors可以直接编辑。由于这个原因他们不能打开,打开时返回一个地理数据库的错误。
23. IWorkspaceEdit接口(esriGeoDatabase)
在实际问题中,如果有多次操作需要更改Feature的时候,切记要将操作对象重新赋值,不然在pWorkspaceEdit.StopEditing(true)的时候会出现错误,报错代码为-2147467259。
(详细代码可见WindowsApplication6的代码,其中详细操作了对字段的编辑过程,其中涉及到很多对字段Field的方法 Add(Field),Delete(Field),get_value(object value),set_value(intindex, object value)等等操作,其中还涉及到Feature经过ICursor类选取与经过FeatureClass类的方法GetFeature选取的区别)
24. IWorkspaceFactory接口(esriGeoDatabase)
IWorkspaceFactory接口提供创建和打开workspace的成员以及访问workspace factory信息的成员。
当需要创建一个新的workspace,连接已存在的workspace和寻找有关workspace的信息时使用IWorkspaceFactory接口。
成员
24.1、IWorkspaceFactory.ContainsWorkspace方法
[C#]
public bool ContainsWorkspace(sring parentDirectory,IFileNames filenames);
浏览文件系统查询查找workspace时,ContainsWorkspace非常有用。它提供一个parent directory和待检查的文件名称列表。如果parent directory表示这个factory的一个workspace或parent directory包含一个workspace或一个workspace的connection文件时,返回true。
[C#]
//e.g.,nameOFFile="canada.mdb"//Personal Geodatabase
//nameOFFile="canada.gdb"//File Geodatabase
public Boolean IWorkspaceFactory_ContainsWorkspace_Example(string nameOfFile)
{
//use with AccessWorkspaceFactory
IWorkspaceFactory workspaceFactory=new ESRI.ArcGIS.DataSourcesGDB.AccessWorkspaceFactoryClass();
//for FileGDB use ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactoryClass();
ESRI.ArcGIS.esrSystem.IFileNames fileNames=new ESRI.ArcGIS.esriSystem.FileNamesClass();
fileNames.Add(nameOfFile);
return workspaceFactory.ContainsWorkspace("E:\\data\\english\\canada\\",fileNames);
}
24.2、IWorkspaceFactory.Create方法
[C#]
public IWorkspaceName Create(string parentDirectory,string Name,IPropertySet ConnectionProperties,int hWnd);
Workspace factory由多种类型,Create会产生不同的结果。ArcSDE类型,将会产生一个新的connection文件(.sde)。ArcInfo workspace factory类型,创建一个INFO的亚文件夹。ConnectionProperties参数是个可选项,指定任何额外的所需连接属性,例如创建远程数据库workspace时的connection文件所需的server,instance,user和password。如果没有指定连接属性,这个方法将会返回一个对话框提醒用户需要属性。
[C#]
public void IWorkspaceFactory_Create_Example_Access()
{
//create a new Access workspace factory
IWorkspaceFactory workspaceFactory=new ESRI.ArcGIS.DataSourcesGDB.AccessWorkspaceFactoryClass();
//Create a workspacename with the workspace factory
IWorkspaceName workspaceName=workspaceFactory.Create("C:\\temp\\","MyNewpGDB.mdb",null,0);
//Cast for IName
ESRI.ArcGIS.esriSystem.IName name=(ESRI.ArcGIS.esriSystem.IName)workspaceName;
//Open a reference to the access workspace through the name object
IWorkspace pGDB_workspace=(IWorkspace)name.Open();
Console.WriteLine("Current path of the{0} is {1}",pGDB_workspace.Type,pGDB_workspace.PathName);
}
public void IWorkspaceFactory_Create_Example_FileGDB()
{
//create a new FileGDB workspace factory
IWorkspaceFactory workspaceFactory=new ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactoryClass();
//Create a workspacename with the workspace factory
IWorkspaceName workspaceName=workspaceFactory.Create("C:\\temp\\","MyNewFileGDB.gdb",null,0);
//Cast for IName
ESRI.ArcGIS.esriSystem.IName name=(ESRI.ArcGIS.esriSystem.IName)workspaceName;
//Open a reference to the FileGDB workspace through the name object
IWorkspace fileGDB_workspace=(IWorkspace)name.Open();
Console.WriteLine("Current pathe of the {0} is {1}",fileGDB_workspace.Type,fileGDB_workspace.PathName);
}
public void IWorkspaceFactory_Create_Example_ArcSDE()
{
ESRI.ArcGIS.esriSystem.IPropertySet propertySet=new ESRI.ArcGIS.esriSystem.PropertySetClass();
propertySet.SetProperty("Server","testserver");
propertySet.SetProperty("Instance","5151");
propertySet.SetPropert("Database","sde");
propertySet.SetProperty("pasword","go");
propertySet.SetProperty("version","sde.DEFAULT");
//Create a workspacename with the workspace factory
IWorkspaceFactory workspaceFactory=new ESRI.ArcGIS.DataSourcesGDB.SdeWorkspaceFactoryClass();
//Create a workspacename with the workspace factory
IWorkspaceName workspaceName=workspaceFactory.Create("C:\\temp\\","MyNewArcSDE_Connection.sde",propertySet,0);
//Cast for IName
ESRI.ArcGIS.esriSystem.IName name=(ESRI.ArcGIS.esriSystem.IName)workspaceName;
//Open a reference to the sde workspace through the name object
IWorkspace sde_workspace=(IWorkspace)name.Open();
//the path returned in this case weill be for the sde connection
Console.WriteLine("Current path of the {0} is {1}",sde_workspace.Type,sde_workspace.PathName);
}
24.3、IWorkspaceFactory.GetWorkspaceName方法
[C#]
public IWorkspaceName GetWorkspaceName(string parentDirectory,IFileNames filenames);
Example
[C#]
public void IWorkspaceFactory_GetWorkspaceName_Example()
{
ESRI.ArcGIS.esriSystem.IFileNames fileNames=new ESRI.ArcGIS.esriSystem.FileNamesClass();
fileNames.Add("shapefile");
fileNames.Add("access\\canada\\cananda.mdb");
fileNames.Add("access\\big.mdb");
IWorkspaceFactory workspaceFactory=new ESRI.ArcGIS.DataSourcesGDB.AccessWorkspaceFactoryClass();
IWorkspaceName workspaceName=workspaceFactory.GetWorkspaceName("E:\\data\\english",fileNames);
Console.WriteLine(workspaceName.PathName);
fileNames.Reset();
string fn=fileNames.Next();
while(fn!=null)
{
Console.WriteLine(fn);
fn=fileNames.Next();
}
ESRI.ArcGIS.esriSystem.IName name=(ESRI.ArcGIS.esriSystem.IName)workspaceName;
IWorkspace workspace=(IWorkspace)name.Open();
}
24.4、IWorkspaceFactory.Open方法
[C#]
public IWorkspace Open(IPropertySet ConnectionProperties,int hWnd);
Example
[C#]
Public IWorkspace IWorkspaceFactory_Open_Example(String server,String instance,String user,String password,String database,String version)
{
ESRI.ArcGIS.esriSystem.IPropertySet propertySet=new ESRI.ArcGIS.esriSystem.PropertySetClass();
propertySet.SetProperty(“SERVER”,server);
propertySet.SetProperty(“INSTANCE”,instance);
propertySet.SetProperty(“DATABASE”,database);
propertySet.SetProperty(“USER”,user);
propertySet.SetProperty(“PASSWORD”,password);
propertySet.SetProperty(“VERSION”,version);
IWorkspaceFactory worspaceFactory=new ESRI.ArcGIS.DataSourcesGDB.SdeWorkspaceFactoryClass();
Return workspaceFactory.Open(propertySet,0);
}
24.5、IWorkspaceFactory.OpenFromFile方法
[C#]
public IWorkspace OpenFromFile(string fileName,int hWnd);
OpenFromFile采用表示FileSystemWorkspace或LocalDatabaseWorkspace,或是RemoteDatabaseWorkspace的connection文件的参数,并返回一个指定workspace的接口。这些方法的客户然后就可以打开和访问workspace中的数据集。调用这些方法时,如果属性不足,将提供一个连接对话框提示需要其他属性。
hWnd引数是父窗体或应用程序窗体,确保connection对话框有正确的父窗体。
Example
[C#]
//e.g.,nameOfFile="E:\\data\\english\\access\\canada\\canada.mdb"
public IWorkspace IWorkspaceFactory_OpenFromFile_Example_Access(string nameOfFile)
{
IWorkspaceFactory workspaceFactory=new ESRI.ArcGIS.DataSourcesGDB.AccessWorkspaceFactoryClass();
return workspaceFactory.OpenFromFile(nameOfFile,0);
}
//e.g.,nameOfFile="E:\\data\\english\\FileGDB\\canada\\canada.gdb"
public IWorspace IWorkspaceFactory_OpenFromFile_Example_FileGDB(string nameOfFile)
{
IWorkspaceFactory workspaceFactory=new ESRI.ArcGIS.DataSourcesGDB.FileGDBWorkspaceFactoryClass();
return workspaceFactory.OpenFromFile(nameOfFile,0);
}
//e.g.,nameOfFile="D:\\data\\redarrow.sde"
public IWorkspace IWorkspaceFactory_OpenFromFile_Example_ArcSDE(string nameOfFile)
{
IWorkspaceFactory workspaceFactory=new ESRI.ArcGIS.DataSourcesGDB.SdeWorkspaceFactoryClass();
return workspaceFactory.OpenFromFile(nameOfFile,0);
}
//The connection string for a shapefile should be the full path
//to the shapfile‘s folder(e.g.,"C:\\temp")
//Note:location cannot be relative path ".\\temp" it must be an explicit pathname
public IWorkspace IWorkspaceFactory_OpenFromFile_Example_Shapefile(string nameOfFile)
{
IWorkspaceFactory workspaceFactory=new ESRI.ArcGIS.DataSourcesFile.ShapefileWorkspaceFactoryClass();
return workspaceFactory.OpenFromFile(nameOfFile,0);
}
WorkspaceFactory负责管理workspace,允许用户通过一系列connection properties连接workspace。一个workspace表示包含一个或多个数据集的数据库。Dataset包括tables,feature classes和relationship classes。一个workspaceFactory是可以单独创建的。一个WorkspaceFactory包括应用程序引用的当前连接的活动的workspaces。使用PropertySet指定Connection属性,并且可以存到connection文件中。WorkspaceFactory也支持浏览和管理file system Workspaces,以及管理remot database workspaces。
25. ITopologicalOperator接口(esriGeometry)
可以将一个Polygon类型的数据或者Polyline的数据赋值给该接口的变量,如:
Set pUnionedPolylines =NewPolyline Set pTopOp = pUnionedPolylines
ITopologicalOperator接口的第一个方法ConstructUnion(geometries ) (方法,合并图形的工具,输入的参数是一个IEnumGeometry类型的参数,此方法效率甚高)
ITopologicalOperator接口的第二个方法Cut(cutter, leftGeom, rightGeom) (方法,剪切图形,第一个参数为剪切的线要素,为IPloyline类型,第二个第三个参数均为剪切后的图形,为输出参数)
ITopologicalOperator接口的第三个方法Boundary(方法,获取一个图形的边框,一个Polygon的boundary是一个Polyline类型的要素,一个Polyline的boundary是一个nultipoint类型的要素,一个Point的boundary是为空的)
ITopologicalOperator接口的第四个方法Buffer(distance) (方法,创造一个Polygon的要素来显示缓冲区域,参数为缓冲距离)
ITopologicalOperator接口的第五个方法Clip (clipperEnvelope ) (方法,输入一个IEnvelope类型的变量,来获取被这个边框剪切的要素,并将切割后的变量返回给调用方法的变量)
ITopologicalOperator接口的第六个方法QueryClipped (clipperEnvelope, clippedGeometry ) (方法,与Clip类似,但是第二个参数为剪切后返回输出的参数,本身不会改变)
ITopologicalOperator接口的第七个方法ConvexHull(方法,构造一个Geometry,大部分为Polygon类型的几何要素,该要素为调用此方法的ITopologicalOperator类型的变量最小的外边框)
ITopologicalOperator接口的第八个方法SymmetricDifference (other ) (方法,并集减去交集的部分,调用次方法的变量为第一个参数,other为第二个参数,最后返回变量到一个Geometry类型的变量,该变量的范围均在两个参数范围内,但不在两个参数相交的部分)
ArcGIS Engine开发之旅04---ARCGIS接口详细说明