⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clsevaluatewizard.cls

📁 FloodEvaluation-程序是gis方面的程序
💻 CLS
📖 第 1 页 / 共 5 页
字号:

'************************************************************************************************''''''''''''''
Public Function CreateShapefile(pShapeWsF As IFeatureWorkspace, strShapeName As String, spatialRef As ISpatialReference) As IFeatureClass

    On Error GoTo Errhdr
    Const strShapeFieldName As String = "Shape"
    
    ' Set up a simple fields collection
    Dim pFields As IFields
    Dim pFieldsEdit As IFieldsEdit
    Set pFields = New esriCore.Fields
    Set pFieldsEdit = pFields
    
    Dim pField As IField
    Dim pFieldEdit As IFieldEdit
    
    ' Make the shape field
    ' it will need a geometry definition, with a spatial reference
    Set pField = New esriCore.Field
    Set pFieldEdit = pField
    pFieldEdit.name = strShapeFieldName
    pFieldEdit.Type = esriFieldTypeGeometry
    
    Dim pGeomDef As IGeometryDef
    Dim pGeomDefEdit As IGeometryDefEdit
    Set pGeomDef = New GeometryDef
    Set pGeomDefEdit = pGeomDef
    With pGeomDefEdit
      .GeometryType = esriGeometryPolygon
      Set .SpatialReference = spatialRef 'New UnknownCoordinateSystem
    End With
    
    Set pFieldEdit.GeometryDef = pGeomDef
    pFieldsEdit.AddField pField
    
    Set pField = New esriCore.Field
    Set pFieldEdit = pField
    With pFieldEdit
        .Length = 30
        .name = "MiscText"
        .Type = esriFieldTypeString
    End With
    pFieldsEdit.AddField pField
    
    ' Create the shapefile
    Dim pFeatClass As IFeatureClass
    Set pFeatClass = pShapeWsF.CreateFeatureClass(strShapeName, pFields, Nothing, _
                                             Nothing, esriFTSimple, strShapeFieldName, "")
                                             
    Set CreateShapefile = pFeatClass
    
    Set pFields = Nothing
    Set pField = Nothing
    Set pGeomDef = Nothing
    
    Exit Function
    
Errhdr:
    MsgBox "创建shape文件失败" & Chr(13) & ERR.Description, vbInformation + vbOKOnly, "提示信息"
    
End Function


'************************************************************************************************''''''''''''''
'''''CreateFeature根据给定几何体特征创建一个空间特征体

'************************************************************************************************''''''''''''''
Private Sub CreateFeature(pFeatureClass As IFeatureClass, pGeometry As IGeometry)
  Dim pFeature As IFeature
  Set pFeature = pFeatureClass.CreateFeature
  Set pFeature.Shape = pGeometry
  pFeature.Store
End Sub


'**************************************************************************************************************
'clsWaterDepth
'**************************************************************************************************************

'************************************************************************************************''''''''''''''
''''WaterDepth ,调用calcWaterDepth函数计算淹没范围的水深
''''设一个栅格图斑边缘的水深为0,通过图斑均值计算其他像元的水深。先对图斑边缘shrink一个像元,然后反求边缘像元高程均值。
''''inputRaster为IRaster类型的输入栅格图斑
''''pRasterDepth为IRaster类型的输出水深栅格图斑
'************************************************************************************************''''''''''''''
Public Function WaterDepth(pApp As IApplication, _
                      strPassWd As String, _
                      Optional ByRef pSdeFWS As IWorkspace = Nothing) As Boolean
    
    On Error GoTo errHandle
    
    ' Create the RasterExtractionOp/MathOps object
    Dim pConditionalOp As IConditionalOp
    Dim pConversionOp As IConversionOp
    Dim pExtractionOp As IExtractionOp
    Dim pLogicalOp As ILogicalOp
    Dim pMathOp As IMathSupportOp
    Dim pRMOp As IRasterMakerOp
    Set pConditionalOp = New RasterConditionalOp
    Set pConversionOp = New RasterConversionOp
    Set pExtractionOp = New RasterExtractionOp
    Set pLogicalOp = New RasterMathOps
    Set pMathOp = New RasterMathSupportOp
    Set pRMOp = New RasterMakerOp
    
    ' Declare the dataset objects
    Dim pPolygon As IPolygon
    Dim pRasDEM As IRaster, pOutRaster As IRaster, pExtractRaster As IRaster
    Dim pRaster1 As IRaster, pRaster2 As IRaster, pZeroRaster As IRaster, pRasterVal0 As IRaster, pRasterVal1 As IRaster
    Dim pWorkspaceFactory As IWorkspaceFactory, pFeatureWorkspace As IFeatureWorkspace
    Dim pFloodFeatLayer As IFeatureLayer, pWaterFeatLayer As IFeatureLayer
    Dim fs
    
    Dim strResultPath As String, strResultFile As String, strTemp As String
    frmFloodDepth.Left = (Screen.Width - frmFloodDepth.Width) / 2
    frmFloodDepth.Top = (Screen.Height - frmFloodDepth.Height) / 2
    frmFloodDepth.strPathDem = ""
    frmFloodDepth.strPathFlood = ""
    frmFloodDepth.strPathResult = ""
    frmFloodDepth.strPathWater = ""
    frmFloodDepth.Show vbModal
    
    If frmFloodDepth.flagOK Then

        Set fs = CreateObject("Scripting.FileSystemObject")
        
        Set pFloodFeatLayer = frmFloodDepth.shpFloodLyr                             ' 传递通过catalog打开的图层
        Set pWaterFeatLayer = frmFloodDepth.shpWaterLyr
       
        strResultFile = frmFloodDepth.strPathResult

        If fs.FolderExists(Left(strResultFile, Len(strResultFile) - 4)) Then '
            MsgBox strResultFile & "已存在,将被覆盖", vbInformation + vbOKOnly, "提示信息"
            fs.Deletefolder (Left(strResultFile, Len(strResultFile) - 4)) '
        End If

        If fs.FileExists(strResultFile) Then '
            fs.DeleteFile (strResultFile) '
        End If

        Call SplitPath(strResultFile, strResultPath, strTemp)
        strResultFile = Left(strTemp, Len(strTemp) - 4)
        If Len(strResultFile) > 12 Then strResultFile = Left(strResultFile, 12)
        m_txtDepthSde = strResultFile

    Else
        MsgBox "放弃水深计算", vbInformation + vbOKOnly, "提示信息"
        WaterDepth = False
        Exit Function
    End If
    
    Dim pMouseCursor As IMouseCursor
    Set pMouseCursor = New MouseCursor
    pMouseCursor.SetCursor 2
    
    Set pRasDEM = frmFloodDepth.rasDEMLyr.Raster
    Set pRasterVal1 = pRMOp.MakeConstant(0.0001, False)                         ' to construct a .0001 value raster
    Set pZeroRaster = pMathOp.Minus(pRasDEM, pRasDEM)                           ' to construct a zero raster

    Dim pFilter As IQueryFilter
    Dim pFeatCursor1 As IFeatureCursor
    Set pFilter = New QueryFilter
    pFilter.WhereClause = ""

    Dim filterFeat As IFeature

    Set pFeatCursor1 = pFloodFeatLayer.Search(pFilter, False)
    Set filterFeat = pFeatCursor1.NextFeature
    
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Dim pRasterDepth As IRaster
    Set pPolygon = filterFeat.Shape
    Set pExtractRaster = pExtractionOp.Polygon(pRasDEM, pPolygon, True)
    
    Call calcWaterDepth(pExtractRaster, pRasterDepth)                                                  ' 计算水深,calcWaterDepth
    Set pRaster1 = pConditionalOp.Con(pLogicalOp.IsNull(pRasterDepth), pZeroRaster, pRasterDepth)      ' to set NoData as zero
    Set filterFeat = pFeatCursor1.NextFeature
    Set pOutRaster = pRaster1    ' if there is only on patches, this will be the extraction result

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Do While Not filterFeat Is Nothing
        Set pPolygon = filterFeat.Shape
        Set pExtractRaster = pExtractionOp.Polygon(pRasDEM, pPolygon, True)
        Call calcWaterDepth(pExtractRaster, pRasterDepth)        ''''''''''''''''''''''''''''''''''''''' 计算水深,calcWaterDepth
        
        Set pRaster2 = pConditionalOp.Con(pLogicalOp.IsNull(pRasterDepth), pZeroRaster, pRasterDepth)  ' to set NoData as zero
        
        Set pOutRaster = pMathOp.Plus(pRaster1, pRaster2)                                              ' to combine raster patches
        Set pRaster1 = pOutRaster

        Set filterFeat = pFeatCursor1.NextFeature

    Loop '''''''''''''''''''''''''''''''''''''''''''''''''''''''Do While Not filterFeat Is Nothing     ' pZeroRaster
    
    Set pRaster2 = pConditionalOp.Con(pLogicalOp.GreaterThan(pOutRaster, pZeroRaster), pOutRaster)     ' to keep values that greater than 0
    Set pOutRaster = pRaster2   '洪水水位栅格分布,包括本体水体

''''''''将本体水体转为栅格,再从洪水水位分布中将其挖去
        Dim pWS As IWorkspace, pWksF As IWorkspaceFactory, pRWS As IRasterWorkspace
        Set pWksF = New RasterWorkspaceFactory
        Set pWS = pWksF.OpenFromFile(strResultPath, 0)

        Dim pEnv As IRasterAnalysisEnvironment
        Set pEnv = pConversionOp
        Dim pProp As IRasterProps
        Set pProp = pRaster1
        pEnv.SetCellSize esriRasterEnvValue, pProp.MeanCellSize.X

        If fs.FolderExists(strResultPath + "\CovTemp") Then '
            fs.Deletefolder (strResultPath + "\CovTemp") '
        End If

        If fs.FileExists(strResultPath + "\CovTemp.aux") Then '
            fs.DeleteFile (strResultPath + "\CovTemp.aux") '
        End If

        Dim pTempDS As IGeoDataset
        Set pTempDS = pWaterFeatLayer.FeatureClass
        Dim pGeoDs As IRasterDataset
        Set pGeoDs = pConversionOp.ToRasterDataset(pTempDS, "GRID", pWS, "CovTemp")      '将本体水体转为栅格
''''''''将本体水体转为栅格,再从洪水水位分布中将其挖去
    
    Set pRasterVal0 = pMathOp.Minus(pGeoDs, pGeoDs)
    Set pRaster1 = pMathOp.Minus(pRasDEM, pRasterVal0)                                   '提取出本体水体的高程
    
    Set pRaster2 = pConditionalOp.Con(pLogicalOp.IsNull(pRaster1), pZeroRaster)          '将本体水体之外的空值设为0,本体水体为空值
    Set pOutRaster = pMathOp.Minus(pOutRaster, pRaster2)                                 '从洪水水位分布中挖去本体水体
    Dim pRasBandC As IRasterBandCollection
    Set pRasBandC = pOutRaster
    Call pRasBandC.SaveAs(strResultFile, pWS, "GRID")
        
    Dim pMxDoc As IMxDocument
    Set pMxDoc = pApp.Document
    Dim pRLyr As IRasterLayer
    Set pRLyr = New RasterLayer
    pRLyr.CreateFromRaster pOutRaster
    pRLyr.name = "FloodDepth"
    pMxDoc.FocusMap.AddLayer pRLyr
    pMxDoc.ActiveView.Refresh
    
'    Screen.MousePointer = vbDefault
        
    Set pConditionalOp = Nothing
    Set pConversionOp = Nothing
    Set pExtractionOp = Nothing
    Set pLogicalOp = Nothing
    Set pMathOp = Nothing
    Set pRMOp = Nothing
    Set pWorkspaceFactory = Nothing
    Set pFeatureWorkspace = Nothing
    Set pFloodFeatLayer = Nothing
    Set pWaterFeatLayer = Nothing
    Set pWksF = Nothing
    Set pWS = Nothing
    Set pRWS = Nothing
    Set pRasBandC = Nothing
    Set pRLyr = Nothing
    Set pGeoDs = Nothing
    Set pRaster1 = Nothing
    Set pRaster2 = Nothing
    Set pMouseCursor = Nothing
    
    If Not pSdeFWS Is Nothing Then
        If pSdeFWS.Type = esriRemoteDatabaseWorkspace Then
            Dim strSdeName As String
            strSdeName = strResultFile 'Left(strResultFile, Len(strResultFile) - 4)
            
            Dim sdeProperSet As IPropertySet
            Set sdeProperSet = pSdeFWS.connectionProperties
            Call LoadRasterToSDE(strResultFile, strResultPath, strSdeName, sdeProperSet, pSdeFWS, strPassWd)
        End If
    End If
    
 '   MsgBox "完成淹没水深计算!", vbInformation + vbOKOnly, "提示信息"
    WaterDepth = True
    
    Exit Function 'exit sub to avoid error handler

errHandle:
    MsgBox "计算水深失败" & Chr(13) & ERR.Description, vbInformation + vbOKOnly, "提示信息"
    WaterDepth = False
 
 End Function


'************************************************************************************************''''''''''''''
''''设一个栅格图斑边缘的水深为0,通过图斑均值计算其他像元的水深。先对图斑边缘shrink一个像元,然后反求边缘像元高程均值。
''''inputRaster,  为IRaster类型的输入栅格图斑
''''pRasterDepth, 为IRaster类型的输出水深栅格图斑

'************************************************************************************************''''''''''''''
Public Sub calcWaterDepth(inputRaster As IRaster, pRasterDepth As IRaster)
    
    ' Create the RasterExtractionOp/MathOps object
    On Error GoTo errHandle
    
    Dim pConditionalOp As IConditionalOp
    Dim pGeneralizeOp As IGeneralizeOp
    Dim pLogicalOp As ILogicalOp
    Dim pMathOp As IMathSupportOp
    Dim pRMOp As IRasterMakerOp
    Set pConditionalOp = New RasterConditionalOp
    Set pGeneralizeOp = New RasterGeneralizeOp
    Set pLogicalOp = New RasterMathOps
    Set pMathOp = New RasterMathSupportOp
    Set pRMOp = New RasterMakerOp
    
    Dim pZeroRaster As IRaster
    Dim ZoneList As Variant

⌨️ 快捷键说明

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