『公告』 预祝您龙年大吉,万事如意, 过节期间, 大家如需数据服务,请拨打400 或直接添加客服微信,再祝大家龙年,心想事成。
关注我们 新浪 腾讯

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

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

       '获得导入数据的数目

       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 FieldGeometryDef

    Dim pOutFCGeoDef As IGeometryDef

    Set pOutFCGeoDef = pGeoField.GeometryDef

   

    '设置GeometryDefGridCountGridSizeSpatialReference

    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

      京ICP备2025132830号-1 京公网安备 号