Converts a featureClass to a new created Personal Geodatabase/Geodatabase featureClass.
該方法適用于簡單的要素類 (point, line, polygon),不支持復雜的要素類(geometric network feature classes,
SDE 3.x annotation, Geodatabase annotation, coverage annotation)

Public Sub FCLoader(pInPropertySet As IPropertySet, _
sInName As String, _
pOutPropertySet As IPropertySet, _
sOutName As String)
' Setup output workspace.
Dim pOutWorkspaceName As IWorkspaceName
Set pOutWorkspaceName = New WorkspaceName
pOutWorkspaceName.ConnectionProperties = pOutPropertySet
pOutWorkspaceName.WorkspaceFactoryProgID = "esriDataSourcesGDB.SDEWorkspaceFactory.1"
' Set up for open.
Dim pInWorkspaceName As IWorkspaceName
Set pInWorkspaceName = New WorkspaceName
pInWorkspaceName.ConnectionProperties = pInPropertySet
pInWorkspaceName.WorkspaceFactoryProgID = "esriDataSourcesFile.ShapefileWorkspaceFactory.1"
' Set in dataset and table names.
Dim pInFCName As IFeatureClassName
Set pInFCName = New FeatureClassName
Dim pInDatasetName As IDatasetName
Set pInDatasetName = pInFCName
pInDatasetName.Name = sInName
Set pInDatasetName.WorkspaceName = pInWorkspaceName
' Set out dataset and table names.
Dim pOutDatasetName As IDatasetName
Dim pOutFCName As IFeatureClassName
Set pOutFCName = New FeatureClassName
Set pOutDatasetName = pOutFCName
Set pOutDatasetName.WorkspaceName = pOutWorkspaceName
pOutDatasetName.Name = sOutName
' Open input Featureclass to get field definitions.
Dim pName As IName
Dim pInFC As IFeatureClass
Set pName = pInFCName
Set pInFC = pName.Open
' Validate the field names.
Dim pOutFCFields As IFields
Dim pInFCFields As IFields
Dim pFieldCheck As IFieldChecker
Dim i As Long
Set pInFCFields = pInFC.Fields
Set pFieldCheck = New FieldChecker
pFieldCheck.Validate pInFCFields, Nothing, pOutFCFields
' +++ Loop through the output fields to find the geometry field
Dim pGeoField As IField
For i = 0 To pOutFCFields.FieldCount
If pOutFCFields.Field(i).Type = esriFieldTypeGeometry Then
Set pGeoField = pOutFCFields.Field(i)
Exit For
End If
Next i
' +++ Get the geometry field's geometry defenition
Dim pOutFCGeoDef As IGeometryDef
Set pOutFCGeoDef = pGeoField.GeometryDef
' +++ Give the geometry definition a spatial index grid count and grid size
Dim pOutFCGeoDefEdit As IGeometryDefEdit
Set pOutFCGeoDefEdit = pOutFCGeoDef
pOutFCGeoDefEdit.GridCount = 1
pOutFCGeoDefEdit.GridSize(0) = DefaultIndexGrid(pInFC)
Set pOutFCGeoDefEdit.SpatialReference = pGeoField.GeometryDef.SpatialReference
Dim pQueryFilter As IQueryFilter
Set pQueryFilter = New QueryFilter
pQueryFilter.SubFields = "Shape,STATE_NAME"
' Load the table.
Dim pFCToFC As IFeatureDataConverter
Set pFCToFC = New FeatureDataConverter
Dim pEnumErrors As IEnumInvalidObject
Set pEnumErrors = pFCToFC.ConvertFeatureClass(pInFCName, pQueryFilter, Nothing, pOutFCName, pOutFCGeoDef, pOutFCFields, "", 1000, 0)
' If some of the records do not load, report to report window.
Dim pErrInfo As IInvalidObjectInfo
'pEnumErrors.Reset
Set pErrInfo = pEnumErrors.Next
If Not pErrInfo Is Nothing Then
Debug.Print "Load completed with errors"
Else
Debug.Print "Load completed"
End If
Exit Sub
ErrorRoutine:
Debug.Print "Load Failed: Errors: " & Err.Number & " " & Err.Description
End Sub


Private Function DefaultIndexGrid(InFC As IFeatureClass) As Double
' Calculate approximate first grid
' based on the average of a random sample of feature extents times five
Dim lngNumFeat As Long
Dim lngSampleSize As Long
Dim pFields As IFields
Dim pField As IField
Dim strFIDName As String
Dim strWhereClause As String
Dim lngCurrFID As Long
Dim pFeat As IFeature
Dim pFeatCursor As IFeatureCursor
Dim pFeatEnv As IEnvelope
Dim pQueryFilter As IQueryFilter
Dim pNewCol As New Collection
Dim lngKMax As Long
Dim dblMaxDelta As Double
dblMaxDelta = 0
Dim dblMinDelta As Double
dblMinDelta = 1000000000000#
Dim dblSquareness As Double
dblSquareness = 1
Dim i As Long
Dim j As Long
Dim k As Long
Const SampleSize = 1
Const Factor = 1
' Create a recordset
Dim ColInfo(0), c0(3)
c0(0) = "minext"
c0(1) = CInt(5)
c0(2) = CInt(-1)
c0(3) = False
ColInfo(0) = c0
lngNumFeat = InFC.FeatureCount(Nothing) - 1
If lngNumFeat <= 0 Then
DefaultIndexGrid = 1000
Exit Function
End If
'if the feature type is points use the density function
If InFC.ShapeType = esriGeometryMultipoint Or InFC.ShapeType = esriGeometryPoint Then
DefaultIndexGrid = DefaultIndexGridPoint(InFC)
Exit Function
End If
' Get the sample size
lngSampleSize = lngNumFeat * SampleSize
' Don't allow too large a sample size to speed
If lngSampleSize > 1000 Then lngSampleSize = 1000
' Get the ObjectID Fieldname of the feature class
Set pFields = InFC.Fields
' FID is always the first field
Set pField = pFields.Field(0)
strFIDName = pField.Name
' Add every nth feature to the collection of FIDs
For i = 1 To lngNumFeat Step CLng(lngNumFeat / lngSampleSize)
pNewCol.Add i
Next i
For j = 0 To pNewCol.Count - 1 Step 250
' Will we top out the features before the next 250 chunk?
lngKMax = Min(pNewCol.Count - j, 250)
strWhereClause = strFIDName + " IN("
For k = 1 To lngKMax
strWhereClause = strWhereClause + CStr(pNewCol.Item(j + k)) + ","
Next k
' Remove last comma and add close parenthesis
strWhereClause = Mid(strWhereClause, 1, Len(strWhereClause) - 1) + ")"
Set pQueryFilter = New QueryFilter
pQueryFilter.WhereClause = strWhereClause
Set pFeatCursor = InFC.Search(pQueryFilter, True)
Set pFeat = pFeatCursor.NextFeature
While Not pFeat Is Nothing
' Get the extent of the current feature
Set pFeatEnv = pFeat.Extent
' Find the min, max side of all extents. The "Squareness", a measure
' of how close the extent is to a square, is accumulated for later
' average calculation.
dblMaxDelta = Max(dblMaxDelta, Max(pFeatEnv.Width, pFeatEnv.Height))
dblMinDelta = Min(dblMinDelta, Min(pFeatEnv.Width, pFeatEnv.Height))
' lstSort.AddItem Max(pFeatEnv.Width, pFeatEnv.Height)
If dblMinDelta <> 0 Then
dblSquareness = dblSquareness + ((Min(pFeatEnv.Width, pFeatEnv.Height) / (Max(pFeatEnv.Width, pFeatEnv.Height))))
Else
dblSquareness = dblSquareness + 0.0001
End If
Set pFeat = pFeatCursor.NextFeature
Wend
Next j
' If the average envelope approximates a square set the grid size half
' way between the min and max sides. If the envelope is more rectangular,
' then set the grid size to half of the max.
If ((dblSquareness / lngSampleSize) > 0.5) Then
DefaultIndexGrid = (dblMinDelta + ((dblMaxDelta - dblMinDelta) / 2)) * Factor
Else
DefaultIndexGrid = (dblMaxDelta / 2) * Factor
End If
End Function


Private Function Min(v1 As Variant, v2 As Variant) As Variant
Min = IIf(v1 < v2, v1, v2)
End Function


Private Function Max(v1 As Variant, v2 As Variant) As Variant
Max = IIf(v1 > v2, v1, v2)
End Function


Function DefaultIndexGridPoint(InFC As IFeatureClass) As Double
' Calculates the Index grid based on input feature class
' Get the dataset
Dim pGeoDataSet As IGeoDataset
Set pGeoDataSet = InFC
' Get the envelope of the input dataset
Dim pEnvelope As IEnvelope
Set pEnvelope = pGeoDataSet.Extent
'Calculate approximate first grid
Dim lngNumFeat As Long
Dim dblArea As Double
lngNumFeat = InFC.FeatureCount(Nothing)
If lngNumFeat = 0 Or pEnvelope.IsEmpty Then
' when there are no features or an empty bnd - return 1000
DefaultIndexGridPoint = 1000
Else
dblArea = pEnvelope.Height * pEnvelope.Width
' approximate grid size is the square root of area over the number of features
DefaultIndexGridPoint = Sqr(dblArea / lngNumFeat)
End If
Set pGeoDataSet = Nothing
Set pEnvelope = Nothing
End Function
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
C# 代码段:
private FeatureClass fc2fc(IFeatureClass pInFeatureClass,IWorkspace pOutWorkspace,String sFeatureName)
{
try
{
if (pInFeatureClass == null || pOutWorkspace == null) return null;
FeatureClass pFeatureClass;
IFeatureClassName pInFeatureclassName;
IDataset pIndataset;
pIndataset = (IDataset)pInFeatureClass;
pInFeatureclassName = (IFeatureClassName)pIndataset.getFullName();
IFeatureClassName pOutFeatureClassName;
IDatasetName pOutDatasetName;
IDataset pOutDataset;
String fcName = pInFeatureClass.getAliasName().trim().substring(pInFeatureClass.getAliasName().trim().indexOf(".") + 1);
pOutDataset = (IDataset)pOutWorkspace;
pOutFeatureClassName = new FeatureClassName();
pOutDatasetName = (IDatasetName)pOutFeatureClassName;
pOutDatasetName.setWorkspaceNameByRef((IWorkspaceName)pOutDataset.getFullName());
pOutDatasetName.setName(fcName);
IFields pInFields;
IFields pOutFields[] = new Fields[1];
IFieldChecker pFieldChecker = new FieldChecker();
pInFields = pInFeatureClass.getFields();
pFieldChecker.validate(pInFields, null, pOutFields);
IFeatureDataConverter one2another = new FeatureDataConverter();
//判断workspace的类型
if (pOutWorkspace.getType() == esriWorkspaceType.esriRemoteDatabaseWorkspace)
{
one2another.convertFeatureClass(pInFeatureclassName, null, null, pOutFeatureClassName, null,pOutFields[0], "", 1000, 0);
}
else
{
IFeatureDatasetName pOutFeatDSName = new FeatureDatasetName();
IDatasetName pDSname = (IDatasetName)pOutFeatDSName;
pDSname.setWorkspaceNameByRef((IWorkspaceName)pOutDataset.getFullName());
pDSname.setName(pInFeatureClass.getFeatureDataset().getName());
one2another.convertFeatureClass(pInFeatureclassName, null, pOutFeatDSName, pOutFeatureClassName, null,pOutFields[0], "", 1000, 0);
pOutFeatDSName = null;
pDSname = null;
}
com.esri.arcgis.geodatabase.IFeatureClass pEsriIFeatureClass = (new com.esri.arcgis.geodatabase.Workspace(pOutWorkspace)).openFeatureClass(sFeatureName);
FeatureClass pReturnFeatureClass = new FeatureClass(pEsriIFeatureClass, new GIS.Core.ws.Workspace(pOutWorkspace));
return pReturnFeatureClass;
}
catch(IOException e)
{
e.printStackTrace();
return null;
}
}
}
_____________________________________________________________________________________________________________
C#另外一段代码:
//IFeatureDataConverter ConvertFeatureDataset Example
//e.g., nameOfSourceFeatureDataset = "USA"
// nameOfTargetFeatureDataset = "USA"
public void IFeatureDataConverter_ConvertFeatureDataset_Example(IWorkspace sourceWorkspace, IWorkspace targetWorkspace, string nameOfSourceFeatureDataset, string nameOfTargetFeatureDataset)
{
//create source workspace name
IDataset sourceWorkspaceDataset = (IDataset)sourceWorkspace;
IWorkspaceName sourceWorkspaceName = (IWorkspaceName)sourceWorkspaceDataset.FullName;
//create source dataset name
IFeatureDatasetName sourceFeatureDatasetName = new FeatureDatasetNameClass();
IDatasetName sourceDatasetName = (IDatasetName)sourceFeatureDatasetName;
sourceDatasetName.WorkspaceName = sourceWorkspaceName;
sourceDatasetName.Name = nameOfSourceFeatureDataset;
//create target workspace name
IDataset targetWorkspaceDataset = (IDataset)targetWorkspace;
IWorkspaceName targetWorkspaceName = (IWorkspaceName)targetWorkspaceDataset.FullName;
//create target dataset name
IFeatureDatasetName targetFeatureDatasetName = new FeatureDatasetNameClass();
IDatasetName targetDatasetName = (IDatasetName)targetFeatureDatasetName;
targetDatasetName.WorkspaceName = targetWorkspaceName;
targetDatasetName.Name = nameOfTargetFeatureDataset;
//Convert feature dataset
IFeatureDataConverter featureDataConverter = new FeatureDataConverterClass();
featureDataConverter.ConvertFeatureDataset(sourceFeatureDatasetName, targetFeatureDatasetName, null, "", 1000, 0);
Console.WriteLine("Conversion Complete");
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· MQ 如何保证数据一致性?