📄 clsevaluatewizard.cls
字号:
'************************************************************************************************'''
Public Function cropEvaluation(pApp As IApplication) As Boolean
On Error GoTo errHandle
Dim fs, numCropPrice As Integer
Dim strResultPath As String, strResultFile As String, strTemp As String, cropName As String, cropFileName As String
Dim pRasterDepth As IRaster, pRasterLU As IRaster, pShpFloodRangeLyr As IFeatureLayer
frmEvaluateCrop.Left = (Screen.Width - frmEvaluateCrop.Width) / 2
frmEvaluateCrop.Top = (Screen.Height - frmEvaluateCrop.Height) / 2
frmEvaluateCrop.Show vbModal '''''''''''''''''''''''''''''''''''''指定作物洪水损失评估的数据
If frmEvaluateCrop.flagOK Then
Set fs = CreateObject("Scripting.FileSystemObject")
Set pRasterDepth = frmEvaluateCrop.rasFloodDepthLyr.Raster '传递由catalog打开的图层
Set pRasterLU = frmEvaluateCrop.rasLanduseLyr.Raster
strResultFile = frmEvaluateCrop.strPathResult
If fs.FolderExists(Left(strResultFile, Len(strResultFile) - 4)) Then '
MsgBox strResultFile & "已存在,将被覆盖"
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)
Else
MsgBox "放弃指定评估文件,将退出"
cropEvaluation = False
Exit Function
End If
Dim pMathOp As IMathSupportOp
Set pMathOp = New RasterMathSupportOp
Dim pRasCutLU As IRaster
Set pRasCutLU = pMathOp.Plus(pRasterDepth, pRasterLU)
Set pRasCutLU = pMathOp.Minus(pRasCutLU, pRasterDepth)
Dim pRasDepthProps As IRasterProps
Set pRasDepthProps = pRasterDepth 'pRasZeroWhole
Dim pOrigin As IPoint
Set pOrigin = New Point
pOrigin.X = pRasDepthProps.Extent.XMin
pOrigin.Y = pRasDepthProps.Extent.YMin
Dim pWSF As IWorkspaceFactory
Set pWSF = New RasterWorkspaceFactory
Dim pRWS As IRasterWorkspace2
Set pRWS = pWSF.OpenFromFile(strResultPath, 0)
Dim pOutputRasterDS As IRasterDataset
Set pOutputRasterDS = pRWS.CreateRasterDataset(strResultFile, "GRID", pOrigin, _
pRasDepthProps.Width, pRasDepthProps.Height, pRasDepthProps.MeanCellSize.X, _
pRasDepthProps.MeanCellSize.Y, 1, PT_FLOAT, _
pRasDepthProps.SpatialReference, True)
' Create a default raster from output raster dataset
Dim pRasOutput As IRaster
Set pRasOutput = pOutputRasterDS.CreateDefaultRaster
Call setLanduseIDs '设置作物在土地利用中的类别ID
m_bSumResultFirst = True
'''''''''''''''''''''''
frmLossRateDetail.Left = (Screen.Width - frmLossRateDetail.Width) / 2
frmLossRateDetail.Top = (Screen.Height - frmLossRateDetail.Height) / 2
Dim bContinue As Boolean
bContinue = True
Do While bContinue
frmLossRateDetail.Show vbModal '''''''''''''''''''''''''''''''''''''''指定作物的洪水损失率
If frmLossRateDetail.bOKFlag Or frmLossRateDetail.bContinueFlag Then
cropName = frmLossRateDetail.strCropName
cropFileName = frmLossRateDetail.strCropName
numCropPrice = CInt(frmLossRateDetail.strRicePrice)
bContinue = frmLossRateDetail.bContinueFlag
Call evaluateOneCrop(strResultPath, cropFileName, cropName, pRasterDepth, pRasCutLU, _
pRasOutput, m_numRateLevel, m_depthBreak, m_lossRate, numCropPrice, numRiceID) '评估
Else
MsgBox "放弃指定作物的洪水损失率,将退出"
Exit Function
End If
Loop
Dim displayRDS As IRasterDataset
Set displayRDS = OpenRasterDataset(strResultPath, strResultFile)
Dim pMxDoc As IMxDocument
Set pMxDoc = pApp.Document
Dim pRL As IRasterLayer
Set pRL = New RasterLayer
pRL.CreateFromDataset displayRDS
pRL.name = strResultFile 'strLayerName & "洪灾损失"
pMxDoc.FocusMap.AddLayer pRL
pMxDoc.ActiveView.Refresh
Set pRL = Nothing
Set pRasterDepth = Nothing
Set pRasterLU = Nothing
Set pShpFloodRangeLyr = Nothing
Set pWSF = Nothing
Set pMathOp = Nothing
Set pOrigin = Nothing
cropEvaluation = True
MsgBox "完成作物洪损评估计算!"
Exit Function 'exit sub to avoid error handler
errHandle:
MsgBox "作物洪损评估计算失败" & Chr(13) & ERR.Description, vbInformation + vbOKOnly, "提示信息"
cropEvaluation = False
End Function
'************************************************************************************************'''
''''调用evaluateOneCrop,实现单种作物损失评估
'************************************************************************************************'''
Sub evaluateOneCrop(strOutPath As String, strOutFile As String, strLayerName As String, _
pRasDepth As IRaster, pRasLU As IRaster, pRasOutput As IRaster, numBreak As Integer, _
depthBreak() As Single, lossRate() As Single, cropPrice As Integer, cropTypeID As Integer)
On Error GoTo ERH
Dim pWSF As IWorkspaceFactory
Set pWSF = New RasterWorkspaceFactory
If Not pWSF.IsWorkspace(strOutPath) Then GoTo ERH
Dim pRWS As IRasterWorkspace2
Set pRWS = pWSF.OpenFromFile(strOutPath, 0)
Dim pDepthBandCol As IRasterBandCollection
Set pDepthBandCol = pRasDepth 'pInputRasterDS
Dim pDepthBand As iRasterBand
Set pDepthBand = pDepthBandCol.Item(0)
Dim pDepthRasProps As IRasterProps
Set pDepthRasProps = pDepthBand
Dim pLUBandCol As IRasterBandCollection
Set pLUBandCol = pRasLU 'pInputRasterDS
Dim pLUBand As iRasterBand
Set pLUBand = pLUBandCol.Item(0)
Dim pLURasProps As IRasterProps
Set pLURasProps = pLUBand
Dim pOrigin As IPoint
Set pOrigin = New Point
pOrigin.X = pDepthRasProps.Extent.XMin
pOrigin.Y = pDepthRasProps.Extent.YMin
' pOrigin.X = pLURasProps.Extent.XMin
' pOrigin.Y = pLURasProps.Extent.YMin
Dim fs
Set fs = CreateObject("Scripting.FileSystemObject")
If fs.FolderExists(strOutPath & "\" & strOutFile) Then '
fs.Deletefolder (strOutPath & "\" & strOutFile) '
End If
If fs.FileExists(strOutPath & "\" & strOutFile & ".aux") Then '
fs.DeleteFile (strOutPath & "\" & strOutFile & ".aux") '
End If
Dim pOutputRasterDS As IRasterDataset
Set pOutputRasterDS = pRWS.CreateRasterDataset(strOutFile, "GRID", pOrigin, _
pDepthRasProps.Width, pDepthRasProps.Height, pDepthRasProps.MeanCellSize.X, _
pDepthRasProps.MeanCellSize.Y, 1, PT_FLOAT, _
pDepthRasProps.SpatialReference, True)
'Create a default raster from output raster dataset
Dim pOutputRaster As IRaster
Set pOutputRaster = pOutputRasterDS.CreateDefaultRaster
Dim pOutputBandCol As IRasterBandCollection
Set pOutputBandCol = pOutputRasterDS
Dim pOutputBand As iRasterBand
Set pOutputBand = pOutputBandCol.Item(0)
Dim pOutputBandCol1 As IRasterBandCollection
Set pOutputBandCol1 = pRasOutput
Dim pOutputBand1 As iRasterBand
Set pOutputBand1 = pOutputBandCol1.Item(0)
Dim pDepthRawPixel As IRawPixels, pLURawPixel As IRawPixels, pOutputRawPixel As IRawPixels, pOutputRawPixel1 As IRawPixels
Set pDepthRawPixel = pDepthBand
Set pLURawPixel = pLUBand
Set pOutputRawPixel = pOutputBand
Set pOutputRawPixel1 = pOutputBand1
'Create a DblPnt to hold the PixelBlock size
Dim pPnt As IPnt
Set pPnt = New DblPnt
pPnt.SetCoords pLURasProps.Width, pLURasProps.Height 'pDepthRasProps.Width, pDepthRasProps.Height
Dim pDepthBlock As IPixelBlock
Set pDepthBlock = pDepthRawPixel.CreatePixelBlock(pPnt)
pPnt.SetCoords pDepthRasProps.Width, pDepthRasProps.Height
Dim pLUBlock As IPixelBlock
Set pLUBlock = pLURawPixel.CreatePixelBlock(pPnt)
Dim pOutputBlock As IPixelBlock
Set pOutputBlock = pOutputRawPixel.CreatePixelBlock(pPnt)
Dim pOutputBlock1 As IPixelBlock
Set pOutputBlock1 = pOutputRawPixel1.CreatePixelBlock(pPnt)
'Read input PixelBlock
pPnt.X = 0
pPnt.Y = 0
pDepthRawPixel.Read pPnt, pDepthBlock
pLURawPixel.Read pPnt, pLUBlock
pOutputRawPixel1.Read pPnt, pOutputBlock1
'Get the SafeArray associated with the first band of output
Dim vSafeArray As Variant
vSafeArray = pOutputBlock.SafeArray(0)
Dim vSafeArray1 As Variant
vSafeArray1 = pOutputBlock1.SafeArray(0)
Dim i As Integer, j As Integer, k As Integer, numCount As Integer, depth As Single, selLossRate As Single
Dim temp As Double, intTemp As Integer
numCount = 0
For i = 0 To pDepthRasProps.Width - 1 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''i
'i
For j = 0 To pDepthRasProps.Height - 1 '''''''''''''''''''''''''''''''''''''''''j'''''''''i
'j i
If m_bSumResultFirst Then vSafeArray1(i, j) = 0 'initialize result raster 'j i
'j i
depth = pDepthBlock.GetVal(0, i, j)
If pLUBlock.GetVal(0, i, j) = cropTypeID Then '该种作物的分类值 'j i
selLossRate = lossRate(1) 'j i
'j i
For k = 1 To numBreak ''''''''''''''''''''''''''''''''''''''''''''k 'j i
If depth >= depthBreak(k) Then 'k 'j i
selLossRate = lossRate(k + 1) 'k 'j i
Exit For 'k 'j i
End If 'k 'j i
Next k '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''k 'j i
'j i
vSafeArray(i, j) = CSng(selLossRate * cropPrice / 666.7) 'j i
vSafeArray1(i, j) = vSafeArray1(i, j) + vSafeArray(i, j) 'j i
'j i
End If 'j i
'j i
Next j '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''j i
'i
Next i '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''i
If m_bSumResultFirst Then m_bSumResultFirst = False
' Write out the result
pOutputRawPixel.Write pPnt, pOutputBlock
pOutputRawPixel1.Write pPnt, pOutputBlock1
Set pWSF = Nothing
Set pOrigin = Nothing
Set pPnt = Nothing
Exit Sub
ERH:
MsgBox "作物损失单项评估失败" & Chr(13) & ERR.Description, vbInformation + vbOKOnly, "提示信息"
End Sub
'************************************************************************************************''''''
'''CutRasByShp,用多边形提取栅格图斑
'************************************************************************************************''''''
Public Function CutRasByShp(strPolygonFile As String, strPolygonPath As String, rasLanduse As IRaster, strGRIDPath As String) As IRaster 'GeoDataset
On Error GoTo ERH
Dim pWorkspaceFactory As IWorkspaceFactory
Dim pFeatureWorkspace As IFeatureWorkspace
Dim pFeaLyr As IFeatureLayer
Dim pWks As IRasterWorkspace
Dim pWksF As IWorkspaceFactory
Dim pRasLyr As IRasterLayer
Dim pEnv As IRasterAnalysisEnvironment
'Create a new ShapefileWorkspaceFactory object and open a shapefile folder
Set pWorkspaceFactory = New ShapefileWorkspaceFactory
Set pFeatureWorkspace = pWorkspaceFactory.OpenFromFile(strPolygonPath, 0)
Set pFeaLyr = New FeatureLayer
Set pFeaLyr.FeatureClass = pFeatureWorkspace.OpenFeatureClass(strPolygonFile)
' Dim inputRaster As IRaster
' Set inputRaster = OpenRasterDataset(strGRIDPath, strGRIDFile).CreateDefaultRaster
'
Dim pTempDS As IGeoDataset
Set pTempDS = pFeaLyr.FeatureClass
Dim pConOp As IConversionOp
Set pConOp = New RasterConversionOp
Set pEnv = pConOp
Dim pProp As IRasterProps
Set pProp = rasLanduse
pEnv.SetCellSize esriRasterEnvValue, pProp.MeanCellSize.X
' Delete the existing file
Dim fs
Set fs = CreateObject("Scripting.FileSystemObject")
If fs.FolderExists(strGRIDPath + "\" + "CovTemp") Then 'FileExists
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -