|
|
|
|

程序实现将shp文件导入到sde数据库

'获得导入数据的数目Dim iInFCNum As IntegeriInFCNum = pInDatasetNameCol.Count'获得输出的数据库名和数据集名Dim sOutFDSName As StringDim sOutGDBName As StringsOutFDSName = GetPathName(strGDBPath, 1)sOutGDBName = GetPathName(strGDBPath, 0)'...

作者:未知来源:未知|2007年10月28日

'获得导入数据的数目
Dim iInFCNum As Integer
iInFCNum = pInDatasetNameCol.Count
'获得输出的数据库名和数据集名
Dim sOutFDSName As String
Dim sOutGDBName As String
sOutFDSName = GetPathName(strGDBPath, 1)
sOutGDBName = GetPathName(strGDBPath, 0)
'获得输出要素集的IFeatureDatasetName
Dim pWSF As IWorkspaceFactory
Set pWSF = New AccessWorkspaceFactory
Dim pWS As IWorkspace
Set pWS = pWSF.OpenFromFile(sOutGDBName, 0)
Dim pOutFeatureWS As IFeatureWorkspace
Set pOutFeatureWS = pWS
'获得输出要素集的Dataset Name
Dim pOutFDSName As IFeatureDatasetName
Dim pOutFDS As IFeatureDataset
Set pOutFDS = pOutFeatureWS.OpenFeatureDataset(sOutFDSName)
Set pOutFDSName = pOutFDS.FullName
Dim i As Integer
For i = 1 To iInFCNum
    Dim pOutPropertySet As IPropertySet
    Set pOutPropertySet = New PropertySet
    pOutPropertySet.SetProperty "DATASET", sOutGDBName
   
    Dim pOutWorkspaceName As IWorkspaceName
    Set pOutWorkspaceName = New WorkspaceName
    pOutWorkspaceName.ConnectionProperties = pOutPropertySet
    pOutWorkspaceName.WorkspaceFactoryProgID = "esriDataSourcesGDB.AccessWorkspaceFactory.1"
   
    '设置输出要素的FeatureClass Name
    Dim pOutFCName As IFeatureClassName
    Set pOutFCName = New FeatureClassName
    Dim pDatasetName As IDatasetName
    Set pDatasetName = pOutFCName
    Set pDatasetName.WorkspaceName = pOutWorkspaceName
   
    pDatasetName.name = pOutNameCol.Item(i)
   
    '获得输入要素的FeatureClass Name
    Dim pInDatasetName As IDatasetName
    Set pInDatasetName = pInDatasetNameCol.Item(i)

    '判断是否有重名现象
    Dim pWS2 As IWorkspace2
    Set pWS2 = pWS
   
    '如果名称已存在
    If pWS2.NameExists(esriDTFeatureClass, pDatasetName.name) Then
        Dim R
        R = MsgBox("矢量要素" & pDatasetName.name & "在数据库中已存在!" & Chr(13) & "是否覆盖?", vbExclamation + vbYesNo)
        '覆盖原矢量要素
        If R = vbYes Then
            Dim pFWS As IFeatureWorkspace
            Set pFWS = pWS
            Dim pDataset As IDataset
            Set pDataset = pFWS.OpenFeatureClass(pDatasetName.name)
            pDataset.Delete
            
            Set pFWS = Nothing
            Set pDataset = Nothing
            
        '不覆盖,则退出for循环,忽略这个要素,转入下一个要素的导入
        Else
            GoTo NextStep
        End If
        
        Set pWS2 = Nothing
        
    End If
   
    '打开Table获得Fields
    Dim pname As IName
    Dim pInTable As ITable
    Set pname = pInDatasetName
    Set pInTable = pname.Open
   
    Dim pInFields As IFields
    Set pInFields = pInTable.Fields
   
    '检查Field Name
    Dim pFieldChecker As IFieldChecker
    Set pFieldChecker = New FieldChecker
    Dim pOutFields As IFields
    pFieldChecker.Validate pInFields, Nothing, pOutFields
   
    '对Fields进行循环查,查找Geometry域
    Dim j As Integer
    Dim pGeoField As IField
    For j = 0 To pOutFields.FieldCount - 1
        If pOutFields.Field(j).Type = esriFieldTypeGeometry Then
            Set pGeoField = pOutFields.Field(j)
            Exit For
        End If
    Next j
   
    '获得Geometry Field的GeometryDef
    Dim pOutFCGeoDef As IGeometryDef
    Set pOutFCGeoDef = pGeoField.GeometryDef
   
    '设置GeometryDef的GridCount,GridSize,SpatialReference
    Dim pOutFCGeoDefEdit As IGeometryDefEdit
    Set pOutFCGeoDefEdit = pOutFCGeoDef
    pOutFCGeoDefEdit.GridCount = 1
    pOutFCGeoDefEdit.GridSize(0) = DefaultIndexGrid(pInTable)
   
    Dim re
  
     '判断空间参考是否一致,全局变量m_SpatialRef是创建的矢量要素集的空间参考
    If m_SpatialRef.name <> pGeoField.GeometryDef.SpatialReference.name Then
        re = MsgBox(pInDatasetName.name & "的空间参考与数据库中的矢量要素集空间参考不符!" & Chr(13) _
                & "导入后会丢失数据。     是否继续导入?", vbYesNo + vbExclamation)
        Set pOutFCGeoDefEdit.SpatialReference = m_SpatialRef
        If re = vbNo Then
            GoTo NextStep
       End If
    Else
        Set pOutFCGeoDefEdit.SpatialReference = pGeoField.GeometryDef.SpatialReference
    End If
    '+++++++++++++++++++
    'Set pOutFCGeoDefEdit.SpatialReference = pGeoField.GeometryDef.SpatialReference
   
    '进行导入
     Dim pConverter As IFeatureDataConverter
     Set pConverter = New FeatureDataConverter
     
     pConverter.ConvertFeatureClass pInDatasetNameCol.Item(i), Nothing, pOutFDSName, pOutFCName, pOutFCGeoDef, pOutFields, "", 1000, 0
     
     Set pOutPropertySet = Nothing
     Set pOutWorkspaceName = Nothing
     Set pOutFCName = Nothing
     Set pDatasetName = Nothing
     Set pInDatasetName = Nothing
     Set pname = Nothing
     Set pInTable = Nothing
     Set pFieldChecker = Nothing
     Set pOutFields = Nothing
     Set pGeoField = Nothing
     Set pOutFCGeoDef = Nothing
     Set pConverter = Nothing
     
   
NextStep:
Next i
Set pWSF = Nothing
Set pWS = Nothing

End Function

上一篇:ArcObjects:创建shp要素类

下一篇:AO通过SDE将矢量数据导入到数据库中