dbutil.bas

来自「FloodEvaluation-程序是gis方面的程序」· BAS 代码 · 共 2,009 行 · 第 1/5 页

BAS
2,009 行
字号
On Error GoTo EH
    Dim pFieldEdit As IFieldEdit
    Dim pField As IField
    Set pFieldEdit = New esriCore.Field
    With pFieldEdit
        .name = sFieldName
        .IsNullable = isN
        .Type = fieldType
        .Length = fieldLength
        If fieldPrecision > 0 Then .Precision = fieldPrecision
        If fieldScale > 0 Then .Scale = fieldScale
    End With
    Set pField = pFieldEdit
    pFeatureCls.AddField pField
    Exit Sub
EH:
    MsgBox "moddbutil.AddField: " & Chr(13) & ERR.Description, vbInformation + vbOKOnly, "提示信息"
End Sub

'Public Function CreateAccessFCFromScratch( _
'    sDir As String, _
'    sDBName As String, _
'    sDSName As String, _
'    sFCName As String, _
'    shapeType As esriGeometryType, _
'    hasM As Boolean, _
'    hasZ As Boolean, _
'    pDomain As IEnvelope, _
'    bOverwrite As Boolean) As IFeatureClass
'
'  Dim pWS As IWorkspace
'  Set pWS = CreateAccessDatabase(sDir, sDBName, bOverwrite)
'
'  Dim pFD As IFeatureDataset
'  Set pFD = CreateAccessDataset(pWS, sDSName, hasM, hasZ, pDomain)
'
'  Dim pFC As IFeatureClass
'  Set pFC = CreateAccessFeatureClass(pFD, sFCName, shapeType, hasM, hasZ, pDomain)
'
'  Set CreateAccessFCFromScratch = pFC
'
'End Function
Public Function CreateAccessFeatureClass( _
  pFDS As IFeatureDataset, _
  sFCName As String, _
  shapeType As esriGeometryType, _
  hasM As Boolean, _
  hasZ As Boolean, _
  pDomain As IEnvelope) As IFeatureClass
    
  Dim pFields As IFields
  Set pFields = CreateBasicFields(shapeType, hasM, hasZ, pDomain)
  
  Dim m_pCLSID As UID
  Set m_pCLSID = New UID
  m_pCLSID.Value = "esricore.Feature"
    
  Dim pFC As IFeatureClass
  Set pFC = pFDS.CreateFeatureClass(sFCName, pFields, m_pCLSID, Nothing, esriFTSimple, "Shape", "")
  
  Set CreateAccessFeatureClass = pFC
End Function






Public Sub DeleteFeatureClass(pFClass As IFeatureClass)
  Dim pDataset As IDataset
  Set pDataset = pFClass
  pDataset.Delete
End Sub

Public Function CreateShapefile(sDir As String, sName As String, shapeType As esriGeometryType, _
  hasM As Boolean, hasZ As Boolean, pSR As ISpatialReference) As IFeatureClass
  
On Error GoTo CreateShape_ERR

  Set CreateShapefile = Nothing
  
  Dim shapeWorkspaceFactory As IWorkspaceFactory
  Set shapeWorkspaceFactory = New ShapefileWorkspaceFactory
  
  Dim connectionProperties As IPropertySet
  Set connectionProperties = New PropertySet
  connectionProperties.SetProperty "DATABASE", sDir
  
  Dim shapeWorkspace As IFeatureWorkspace
  Set shapeWorkspace = shapeWorkspaceFactory.Open(connectionProperties, 0)
  If (Not shapeWorkspace Is Nothing) Then
    Dim pFC As IFeatureClass
    Set pFC = OpenShapeFile(sDir, sName)
    
    If Not pFC Is Nothing Then
        Dim pDS As IDataset
        Set pDS = pFC
        pDS.Delete
    End If
    
    Dim pFields As IFields
    Set pFields = CreateBasicFields(shapeType, hasM, hasZ, pSR)
  
    Dim pFClass As IFeatureClass
    Set pFClass = shapeWorkspace.CreateFeatureClass(sName, pFields, Nothing, Nothing, esriFTSimple, "Shape", "")
  
    Set CreateShapefile = pFClass
  End If
  
    Exit Function
CreateShape_ERR:
Debug.Print "CreateShape_ERR: " & ERR.Description
    Resume Next
    
End Function


Public Function FeatureClassHasM(pFC As IFeatureClass) As Boolean
  Dim pFields As IFields
  Set pFields = pFC.Fields
  
  Dim shapeIndex As Long
  shapeIndex = pFields.FindField(pFC.ShapeFieldName)

  Dim pShapeField As IField
  Set pShapeField = pFields.Field(shapeIndex)

  Dim pGeomDef As IGeometryDef
  Set pGeomDef = pShapeField.GeometryDef

  FeatureClassHasM = pGeomDef.hasM
End Function


Public Function FeatureClassHasZ(pFC As IFeatureClass) As Boolean
  Dim pFields As IFields
  Set pFields = pFC.Fields
  
  Dim shapeIndex As Long
  shapeIndex = pFields.FindField(pFC.ShapeFieldName)

  Dim pShapeField As IField
  Set pShapeField = pFields.Field(shapeIndex)

  Dim pGeomDef As IGeometryDef
  Set pGeomDef = pShapeField.GeometryDef

  FeatureClassHasZ = pGeomDef.hasZ
End Function


Public Function OpenShapefileWorkspace(sDir As String) As IWorkspace
  On Error GoTo EH
  Dim pWSFact As IWorkspaceFactory
  Set pWSFact = New ShapefileWorkspaceFactory
  Dim connectionProperties As IPropertySet
  Set connectionProperties = New PropertySet
  connectionProperties.SetProperty "DATABASE", sDir
  Set OpenShapefileWorkspace = pWSFact.Open(connectionProperties, 0)
EH:
End Function

Public Function OpenShapeFile(dir As String, name As String) As IFeatureClass
On Error GoTo errHandler
  Dim pWSFact As IWorkspaceFactory
  Dim connectionProperties As IPropertySet
  Dim pShapeWS As IFeatureWorkspace
  Dim isShapeWS As Boolean

  Set OpenShapeFile = Nothing
  
  Set pWSFact = New ShapefileWorkspaceFactory
  isShapeWS = pWSFact.IsWorkspace(dir)
  If (isShapeWS) Then
    On Error GoTo errHandler
    Set connectionProperties = New PropertySet
    connectionProperties.SetProperty "DATABASE", dir
    Set pShapeWS = pWSFact.Open(connectionProperties, 0)
    Dim pFClass As IFeatureClass
    Set pFClass = pShapeWS.OpenFeatureClass(name)
    Set OpenShapeFile = pFClass
  End If
  Exit Function
errHandler:
  MsgBox "failed to open shapefile", vbInformation + vbOKOnly, "提示信息"
End Function

' sFCType can be POINT, ARC, POLYGON, ..and/or others depending on coverage
Public Function OpenCoverage(sDir As String, sName As String, sFCType As String) As IFeatureClass
  Dim pWSFact As IWorkspaceFactory
  Dim connectionProperties As IPropertySet
  Dim pArcWS As IFeatureWorkspace
  Dim isArcWS As Boolean
  
  Set pWSFact = New ArcInfoWorkspaceFactory
  isArcWS = pWSFact.IsWorkspace(sDir)
  If (isArcWS) Then
    On Error GoTo errHandler
    Set connectionProperties = New PropertySet
    connectionProperties.SetProperty "DATABASE", sDir
    Set pArcWS = pWSFact.Open(connectionProperties, 0)

    Dim pFD As IFeatureDataset
    Set pFD = pArcWS.OpenFeatureDataset(sName)
    
    Dim pFCContainer As IFeatureClassContainer
    Set pFCContainer = pFD
        
    Dim pFClass As IFeatureClass
    Set pFClass = pFCContainer.ClassByName(sFCType)
    Set OpenCoverage = pFClass
  End If
errHandler:
End Function

Public Function CreateAccessDatabase( _
  sDir As String, _
  sDBName As String, _
  bOverwrite As Boolean) As IWorkspace
  
  If (bOverwrite) Then
    Dim fs
    Set fs = CreateObject("Scripting.FileSystemObject")
    If (fs.FileExists(sDir + "\" + sDBName + ".mdb")) Then
      Kill sDir + "\" + sDBName + ".mdb"
    End If
  End If
  
  Dim pWSF As IWorkspaceFactory
  Set pWSF = New AccessWorkspaceFactory
  
  Dim pPropSet As IPropertySet
  Set pPropSet = New PropertySet
  
  Dim pWsName As IWorkspaceName
  Set pWsName = pWSF.Create(sDir, sDBName, pPropSet, 0)

  Dim pName As IName
  Set pName = pWsName
  Dim pWS As IWorkspace
  Set pWS = pName.Open
  
  Set CreateAccessDatabase = pWS
End Function

' Create a feature class that resides in a feature dataset (shapefile not supported)
Public Function CreateFeatureClassDS( _
  pFDS As IFeatureDataset, _
  sFCName As String, _
  shapeType As esriGeometryType, _
  hasM As Boolean, _
  hasZ As Boolean) As IFeatureClass
    
  Dim pGDS As IGeoDataset
  Set pGDS = pFDS
  
  Dim pSR As ISpatialReference
  Set pSR = pGDS.SpatialReference
  
  Dim pFields As IFields
  Set pFields = CreateBasicFields(shapeType, hasM, hasZ, pSR)
  
  Dim m_pCLSID As UID
  Set m_pCLSID = New UID
  m_pCLSID.Value = "esricore.Feature"
    
  Dim pFC As IFeatureClass
  Set pFC = pFDS.CreateFeatureClass(sFCName, pFields, m_pCLSID, Nothing, esriFTSimple, "Shape", "")
  
  Set CreateFeatureClassDS = pFC
End Function

' Create a stand alone feature class (not inside dataset)
Public Function CreateFeatureClassWS( _
  pFWS As IFeatureWorkspace, _
  sFCName As String, _
  shapeType As esriGeometryType, _
  hasM As Boolean, _
  hasZ As Boolean, _
  pSR As ISpatialReference) As IFeatureClass
    
  Dim pFields As IFields
  Set pFields = CreateBasicFields(shapeType, hasM, hasZ, pSR)
  
  Dim m_pCLSID As UID
  Set m_pCLSID = New UID
  m_pCLSID.Value = "esricore.Feature"
    
  Dim pFC As IFeatureClass
  Set pFC = pFWS.CreateFeatureClass(sFCName, pFields, m_pCLSID, Nothing, esriFTSimple, "Shape", "")
  
  Set CreateFeatureClassWS = pFC
End Function

Public Function IsAccessDataset(sDBName As String, sDSName As String) As Boolean
  On Error GoTo EH
  Dim pWSFact As IWorkspaceFactory
  Set pWSFact = New AccessWorkspaceFactory
  
  Dim connectionProperties As IPropertySet
  Set connectionProperties = New PropertySet
  connectionProperties.SetProperty "DATABASE", sDBName
  
  Dim pAccessWS As IFeatureWorkspace
  Set pAccessWS = pWSFact.Open(connectionProperties, 0)
  
  Dim pDS As IFeatureDataset
  Set pDS = pAccessWS.OpenFeatureDataset(sDSName)
  IsAccessDataset = (Not pDS Is Nothing)
  Exit Function
EH:
  IsAccessDataset = False
End Function

Public Function IsSDEDataset(sDBName As String, sDSName As String) As Boolean
  On Error GoTo EH
  Dim pWS As IFeatureWorkspace
  Set pWS = OpenSDEWorkspaceWithConnection(sDBName)
  Dim pDS As IFeatureDataset
  Set pDS = pWS.OpenFeatureDataset(sDSName)
  IsSDEDataset = (Not pDS Is Nothing)
  Exit Function
EH:
  IsSDEDataset = False
End Function


Public Function OpenAccessDatabase(sDBName As String) As IFeatureWorkspace
  Dim pWSFact As IWorkspaceFactory
  Set pWSFact = New AccessWorkspaceFactory
  
  Dim connectionProperties As IPropertySet
  Set connectionProperties = New PropertySet
  connectionProperties.SetProperty "DATABASE", sDBName
  
  Dim pAccessWS As IFeatureWorkspace
  Set pAccessWS = pWSFact.Open(connectionProperties, 0)
  
  Set OpenAccessDatabase = pAccessWS
End Function

Public Function OpenAccessFeatureClass(sDBName As String, _
                                        sFCName As String) As IFeatureClass
  
  Dim pFWS As IFeatureWorkspace
  Set pFWS = OpenAccessDatabase(sDBName)
    
  Set OpenAccessFeatureClass = pFWS.OpenFeatureClass(sFCName)
End Function

' location of folder containing sde connection files
Public Function GetConnectionsFolder() As String
  On Error GoTo EH
  Dim pGxCat As IGxCatalog
  Set pGxCat = New GxCatalog
  Dim pFolder As IGxRemoteDatabaseFolder
  Dim i As Long
  Set pFolder = pGxCat.GetObjectFromFullName("Database Connections", i)
  GetConnectionsFolder = pFolder.Path
  Exit Function
EH:
End Function

Public Function HasZUnitsDefined(pInGDS As IGeoDataset, pOutLU As ILinearUnit) As Boolean
  Dim pSR As ISpatialReference
  Set pSR = pInGDS.SpatialReference
  Set pOutLU = pSR.ZCoordinateUnit
  HasZUnitsDefined = (Not pOutLU Is Nothing)
End Function

'Public Function OpenRasterDataset(sDir As String, sName As String) As IRasterDataset
'  On Error GoTo EH
'  Dim pRW As IRasterWorkspace
'  Set pRW = OpenRasterWorkspace(sDir)
'  Set OpenRasterDataset = pRW.OpenRasterDataset(sName)
'EH:
'End Function

Public Function OpenRasterDataset(sPath As String, sFileName As String) As IRasterDataset
   ' Returns RasterDataset object given a file name and its directory
    ' sPath: directory where dataset resides
    ' sFileName: name of the raster dataset
    On Error GoTo ErrorHandler
    
    ' Create RasterWorkSpaceFactory
    Dim pWSF As IWorkspaceFactory
    Set pWSF = New RasterWorkspaceFactory
    
    ' Get RasterWorkspace
    Dim pRasWS As IRasterWorkspace
    If pWSF.IsWorkspace(sPath) Then
        Set pRasWS = pWSF.OpenFromFile(sPath, 0)
        Set OpenRasterDataset = pRasWS.OpenRasterDataset(sFileName)
    End If
    
    ' Release memeory
    Set pRasWS = Nothing
    Set pWSF = Nothing
    Exit Function
    
ErrorHandler:
    Set OpenRasterDataset = Nothing

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?