Dim pMap AsImap
Set pDoc = ThisDocument Set pMap = pDoc.Maps.Item(0) Set pFeatLayer = pMap.Layer(0) Set pFeatcls = pFeatLayer.FeatureClass
Dim pFeatCur AsIFeatureCursor Dim pFeatBuf AsIFeatureBuffer Dim v AsVariant
Set pFeatCur = pFeatcls.Insert(True) Set pFeatBuf = pFeatcls.CreateFeatureBuffer v =pFeatCur.InsertFeature(pFeatBuf)
IFeatureClass接口的第八个方法CreateFeatureBuffer(方法,新建一个缓冲,返回一个IFeatureBuffer类型的变量,然后再对这个变量进行操作)
例子代码:
Dim pFeatcls AsIFeatureClass Dim pFeatLayer AsIFeatureLayer Dim pDoc AsIMxDocument Dim pMap AsIMap
Set pDoc = ThisDocument Set pMap = pDoc.Maps.Item(0) Set pFeatLayer = pMap.Layer(0) Set pFeatcls = pFeatLayer.FeatureClass
'createafeaturecursorandfeaturebufferinterface Dim pFeatCur AsIFeatureCursor Dim pFeatBuf AsIFeatureBuffer
'openthefeaturecursorandfeaturebuffer Set pFeatCur = pFeatcls.Insert(True) Set pFeatBuf = pFeatcls.CreateFeatureBuffer
'getthelistoffields Dim pFlds AsIFields Dim pFld AsIField Dim i AsLong Dim pPolygon AsIPolygon Dim pPolyline AsIPolyline Dim pPt AsIPoint
Set pPolygon = NewPolygon Set pPolyline = NewPolyline Set pPt = NewPoint
'findthegeometryfield,basedontheshapetype, 'setthevalueforthefieldtotheappropriateobject Set pFlds = pFeatcls.Fields For i = 1TopFlds.FieldCount- 1 Set pFld = pFlds.Field(i)
If (pFld.Type = esriFieldTypeGeometry)Then Dim pGeom AsIGeometry
Select CasepFeatcls.ShapeType CaseesriGeometryPolygon SetpGeom =pPolygon CaseesriGeometryPolyline SetpGeom =pPolyline CaseesriGeometryPoint SetpGeom =pPt End Select
'set the valueinthefeaturebuffer pFeatBuf.Value(i) = pGeom
'if it isnotageometrycolumn,determinewhatkindof 'field it is,andinserttheequivalentofanullvalue 'for that fieldtype Else
IfpFld.Type =esriFieldTypeIntegerThen pFeatBuf.Value(i) = CLng(0)
ElseIfpFld.Type =esriFieldTypeDoubleThen pFeatBuf.Value(i) = CDbl(0)
ElseIfpFld.Type =esriFieldTypeSmallIntegerThen pFeatBuf.Value(i) = CInt(0) ElseIfpFld.Type =esriFieldTypeStringThen pFeatBuf.Value(i) = \ Else
MsgBox\ EndIf End If
Next i
'insertthefeaturefromthebufferintothedatabase pFeatCur.InsertFeaturepFeatBuf
14. 关于ITable接口(esriGeoDatabase)
ITable是把要素类当成一个表格来看,每一列对应一个字段(Field),每一行对应一个要素(Feature),所以对要素类(IFeatureClass)接口的操作均可以类似的在Itable接口中找到。 两个接口可以进行如下强制转化:
VB语言
Dim pFC AsIFeatureClass Dim pTable AsITable Set pTable = pFC
C#语言
IFeatureClass pFC; ITable pTable; pTable =(ITable)pFC;
ITable接口的第一个方法AddField(Field)(方法,增加一个属性字段到这个表,其中传入的参数为一个IField接口的变量,此变量可以由其他表获得并赋值给要操作的表,可用IFeilds接口的Field属性来获得)
ITable接口的第二个方法GetRow(OID) (方法,通过OID来从表格数据库中获取一行,返回一个IRow接口的变量)此方法类似于IFeatureClass接口的GetFeature方法
例子代码:
Dim pWorkspace AsIWorkspace Dim pFact AsIWorkspaceFactory
' This example usesanSDEconnection.Thiscodeworksthe 'sameforanyopenIWorkspace.
Dim pPropset AsIPropertySet Set pPropset = NewPropertySet With pPropset
.SetProperty \ .SetProperty \ .SetProperty \ .SetProperty \ .SetProperty \ .SetProperty \
End With
Set pFact = NewSdeWorkspaceFactory Set pWorkspace = pFact.Open(pPropset,Me.hWnd) Dim pFeatureWorkspaceAsIFeatureWorkspace Set pFeatureWorkspace =pWorkspace
Dim pTable AsITable
Set pTable = pFeatureWorkspace.OpenTable(\ Dim pRow AsIRow
Set pRow = pTable.GetRow(59) Debug.Print pRow.Value(2)
ITable接口的第三个方法GetRows(oids, Recycling) (方法,得到一个游标ICursor,通过一个oids的OID数组参数和一个Recycling的布尔类型的参数,一般为True)此方法类似于IFeatureClass接口的GetFeatures方法
例子代码:
Dim iOIDList() AsLong Dim iOIDListCount AsLong iOIDListCount =5
ReDim iOIDList(iOIDListCount) iOIDList(0) =1 iOIDList(1) =2 iOIDList(2) =3 iOIDList(3) =4
iOIDList(4) =50
Dim pCursor AsICursor
Set pCursor = pTable.GetRows(iOIDList,True) Dim pRow AsIRow Set pRow = pCursor.NextRow While Not pRowIsNothing Debug.Print pRow.Value(2) Set pRow =pCursor.NextRow
Wend
ITable接口的第四个方法RowCount(QueryFilter) (方法,得到满足查询过滤器条件的行数。此方法IFeatureClass接口没有,所以是一个很好的有条件查询要素数量的一个方法)
15. 关于IFeatureCursor接口(esriGeoDatabase)
Dim pFeatureSelectionAsIFeatureSelection Set pFeatureSelection =pFeatureLayer Dim pSelectionSet AsISelectionSet
Set pSelectionSet = pFeatureSelection.SelectionSet Dim pFeatureCursor AsIFeatureCursor pSelectionSet.SearchNothing,True,pFeatureCursor Dim pDataStats AsIDataStatistics Set pDataStats = NewDataStatistics Set pDataStats.Cursor =pFeatureCursor pDataStats.Field =\ MsgBox pDataStats.Statistics.Mean
IFeatureCursor接口的第一个方法NextFeature(方法,将游标向前跳到下一个位置,并且返回该位置的Feature) IFeatureCursor接口的第二个方法UpdateFeature(Feature) (方法,对当前游标位置的Feature进行更新)
例子代码:
'Assume we alreadyhaveareferencetoafeatureclasswiththem_pFClassvariable Dim pFCursorAsIFeatureCursor Dim pFieldsAsIFields Dim pFeatureAsIFeature Dim iAsLong