本文對featureclass中插入和刪除feature的幾種方法進行了比較。
一、插入單個feature,方法1和方法2差別不大
方法1:
''' <summary>
''' 向featureclass中插入feature
''' </summary>
''' <param name="pFeatureClass">要插入的featureclass</param>
''' <remarks></remarks>
Private Sub InsertFeature(ByVal pFeatureClass As IFeatureClass, ByVal pGeo As IGeometry)
If pFeatureClass Is Nothing Then Exit Sub
Dim pFeatBuf As IFeatureBuffer = pFeatureClass.CreateFeatureBuffer()
Dim pFeat As IFeature = pFeatBuf
Dim pFeatCur As IFeatureCursor = pFeatureClass.Insert(True)
pFeat.Shape = pGeo
pFeatCur.InsertFeature(pFeatBuf)
pFeatCur.Flush()
End Sub
方法2:
''' <summary>
''' 向featureclass中插入feature
''' </summary>
''' <param name="pFeatureClass">要插入的featureclass</param>
''' <remarks></remarks>
Private Sub InsertFeature1(ByVal pFeatureClass As IFeatureClass, ByVal pGeo As IGeometry)
If pFeatureClass Is Nothing Then Exit Sub
Dim pFeature As IFeature = pFeatureClass.CreateFeature()
pFeature.Shape = pGeo
pFeature.Store()
End Sub
二、批量插入feature,如果用feature.store,一個個插入,較之buffer方法,會慢很多
方法1:
''' <summary>
''' 向featureclass中批量插入features
''' </summary>
''' <param name="pFeatureClass">要插入的featureclass</param>
''' <remarks>批量插入features,用buffer的方法,要比迴圈一個個Store的方法快</remarks>
Public Sub InsertFeatures(ByVal pFeatureClass As IFeatureClass, ByVal pGeos As List(Of IGeometry))
If pFeatureClass Is Nothing Then Exit Sub
Dim pFeatBuf As IFeatureBuffer = pFeatureClass.CreateFeatureBuffer()
Dim pFeat As IFeature = pFeatBuf
Dim pFeatCur As IFeatureCursor = pFeatureClass.Insert(True)
For i As Integer = 0 To pGeos.Count - 1
pFeat.Shape = pGeos(i)
pFeatCur.InsertFeature(pFeatBuf)
''避免一次flush,導致速度過慢
If i Mod 100 = 0 Then
pFeatCur.Flush()
End If
Next
pFeatCur.Flush()
End Sub
三、刪除feature,一個個刪除就用IFeature.Delete方法即可,此處不再贅述,唯寫一種大量刪除的方法,用於ITable是真對資料庫進行操作的,所以速度很快
其中方法2是行不通的,會彈出“集合中找不到此項目”的錯誤。
方法1:
''' <summary>
''' 刪除某featurelayer中所有feature
''' </summary>
''' <param name="pLayer">操作的塗層</param>
''' <remarks>該方法可以給一個queryfilter,進行刪除合格features</remarks>
Private Sub DeleteAllFeatures(ByVal pLayer As IFeatureLayer)
Dim pTable As ITable = pLayer.FeatureClass
pTable.DeleteSearchedRows(Nothing)
End Sub
方法2:
''' <summary>
''' 刪除featurecursor中的features
''' </summary>
''' <param name="pFeatureCursor"></param>
''' <remarks>這種方法是行不通的,至少92是這樣的,沒有實現該方法</remarks>
Private Sub DeleteFeatures(ByVal pFeatureCursor As IFeatureCursor)
pFeatureCursor.DeleteFeature()
End Sub