Abstract (Summary)
Since 9/11, airport security has become an area of critical national security. The current study investigates the effect of mental rotation training and the presence of visual decision aids on inspection performance. Forty-eight participants were divided into two groups (Group A and Group B) of twenty-four each. Each group was provided with training on visual inspection, baggage screening and on using the software simulation of airport baggage inspection. Participants had to identify from images any object that cannot be allowed on a passenger plane and register a response by clicking one of the buttons, Threat or No Threat. Participants in Group A were provided with visual decision making aids whereas participants in Group B were provided with none. Upon the completion of the first set of trials, all the participants underwent an advanced training session on mental rotation. The participants then repeated the same experiment as before. There was a significant interaction effect between training and rotation for response time, F(1, 184) = 8.59, p = .0038. Individuals that received no training and had rotated objects performed the worse compared to all other conditions. Response times for images with visual aids improves significantly (F(1, 184) = 20.74, p =0.0001) lower (M = 3.70 seconds, SD = 0.50) when compared to the response times for images after without visual aids (M = 4.03 seconds, SD = 0.53). Accuracy for images without training was significantly (F(1, 184) = 34.23, p < 0.0001) lower (M = 74.73, SD = 10.92) than the accuracy for images after training (M = 83.42, SD = 10.51). Accuracy for images presented without visual aids was significantly (F(1, 184) = 19.58, p < 0.0001) lower (M = 75.86, SD = 11.69) than the accuracy for images presented with visual aids (M = 82.29, SD = 10.51). The results from the experiment show that mental rotation has an effect on inspection performance of an airport baggage inspector and that the performance can be improved by training the inspector in mental rotation. It was also observed that providing visual decision making aids can improve the inspection performance.
478 trang |
Chia sẻ: maiphuongtl | Lượt xem: 1826 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Accuracy evaluation of a 3-D spatial modeling approach to model linear objects and predict their lengths, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
target point
'and determine the centerpoints for these surrounding cells
Dim I1 As Integer
Dim I2 As Integer
Dim D1 As Double
Dim D2 As Double
'pIDArray and pRIDObj are used for the target point while the others are used for the surrounding cell
centers.
Dim pIDArray As IArray
Dim pRIDObj As IRasterIdentifyObj
Dim pIDArray1 As IArray
Dim pRIDObj1 As IRasterIdentifyObj
Dim pIDArray2 As IArray
Dim pRIDObj2 As IRasterIdentifyObj
Dim pIDArray3 As IArray
Dim pRIDObj3 As IRasterIdentifyObj
Dim pIDArray4 As IArray
Dim pRIDObj4 As IRasterIdentifyObj
Dim i As Long
Dim j As Long
Dim pPoint As IPoint
Dim pFeature As IFeature
'pNewPoint is the target point, pNewPoint1, 2, 3, 4 are the center points of the surrounding cells.
Dim pNewPoint As IPoint
Set pNewPoint = New Point
Dim pNewPoint1 As IPoint
Set pNewPoint1 = New Point
Dim pNewPoint2 As IPoint
Set pNewPoint2 = New Point
Dim pNewPoint3 As IPoint
Set pNewPoint3 = New Point
Dim pNewPoint4 As IPoint
Set pNewPoint4 = New Point
'Loop through each line in the feature class and obtain points
'including start point and end point and points with cellsize interval
Dim NumOfRow As Integer
NumOfRow = pInFeatureClass.FeatureCount (Nothing)
Dim pLine As IPolyline
Set pLine = New Polyline
Dim length2d As Double
For i = 0 To NumOfRow - 1
'Get line
Set pFeature = pInFeatureClass.GetFeature (i)
Set pLine = pFeature.Shape
length2d = pLine.Length
'jj and jjj will be used to determine how many points will be obtained
Dim jj As Double
Dim jjj As Integer
Dim interval As Integer
interval = cellwidth / 2
430
jj = length2d / interval
jjj = length2d / interval
If (jj - jjj) > 0 Then
jjj = jjj + 1
Else
End If
For j = 0 To jjj
Dim myrow As IRow
Set myrow = pIntable.CreateRow
myrow.value (5) = pFeature.value (2)
myrow.value (1) = pLine.Length
If j = 0 Then
'Get the start point
Set pPoint = pLine.FromPoint
myrow.value (2) = 0
myrow.value (3) = pLine.FromPoint.X
myrow.value (4) = pLine.FromPoint.Y
ElseIf j >= jjj Then
'Get the end point
Set pPoint = pLine.ToPoint
myrow.value (2) = pLine.Length
myrow.value (3) = pLine.ToPoint.X
myrow.value (4) = pLine.ToPoint.Y
Else
'Get intermediate points based on the given interval
pLine.QueryPoint esriNoExtension, j * interval, False, pPoint
myrow.value (2) = j * interval
myrow.value (3) = pPoint.X
myrow.value (4) = pPoint.Y
End If
pNewPoint.X = pPoint.X
pNewPoint.Y = pPoint.Y
'Get RasterIdentifyObject on that point
Set pIDArray = pIdentify.Identify (pNewPoint)
I1 = (pNewPoint.X - XMIN) / cellwidth
I2 = (YMAX - pNewPoint.Y) / cellheight
'Identify the center points of the surrounding cells
pNewPoint1.X = XMIN + (I1 - 0.5) * cellwidth
pNewPoint1.Y = YMAX - (I2 - 0.5) * cellheight
pNewPoint2.X = XMIN + (I1 + 0.5) * cellwidth
pNewPoint2.Y = YMAX - (I2 - 0.5) * cellheight
pNewPoint3.X = XMIN + (I1 - 0.5) * cellwidth
pNewPoint3.Y = YMAX - (I2 + 0.5) * cellheight
pNewPoint4.X = XMIN + (I1 + 0.5) * cellwidth
pNewPoint4.Y = YMAX - (I2 + 0.5) * cellheight
'Get RasterIdentifyObject on these four points
Set pIDArray1 = pIdentify.Identify (pNewPoint1)
Set pIDArray2 = pIdentify.Identify (pNewPoint2)
Set pIDArray3 = pIdentify.Identify (pNewPoint3)
431
Set pIDArray4 = pIdentify.Identify (pNewPoint4)
'Eletotal and Elecount will be used to deal with no surrounding cell or surrounding cell with no data cases
Dim Eletotal As Double
Eletotal = 0
Dim Elecount As Integer
Elecount = 0
'In case one or more surrounding cells not exist, an average of the existing ones is taken
If (pIDArray1 Is Nothing) Or (pIDArray2 Is Nothing) Or (pIDArray3 Is Nothing) Or (pIDArray4 Is
Nothing) Then
If Not pIDArray1 Is Nothing Then
Set pRIDObj1 = pIDArray1.Element (0)
If pRIDObj1.Name "NoData" Then
Elecount = Elecount + 1
Eletotal = Eletotal + CDbl (pRIDObj1.Name)
End If
End If
If Not pIDArray2 Is Nothing Then
Set pRIDObj2 = pIDArray2.Element (0)
If pRIDObj2.Name "NoData" Then
Elecount = Elecount + 1
Eletotal = Eletotal + CDbl (pRIDObj2.Name)
End If
End If
If Not pIDArray3 Is Nothing Then
Set pRIDObj3 = pIDArray3.Element (0)
If pRIDObj3.Name "NoData" Then
Elecount = Elecount + 1
Eletotal = Eletotal + CDbl (pRIDObj3.Name)
End If
End If
If Not pIDArray4 Is Nothing Then
Set pRIDObj4 = pIDArray4.Element (0)
If pRIDObj4.Name "NoData" Then
Elecount = Elecount + 1
Eletotal = Eletotal + CDbl(pRIDObj4.Name)
End If
End If
If Elecount > 0 Then
myrow.value (FieldIndex) = Eletotal / Elecount
myrow.value (6) = Eletotal / Elecount
myrow.Store
End If
Else
Set pRIDObj1 = pIDArray1.Element (0)
Set pRIDObj2 = pIDArray2.Element (0)
Set pRIDObj3 = pIDArray3.Element (0)
Set pRIDObj4 = pIDArray4.Element (0)
'In case one or more surrounding cells have no data, an average is taken
432
If pRIDObj1.Name = "NoData" Or pRIDObj2.Name = "NoData" Or pRIDObj3.Name = "NoData" Or
pRIDObj4.Name = "NoData" Then
If pRIDObj1.Name "NoData" Then
Elecount = Elecount + 1
Eletotal = Eletotal + CDbl (pRIDObj1.Name)
End If
If pRIDObj2.Name "NoData" Then
Elecount = Elecount + 1
Eletotal = Eletotal + CDbl (pRIDObj2.Name)
End If
If pRIDObj3.Name "NoData" Then
Elecount = Elecount + 1
Eletotal = Eletotal + CDbl (pRIDObj3.Name)
End If
If pRIDObj4.Name "NoData" Then
Elecount = Elecount + 1
Eletotal = Eletotal + CDbl (pRIDObj4.Name)
End If
If Elecount > 0 Then
myrow.value (FieldIndex) = Eletotal / Elecount
myrow.value (6) = Eletotal / Elecount
myrow.Store
End If
Else
'All 4 surrounding cells exist and have values, elevation for the target point is obtained via bilinear
'interpolation
'E1 to E4 will be used to store the elevations for the surrounding cells
Dim E1 As Double
Dim E2 As Double
Dim E3 As Double
Dim E4 As Double
'EE1 and EE2 will be used to store the elevations for the intermediate points
Dim EE1 As Double
Dim EE2 As Double
'EE will be used to store the elevation for the target point after billinear interpolation
Dim EE As Double
E1 = CDbl (pRIDObj1.Name)
E2 = CDbl (pRIDObj2.Name)
E3 = CDbl (pRIDObj3.Name)
E4 = CDbl (pRIDObj4.Name)
EE1 = E1 + (pNewPoint.X - pNewPoint1.X) * (E2 - E1) / cellwidth
EE2 = E3 + (pNewPoint.X - pNewPoint3.X) * (E4 - E3) / cellwidth
EE = EE2 + (EE1 - EE2) * (pNewPoint.Y - pNewPoint4.Y) / cellheight
myrow.value (FieldIndex) = EE
myrow.value (6) = EE
myrow.Store
End If
End If
myrow.Store
Next j
Next i
End Sub
433
APPENDIX D PROGRAM CODE FOR CALCULATIONS OF AVERAGE, WEIGHTED
AVERAGE, AVERAGE SLOPE CHANGE, AND WEIGHTED AVERAGE SLOPE
CHANGE
'Program Name: Slope
'Computes the average slope, weighted average slope, average slope change, and weighted average slope
'change from the 3-D points representing FTSegs in a 3-D space.
'This program was developed by Hubo Cai during th summer of 2003.
Option Explicit
Sub slope ()
'Create a workspace to open the attribute table of the 3-D road centerline data and the target table to store the
'calculations
Dim pworkspacefactory As IWorkspaceFactory
Set pworkspacefactory = New ShapefileWorkspaceFactory
Dim pfeatureworkspace As IFeatureWorkspace
Set pfeatureworkspace = pworkspacefactory.OpenFromFile ("c:\dotdata\studyscope", 0)
'Open the 3-D road centerline data (3-D point data)
Dim mytable As ITable
Set mytable = pfeatureworkspace.OpenTable ("snap_johnston_nc_4ft")
MsgBox "how many rows: " & mytable.RowCount (Nothing)
'Open the target table to store the calculations
Dim mytargettable As ITable
Set mytargettable = pfeatureworkspace.OpenTable ("slope_johnston_nc_average")
'Define all variables
Dim sumslopedifference As Double
Dim sumslope As Double
Dim absoluteslope As Double
Dim currentslopedifference As Double
Dim slope As Double
Dim currentslope As Double
Dim current2d As Double
Dim currentelevation As Double
Dim MERGE As Integer
Dim CONDITION As String
Dim pointcount As Long
Dim segcount As Long
Dim sdifference As Double
Dim DIST As Double
Dim SUM As Double
Dim slope1 As Double
Dim slope2 As Double
Dim SUM_Slope_W As Double
Dim SUM_Slope_CH_W As Double
'Loop through the table based on the MERGE value (the ID of the FTSegs)
For MERGE = 0 To 100
'Initialize the variables
sumslopedifference = 0
sumslope = 0
currentslope = 0
current2d = 0
currentelevation = 0
434
pointcount = 0
DIST = 0
SUM = 0
slope1 = 0
slope2 = 0
SUM_Slope_W = 0
SUM_Slope_CH_W = 0
'Define the tablesort where clause
CONDITION = "MERGE = " & MERGE
'Create a tablesort to retrieve all 3-D points belonging to the current FTSeg
Dim pTableSort As ITableSort
Set pTableSort = New esriCore.TableSort
Dim pQueryFilter As IQueryFilter
Set pQueryFilter = New QueryFilter
pQueryFilter.WhereClause = CONDITION
With pTableSort
.Fields = "D_TO_S"
.Ascending ("D_TO_S") = True
Set .QueryFilter = pQueryFilter
Set .Table = mytable
End With
pTableSort.Sort Nothing
Dim pCursor As ICursor
Set pCursor = pTableSort.Rows
Dim pRow As IRow
Dim tRow As IRow
Set pRow = pCursor.NextRow
'Start from the start point, go through neighboring points and do calculations
If Not pRow Is Nothing Then
currentelevation = pRow.Value (3)
current2d = pRow.Value (5)
pointcount = pointcount + 1
Set tRow = mytargettable.CreateRow
tRow.Value (1) = pRow.Value (7)
Set pRow = pCursor.NextRow
Do While Not pRow Is Nothing
'Variable sdifference is the current 2D distance between two neighboring 3D points
sdifference = pRow.Value (5) - current2d
If sdifference > 0 Then
'DIST is the 3-D distance between two neighboring points
DIST = Sqr((pRow.Value (3) - currentelevation) * (pRow.Value (3) - currentelevation) + (pRow.Value
(5) - current2d) * (pRow.Value (5) - current2d))
'SUM is the sum of the 3D distances
SUM = SUM + DIST
'Variable slope is the current slope between two neighboring points
slope = (pRow.Value (3) - currentelevation) / (pRow.Value (5) - current2d)
'Variable currentslopedifference is the slope change from the current slope to the slope of the previous
one
currentslopedifference = Abs (slope - currentslope)
absoluteslope = Abs (slope)
435
'Variable sumslopedifference holds the sum of the slope changes
sumslopedifference = sumslopedifference + currentslopedifference
'Variable sumslope holds the sum of the absolute slopes
sumslope = sumslope + absoluteslope
'SUM_Slope_W and SUM_Slope_CH_W hold the sum of the weighted slopes and the sum of the
weighted slope changes, respectively
SUM_Slope_W = SUM_Slope_W + absoluteslope * DIST
SUM_Slope_CH_W = SUM_Slope_CH_W + currentslopedifference * DIST
'MsgBox "2D Difference is: " & (pRow.Value (2) - current2d) & "3D Distance is: " & sum
pointcount = pointcount + 1
currentslope = slope
Else
'Two points are too close and do nothing
MsgBox "Points too close!"
End If
current2d = pRow.Value (5)
currentelevation = pRow.Value (3)
Set pRow = pCursor.NextRow
Loop
'The totoal number of segments is calculated as the number of 3-D points subtracted by 1
segcount = pointcount - 1
'Calculate all the average values and store them to the target table
tRow.Value (2) = sumslopedifference
tRow.Value (3) = segcount
tRow.Value (4) = sumslopedifference / segcount
tRow.Value (5) = sumslope
tRow.Value (6) = sumslope / segcount
tRow.Value (7) = SUM_Slope_W / SUM
tRow.Value (8) = SUM_Slope_CH_W / SUM
tRow.Value (9) = SUM
tRow.Value (10) = SUM_Slope_W
tRow.Value (11) = SUM_Slope_CH_W
tRow.Store
Else
'No FTSeg with the current MERGE value exists. Do nothing and go to the next MERGE value
End If
Next
End Sub
436
APPENDIX E PROGRAM CODE FOR CHECKING THE ERROR TOLERANCE AND THE
MAXIMUM DROP AND MAKING ADJUSTMENTS
'Program Name: Clean_methods
'For all the points along river polylines, check the error tolerance and the maximum drop and make
'corresponding adjustments.
'This program was developed by Hubo Cai during the summer of 2003.
Option Explicit
Sub Clean_methods()
'Open a workspace and open the point data
Dim pworkspacefactory As IWorkspaceFactory
Set pworkspacefactory = New ShapefileWorkspaceFactory
Dim pfeatureworkspace As IFeatureWorkspace
Set pfeatureworkspace = pworkspacefactory.OpenFromFile ("S:\PALRS\users\Hubo\Hydro", 0)
Dim mytable As ITable
Set mytable = pfeatureworkspace.OpenTable ("PointAlongRiverClean_method1")
'Define variables. Variable totalchanged is used to keep track of the number of points being changed
Dim RiverID As Integer
Dim elev1 As Double
Dim elev2 As Double
Dim CONDITION As String
Dim totalchanged As Long
totalchanged = 0
'Loop through each river
For RiverID = 0 To 67
CONDITION = "RiverID = " & RiverID
'elev1 and elev2 are used to store the average elevations of the first 3 points and the last 3 points, respectively
elev1 = 0
elev2 = 0
'Define a tablesort
Dim pTableSort As ITableSort
Set pTableSort = New esriCore.TableSort
Dim pQueryFilter As IQueryFilter
Set pQueryFilter = New QueryFilter
pQueryFilter.whereClause = CONDITION
'Sort 1 to get the first three points
With pTableSort
.Fields = "D_TO_S"
.Ascending ("D_TO_S") = True
Set .QueryFilter = pQueryFilter
Set .Table = mytable
End With
pTableSort.Sort Nothing
Dim pCursor As ICursor
Set pCursor = pTableSort.Rows
Dim pRow As IRow
Dim trow As IRow
Set pRow = pCursor.NextRow
437
Dim count As Integer
count = 0
Dim i As Integer
'get the average elevation of the first three points
If Not pRow Is Nothing Then
Do While (Not pRow Is Nothing) And (count < 3)
elev1 = elev1 + pRow.value (1)
count = count + 1
Set pRow = pCursor.NextRow
Loop
elev1 = elev1 / count
Else
elev1 = 9999
End If
'Sort 2 to get the last three points
With pTableSort
.Fields = "D_TO_S"
.Ascending ("D_TO_S") = False
Set .QueryFilter = pQueryFilter
Set .Table = mytable
End With
pTableSort.Sort Nothing
Set pCursor = pTableSort.Rows
Set pRow = pCursor.NextRow
count = 0
'Get the average elevation of the last three points
If Not pRow Is Nothing Then
Do While (Not pRow Is Nothing) And (count < 3)
elev2 = elev2 + pRow.value (1)
count = count + 1
Set pRow = pCursor.NextRow
Loop
elev2 = elev2 / count
Else
elev2 = 9999
End If
Dim down As Boolean
Dim upper As Boolean
Dim flat As Boolean
'Determine if the water is running from start to the end or from the end to the start
If elev1 = 9999 Or elev2 = 999 Then
down = False
upper = False
MsgBox "some points are missing"
GoTo eex
Else
If Abs(elev1 - elev2) <= 10 Then 'difference is less than 1ft
down = False
upper = False
flat = True
438
ElseIf elev1 >= elev2 Then
down = True
upper = False
Else
down = False
upper = True
End If
End If
'Start cleaning
'Based on the flowing direction, sort the points based on their distance to the start point so that the order is
always from higher elevations to lower elevations
If upper Then
With pTableSort
.Fields = "D_TO_S"
.Ascending ("D_TO_S") = False
Set .QueryFilter = pQueryFilter
Set .Table = mytable
End With
Else
With pTableSort
.Fields = "D_TO_S"
.Ascending ("D_TO_S") = True
Set .QueryFilter = pQueryFilter
Set .Table = mytable
End With
End If
pTableSort.Sort Nothing
Set pCursor = pTableSort.Rows
Set pRow = pCursor.NextRow
Dim targetrow As IRow
Dim maxdrop As Double
Dim tolerance As Double
'Define the maximun drop and the error tolerance
maxdrop = 0.1 '10%
tolerance = 0.02 '1ft/50ft
If Not pRow Is Nothing Then
Set targetrow = pRow
Set pRow = pCursor.NextRow
Do While Not pRow Is Nothing
'check with error tolerance
If (pRow.value (1) - targetrow.value (1)) >= 0 Then
If Abs((pRow.value (1) - targetrow.value (1)) / ((pRow.value (2) - targetrow.value (2)) * 10)) <=
tolerance Then
'Within error tolerance, ok, do nothing
Else
'Error tolerance is exceeded. Assign the elevation of the succeeding point to the current point
pRow.value (1) = targetrow.value (1)
pRow.Store
totalchanged = totalchanged + 1
End If
Set targetrow = pRow
Set pRow = pCursor.NextRow
Else
439
'check with maximum drop
If Abs((pRow.value (1) - targetrow.value (1)) / ((pRow.value (2) - targetrow.value (2)) * 10)) <=
maxdrop Then
'Within the maximum drop range, ok, do nothing
Else
'Algorithm 1, adjust the elevation of the current point
pRow.value (1) = targetrow.value (1) - maxdrop * Abs(pRow.value (2) - targetrow.value (2)) * 10
pRow.Store
totalchanged = totalchanged + 1
'Algorithm 2, adjust the elevation of the succeeding point
'(targetrow.value (1) = pRow.value (1) + maxdrop * Abs(pRow.value (2) - targetrow.value (2)) *
10}
'{targetrow.Store}
'{totalchanged = totalchanged + 1}
End If
Set targetrow = pRow
Set pRow = pCursor.NextRow
End If
Loop
Else
End If
eex: MsgBox "Some points are missing, pay attention to river with ID: " & RiverID
Next
End Sub
440
APPENDIX F PROGRAM CODE FOR FLOOD EXTENT PREDICTION
'Program Name: FloodExtentPrediction
'This program is developed to predict flood extent with given LIDAR 20ft DEM and point data along
'waterbodies '(polylines)
'This program was developed by Hubo Cai during the summer of 2003
Option Explicit
Sub FloodExtentPrediction ()
'Define raster data set and open raster data by calling the OpenRasterDataset Sub
Dim praster As IRasterDataset
Dim ppraster As IRaster
Set ppraster = OpenRasterDataset ("s:\palrs\users\Hubo\Hydro", "elev_wilson").CreateDefaultRaster
ppraster.ResampleMethod = RSP_BilinearInterpolation
'Define workspace and open the waterbody data and the resulting polygon data
Dim pworkspacefactory As IWorkspaceFactory
Set pworkspacefactory = New ShapefileWorkspaceFactory
Dim pfeatureworkspace As IFeatureWorkspace
Set pfeatureworkspace = pworkspacefactory.OpenFromFile ("S:\PALRS\users\Hubo\Hydro", 0)
Dim polygonfeatureclass As IFeatureClass
Set polygonfeatureclass = pfeatureworkspace.OpenFeatureClass ("Testing_results_clean_method2")
Dim newfeature As IFeature
Dim mypointcollection As IPointCollection
Dim mypolygon As IPolygon
'a Linefeature represents a waterbody polyline
'linetotal and linecount are used to control the loop
Dim linefeatureclass As IFeatureClass
Set linefeatureclass = pfeatureworkspace.OpenFeatureClass ("Testing_riv_3")
Dim linetotal As Integer
linetotal = linefeatureclass.FeatureCount (Nothing)
Dim linecount As Integer
Dim myfeature As IFeature
Dim mypointtable As ITable
Set mypointtable = pfeatureworkspace.OpenTable ("PointAlongRiverClean_method2")
Dim flood1 As Double
Dim flood2 As Double
Dim reachingboundary As Long
reachingboundary = 0
For linecount = 0 To linetotal - 1
Set myfeature = linefeatureclass.GetFeature (linecount)
Dim myline As IPolyline
Set myline = myfeature.Shape
Dim elevadd As Double
'Assume the given flood is 2 ft
'Our elevation data were multiplied by 10 and therefore, 2 ft equals 20 now
elevadd = 20
Dim count As Integer
'Point1, point2, point3, and point4 will be used to represent the vertices
'of the polygon to be constructed.
441
'midpoint represents a point along the waterbody polyline, through which
'the normal line will be built.
Dim point1 As IPoint
Dim point2 As IPoint
Dim point3 As IPoint
Dim point4 As IPoint
Set point1 = New Point
Set point2 = New Point
Set point3 = New Point
Set point4 = New Point
Dim midpoint As IPoint
Dim CONDITION As String
CONDITION = "RiverID = " & myfeature.value(0)
Dim pTableSort As ITableSort
Set pTableSort = New esriCore.TableSort
Dim pQueryFilter As IQueryFilter
Set pQueryFilter = New QueryFilter
pQueryFilter.whereClause = CONDITION
With pTableSort
.Fields = "D_TO_S"
.Ascending ("D_TO_S") = True
Set .QueryFilter = pQueryFilter
Set .Table = mypointtable
End With
pTableSort.Sort Nothing
Dim pCursor As ICursor
Set pCursor = pTableSort.Rows
Dim pRow As IRow
Set pRow = pCursor.NextRow
Dim delete1 As Boolean
Dim delete2 As Boolean
If Not pRow Is Nothing Then
'Built the normal line through the start point of a waterbody polyline feature
Dim pnormal1 As ILine
Set pnormal1 = New Line
myline.QueryNormal esriNoExtension, pRow.value (2), False, 100, pnormal1
Set point1 = pnormal1.ToPoint
Dim pnormal2 As ILine
Set pnormal2 = New Line
Set midpoint = New Point
Set midpoint = myline.FromPoint
'The normal line starts from the midpoint to one direction.
'Since we need the normal line in both directions, point2 is
'temporarily used to extent the line to the other direction.
point2.X = midpoint.X * 2 - point1.X
point2.Y = midpoint.Y * 2 - point1.Y
pnormal2.FromPoint = midpoint
pnormal2.ToPoint = point2
'Call the mypoint sub to determine point1 and point2 on the normal lines
'The new point1 and point2 having their elevations equaling the target elevation.
442
Call mypoint(delete1, pRow.value (1), point1, ppraster, pnormal1, midpoint, elevadd, flood1)
Call mypoint(delete2, pRow.value (1), point2, ppraster, pnormal2, midpoint, elevadd, flood1)
If delete1 Then
reachingboundary = reachingboundary + 1
Else
End If
If delete2 Then
reachingboundary = reachingboundary + 1
Else
End If
Dim pnormal3 As ILine
Dim pnormal4 As ILine
Set pnormal3 = New Line
Set pnormal4 = New Line
'Continue to construct normal line and to determine point3 and point4
'at the next point along the water body polyline
Set pRow = pCursor.NextRow
Do While Not pRow Is Nothing
myline.QueryNormal esriNoExtension, pRow.value (2), False, 100, pnormal3
myline.QueryPoint esriNoExtension, pRow.value (2), False, midpoint
Set point4 = pnormal3.ToPoint
Set pnormal4 = New Line
Set point3 = New Point
point3.X = midpoint.X * 2 - point4.X
point3.Y = midpoint.Y * 2 - point4.Y
pnormal4.FromPoint = midpoint
pnormal4.ToPoint = point3
'Call the mypoint sub to determine point3 and point4 on the normal lines
'The new point1 and point2 having their elevations equaling the target elevation.
Call mypoint(delete1, pRow.value (1), point3, ppraster, pnormal4, midpoint, elevadd, flood2)
Call mypoint(delete2, pRow.value (1), point4, ppraster, pnormal3, midpoint, elevadd, flood2)
If delete1 Then
reachingboundary = reachingboundary + 1
Else
End If
If delete2 Then
reachingboundary = reachingboundary + 1
Else
End If
'After 4 vertices are determined, a new polygon is constructed
Set mypolygon = New Polygon
Set mypointcollection = mypolygon
If mypointcollection.pointcount > 0 Then
mypointcollection.RemovePoints 0, mypointcollection.pointcount
Else
End If
443
If delete1 Or delete2 Then
If delete1 Then
mypointcollection.AddPoints 1, point1
mypointcollection.AddPoints 1, point2
mypointcollection.AddPoints 1, point4
mypolygon.Close
Set newfeature = polygonfeatureclass.CreateFeature
Set newfeature.Shape = mypolygon
newfeature.Store
newfeature.value (3) = myfeature.value (0)
newfeature.value (4) = (flood1 * 2 + flood2) / 3
newfeature.Store
Set point1 = New Point
'Set point2 = New point
Set point1 = point4
'Set point2 = point3
flood1 = flood2
Set pRow = pCursor.NextRow
Else
mypointcollection.AddPoints 1, point1
mypointcollection.AddPoints 1, point2
mypointcollection.AddPoints 1, point3
mypolygon.Close
Set newfeature = polygonfeatureclass.CreateFeature
Set newfeature.Shape = mypolygon
newfeature.Store
newfeature.value (3) = myfeature.value(0)
newfeature.value (4) = (flood1 * 2 + flood2) / 3
newfeature.Store
'Set point1 = New point
Set point2 = New Point
'Set point1 = point4
Set point2 = point3
flood1 = flood2
Set pRow = pCursor.NextRow
End If
Else
mypointcollection.AddPoints 1, point1
mypointcollection.AddPoints 1, point2
mypointcollection.AddPoints 1, point3
mypointcollection.AddPoints 1, point4
mypolygon.Close
Set newfeature = polygonfeatureclass.CreateFeature
Set newfeature.Shape = mypolygon
newfeature.Store
newfeature.value (3) = myfeature.value (0)
newfeature.value (4) = (flood1 + flood2) / 2
newfeature.Store
'After the new polygon is constructed and stored, point3 and point4
'are assigned to point2 and point1, respectively.
'The procedure continues to identify new point3 and point4 at the next
'point along the water body polyline and consequently, new polygon will
'be constructed.
444
'Doing the inner loop will construct polygons surrounding the water body.
Set point1 = New Point
Set point2 = New Point
Set point1 = point4
Set point2 = point3
flood1 = flood2
Set pRow = pCursor.NextRow
End If
Loop
Else
End If
Next
MsgBox "total reaching boundary: " & reachingboundary
End Sub
Public Function OpenRasterDataset (sPath As String, sFileName As String) As IRasterDataset
' 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
End Function
'This sub aims at determining two points on the normal line, which have their elevations
'equalling to the target elevation.
Public Sub mypoint(delete As Boolean, base_elev As Double, outpoint As IPoint, pInRaster As IRaster,
pInLine As ILine, ppInPoint As IPoint, elevadd As Double, flood As Double)
' pInRaster: input raster
' pInFeatureClass: input line feature class
' sFieldName: name of the field that stores the values
delete = False
' Create a raster layer and QI for IIdentify interface
Dim pRLayer As IRasterLayer
Set pRLayer = New RasterLayer
pInRaster.ResampleMethod = RSP_BilinearInterpolation
pRLayer.CreateFromRaster pInRaster
Dim pIdentify As IIdentify
Set pIdentify = pRLayer
Dim pProperty As IRasterProps
Set pProperty = pInRaster
Dim cellheight As Double
cellheight = pProperty.Height
445
cellheight = (pProperty.Extent.YMAX - pProperty.Extent.YMin) / cellheight
'Determine cell width
Dim cellwidth As Double
cellwidth = pProperty.Width
cellwidth = (pProperty.Extent.XMax - pProperty.Extent.XMIN) / cellwidth
'Determine the upper-left corner of the raster data
Dim XMIN As Double
XMIN = pProperty.Extent.XMIN
Dim YMAX As Double
YMAX = pProperty.Extent.YMAX
'I1 and I2 will be used to locate the surrounding cells for the target point
'and determine the centerpoints for these surrounding cells
Dim I1 As Integer
Dim I2 As Integer
Dim D1 As Double
Dim D2 As Double
'pIDArray and pRIDObj are used for the target point while the others are used for the surrounding cell
centers.
Dim pIDArray As IArray
Dim pRIDObj As IRasterIdentifyObj
Dim pIDArray1 As IArray
Dim pRIDObj1 As IRasterIdentifyObj
Dim pIDArray2 As IArray
Dim pRIDObj2 As IRasterIdentifyObj
Dim pNewPoint1 As IPoint
Set pNewPoint1 = New Point
Dim pNewPoint2 As IPoint
Set pNewPoint2 = New Point
'Get RasterIdentifyObject on the point on the river line
Dim pInPoint As IPoint
Set pInPoint = New Point
Set pInPoint = ppInPoint
'MsgBox "Do we have pInPoint? " & pInPoint.X & ", " & pInPoint.Y
Set pIDArray = pIdentify.Identify(pInPoint)
If pIDArray Is Nothing Then
MsgBox "No elevation is found, exit sub!"
Exit Sub
Else
'MsgBox "GOOD POINT!"
End If
'Determine the elevation of the midpoint and consequently
'the target elevation
'Set pRIDObj = pIDArray.Element (0)
'Dim base_elev As Double
'base_elev = CDbl (pRIDObj.Name)
Dim target_elev As Double
target_elev = base_elev + elevadd
Dim currentelev As Double
Dim elev1 As Double
Dim elev2 As Double
446
'Identify two points on line with one elevation lower than the target elevation
'and the other with elevation higher than the target elevation
Dim ii As Integer
ii = 0
'The Do loop searches for the target point along the normal line, starting from
'the mid point. Each search step has the distance increase equalling to cell
'width. The target point is located via linear interpolation.
Do
ii = ii + 1
pInLine.QueryPoint esriExtendTangentAtTo, ii * cellwidth, False, pNewPoint2
Set pIDArray2 = pIdentify.Identify (pNewPoint2)
If pIDArray2 Is Nothing Then
'MsgBox "ii is: " & ii
Exit Do
Else
Set pRIDObj2 = pIDArray2.Element (0)
If pRIDObj2.Name = "NoData" Then
'MsgBox "new ii is: " & ii
Exit Do
Else
currentelev = CDbl (pRIDObj2.Name)
elev2 = currentelev
End If
End If
Loop While (currentelev
"NoData")
pInLine.QueryPoint esriExtendTangentAtTo, (ii - 1) * cellwidth, False, pNewPoint1
Set pIDArray1 = pIdentify.Identify (pNewPoint1)
Set pRIDObj1 = pIDArray1.Element (0)
elev1 = CDbl (pRIDObj1.Name)
Set outpoint = New Point
If pIDArray2 Is Nothing Or pRIDObj2.Name = "NoData" Then
'The boundary is reached
delete = True
outpoint.X = pNewPoint1.X
outpoint.Y = pNewPoint1.Y
Else
delete = False
If Abs(elev2 - elev1) < 0.01 Then
'Two points having elevation very close to each other
'the target point is located in the middle of the
'two points
outpoint.X = (pNewPoint1.X + pNewPoint2.X) / 2
outpoint.Y = (pNewPoint1.Y + pNewPoint2.Y) / 2
Else
'Linear interpolation is applied
outpoint.X = pNewPoint1.X + (pNewPoint2.X - pNewPoint1.X) * (target_elev - elev1) / (elev2 - elev1)
outpoint.Y = pNewPoint1.Y + (pNewPoint2.Y - pNewPoint1.Y) * (target_elev - elev1) / (elev2 - elev1)
End If
End If
'This flood is the flooded water level of the new polygon being constructed.
flood = target_elev
'MsgBox "Base elevatio is: " & base_elev & "; flood elevation is: " & target_elev
End Sub
447
APPENDIX G PROGRAM CODE FOR FLOODE ROAD SEGMENT IDENTIFICATION
'Program Name: FloodedRoadSegmentIdentification
'This program is developed to identify flooded road segments given the resulting polygons representing flood
'extent 'and the 3-D road data.
'This program was developed by Hubo Cai during the summer of 2003
Option Explicit
'The main sub determines the road segments in the flood extents. For each of the road segments, the public sub
'myflood is called to determine the flooded road segments within the road segments in the flood extent.
Sub FloodedRoadSegmentIdentification ()
'Open workspace and all the files
Dim pworkspacefactory As IWorkspaceFactory
Set pworkspacefactory = New ShapefileWorkspaceFactory
Dim pfeatureworkspace As IFeatureWorkspace
Set pfeatureworkspace = pworkspacefactory.OpenFromFile ("s:\palrs\users\hubo\Hydro", 0)
'Open 3-D road data file
Dim linefeatureclass As IFeatureClass
Set linefeatureclass = pfeatureworkspace.OpenFeatureClass ("Inter_Wilson")
'Open the flood extent file
Dim polygonfeatureclass As IFeatureClass
Set polygonfeatureclass = pfeatureworkspace.OpenFeatureClass ("Testing_results_500_4")
'Open the new road segment file to store identified flooded road segments
Dim newlinefeatureclass As IFeatureClass
Set newlinefeatureclass = pfeatureworkspace.OpenFeatureClass ("road1")
Dim mylinefeature As IFeature
Dim myline As IPolyline
'Variable linecount is used to identify the number of polylines in the 3-D road data
Dim linecount As Long
linecount = linefeatureclass.FeatureCount (Nothing)
Dim flood As Double
Dim lineID As Long
'The outer loop works with each feature from the 3-D road data
For lineID = 0 To linecount - 1
Set mylinefeature = linefeatureclass.GetFeature (lineID)
Set myline = New Polyline
Set myline = mylinefeature.Shape
Dim myoperator As ITopologicalOperator
Set myoperator = myline
Dim mypolygonfeature As IFeature
'The variable polygoncount is used to count the number of polygons in the flood extent file
Dim polygoncount As Long
polygoncount = polygonfeatureclass.FeatureCount(Nothing)
Dim polygonID As Long
'The inner loop works with every polygon from the flood extent file
For polygonID = 0 To polygoncount - 1
Set mypolygonfeature = polygonfeatureclass.GetFeature (polygonID)
'Obtain the flood level stored with each polygon
flood = mypolygonfeature.value (4) / 10
Dim mypolygon As IPolygon
448
Set mypolygon = New Polygon
Set mypolygon = mypolygonfeature.Shape
Dim newline As IPolyline
Set newline = New Polyline
Dim newfeature As IFeature
'Object newmultipoints will be used to store points for construcing flooded road segments
Dim newmultipoints As IMultipoint
Set newmultipoints = New Multipoint
Dim newpointcollection As IPointCollection
Dim mygeometry As IGeometry
Set mygeometry = New Multipoint
'Each road feature is intersected with each polygon
Set mygeometry = myoperator.intersect (mypolygon, 1)
Set newpointcollection = mygeometry
If newpointcollection.pointcount = 0 Then
Else
'Work with the intersecting points to figure out the points
'needed to construct flooded road segments
Dim ii As Integer
ii = newpointcollection.pointcount Mod 2
If ii = 0 Then
Else
'identify start and end nodes
'Judge if start or end nodes are in the polygon
'Determine if the start or end node should be used to construct flooded road segments
Dim startnode As IPoint
Dim endnode As IPoint
Set startnode = New Point
Set endnode = New Point
Set startnode = myline.FromPoint
Set endnode = myline.ToPoint
Dim test As IRelationalOperator
Set test = mypolygon
Dim startin As Boolean
Dim endin As Boolean
startin = test.Contains (startnode)
endin = test.Contains (endnode)
If startin Then
newpointcollection.AddPoint startnode
ElseIf endin Then
newpointcollection.AddPoint endnode
Else
MsgBox "something wrong!"
MsgBox "line ID is:" & mylinefeature.value (0)
MsgBox "polygon ID is:" & mypolygonfeature.value (0)
Exit Sub
End If
End If
Dim pointcount As Integer
pointcount = newpointcollection.pointcount
'The two arrays defined hereby will be used to store those points
'in the order of their distances to the start point of the road segment
'from which they are identified.
'By doing this, all intersected road segments are identified.
449
Dim orderedpointcollection (100) As IPoint
Dim dist (100) As Double
Dim i As Integer
Dim out As IPoint
Dim dis1 As Double
Dim dis2 As Double
Dim bright As Boolean
For i = 0 To pointcount - 1
Set out = New Point
myline.QueryPointAndDistance esriNoExtension, newpointcollection.Point (i), False, out, dis1, dis2,
bright
dist (i) = dis1
Next
Dim outerloop As Integer
Dim interloop As Integer
Dim min As Double
For outerloop = 0 To pointcount - 2
min = dist (outerloop)
For interloop = outerloop + 1 To pointcount - 1
If dist (interloop) < min Then
min = dist (interloop)
dist (interloop) = dist (outerloop)
dist (outerloop) = min
Else
End If
Next
Next
Dim newlinecount As Integer
newlinecount = pointcount / 2
Dim linecreation As Integer
For linecreation = 0 To newlinecount - 1
Set newline = New Polyline
'Call the myflood function to determine the flooded road segments
'for all road segments that are in the flood extent
Call myflood(mylinefeature.value (2), dist(linecreation * 2), dist(linecreation * 2 + 1), flood, myline,
newlinefeatureclass)
Next
End If
Next
Next
End Sub
'This public works with the 3-D road data to determine flooded road segments within the road segments in the
'flood extent
Public Sub myflood(linemerge As Long, dist1 As Double, dist2 As Double, flood As Double, myline As
IPolyline, newlinefeatureclass As IFeatureClass)
'Open workspace and needed files
Dim fpworkspacefactory As IWorkspaceFactory
Set fpworkspacefactory = New ShapefileWorkspaceFactory
Dim fpfeatureworkspace As IFeatureWorkspace
450
Set fpfeatureworkspace = fpworkspacefactory.OpenFromFile
("S:\PALRS\users\Hubo\Nroad_english\WILSON", 0)
'This table contains 3-D road data
Dim fmytable As ITable
Set fmytable = fpfeatureworkspace.OpenTable("snap_wilson")
Dim newfeature As IFeature
'Variable CONDITION is that condition that will be used to retrieve all 3-D points enclosed
'by the start and end points of a road segment in the flood extent
Dim CONDITION As String
CONDITION = "MERGE = " & linemerge & " AND D_TO_S >= " & dist1 & " AND D_TO_S <= " &
dist2
'Variables CONDITION1 and CONDITION2 will store the necessary conditions for retrieving 3-D
'points from the table, which are used to determine the elevations for the start and end points
'of the road segment in the flood extent, via linear interpolation from two neighboring points.
Dim CONDITION1 As String
Dim CONDITION2 As String
CONDITION1 = "MERGE = " & linemerge & " AND D_TO_S <= " & dist1
CONDITION2 = "MERGE = " & linemerge & " AND D_TO_S >= " & dist2
Dim pTableSort As ITableSort
Set pTableSort = New esriCore.TableSort
Dim pQueryFilter As IQueryFilter
Set pQueryFilter = New QueryFilter
pQueryFilter.whereClause = CONDITION1
Dim newline As IPolyline
Set newline = New Polyline
Dim e1 As Double
Dim e2 As Double
Dim ss1 As Double
Dim ss2 As Double
'Obtain the elevation and distance the 3-D point right before dist1 (the start
'point of the road segment in the flood extent
With pTableSort
.Fields = "D_TO_S"
.Ascending ("D_TO_S") = True
Set .QueryFilter = pQueryFilter
Set .Table = fmytable
End With
pTableSort.Sort Nothing
Dim pCursor As ICursor
Set pCursor = pTableSort.Rows
Dim pRow As IRow
Set pRow = pCursor.NextRow
Do While Not pRow Is Nothing
e1 = pRow.value (3)
ss1 = pRow.value (5)
Set pRow = pCursor.NextRow
Loop
'Obtain the elevation and distance to the start point for the point right after dist2
pQueryFilter.whereClause = CONDITION2
With pTableSort
451
.Fields = "D_TO_S"
.Ascending ("D_TO_S") = True
Set .QueryFilter = pQueryFilter
Set .Table = fmytable
End With
pTableSort.Sort Nothing
Set pCursor = Nothing
Set pRow = Nothing
Set pCursor = pTableSort.Rows
Set pRow = pCursor.NextRow
If (Not pRow Is Nothing) Then
e2 = pRow.value (3)
ss2 = pRow.value (5)
Else
MsgBox "Something wrong!"
Exit Sub
End If
'Finding 3-D points between dist1 and dist2
pQueryFilter.whereClause = CONDITION
With pTableSort
.Fields = "D_TO_S"
.Ascending ("D_TO_S") = True
Set .QueryFilter = pQueryFilter
Set .Table = fmytable
End With
pTableSort.Sort Nothing
Set pCursor = Nothing
Set pRow = Nothing
Set pCursor = pTableSort.Rows
Set pRow = pCursor.NextRow
Dim EE1 As Double
Dim nopoint As Boolean
If (Not pRow Is Nothing) Then
'Determining the elevation for the start point via linear interpolation
Dim difference1 As Double
difference1 = pRow.value (5) - ss1
If Abs (difference1) < 0.001 Then
EE1 = pRow.value (3)
Else
EE1 = e1 + (pRow.value (3) - e1) * (dist1 - ss1) / (pRow.value (5) - ss1)
End If
Else
'In case there is no point between dist1 and dist2, the whole road segment between
'dist1 and dist2 is assumed to be flooded
nopoint = True
Set newline = Nothing
If dist1 <= dist2 Then
myline.GetSubcurve dist1, dist2, False, newline
Set newfeature = newlinefeatureclass.CreateFeature
Set newfeature.Shape = newline
newfeature.value (2) = linemerge
newfeature.value (3) = dist1
452
newfeature.value (4) = dist2
newfeature.Store
'MsgBox "create line at position 1"
Exit Sub
Else
End If
End If
With pTableSort
.Fields = "D_TO_S"
.Ascending("D_TO_S") = False
Set .QueryFilter = pQueryFilter
Set .Table = fmytable
End With
pTableSort.Sort Nothing
Set pCursor = Nothing
Set pRow = Nothing
Set pCursor = pTableSort.Rows
Set pRow = pCursor.NextRow
Dim EE2 As Double
'Determining the elevation of the end point
If (Not pRow Is Nothing) Then
Dim difference2 As Double
difference2 = ss2 - pRow.value (5)
If Abs (difference1) < 0.001 Then
EE2 = pRow.value (3)
Else
EE2 = e2 - (e2 - pRow.value (3)) * (dist2 - ss2) / (ss2 - pRow.value (5))
End If
Else
'There is no point between dist1 and dist2 and shoule already be dealt with
Exit Sub
End If
'Start to identify flooded road segments for the road segment in the flood extent
'substart and subend are used to label the start and end points for the flooded segments
Dim substart As Double
Dim subend As Double
Dim previousrow As IRow
Dim currentrow As IRow
Dim afterrow As IRow
If EE1 < flood Then
'ss1 is the start point for the first flooded segment
substart = ss1
Else
'If ss1 is not the start point for the first flooded segment,
'the first point having elevation lower than the flood water level is identified
'the first point having elevation equaling to the flood water level is identified vai
'linear interpolation
With pTableSort
.Fields = "D_TO_S"
.Ascending ("D_TO_S") = True
Set .QueryFilter = pQueryFilter
453
Set .Table = fmytable
End With
pTableSort.Sort Nothing
Set pCursor = Nothing
Set pRow = Nothing
Set pCursor = pTableSort.Rows
Set pRow = pCursor.NextRow
If Not pRow Is Nothing Then
Set currentrow = pRow
Else
Exit Sub
End If
Do While (Not pRow Is Nothing)
If pRow.value (3) > flood Then
Set currentrow = pRow
Set pRow = pCursor.NextRow
Else
Exit Do
End If
Loop
If (Not pRow Is Nothing) Then
'afterrow indicates the first point having its elevation lower than the flood water level
Set afterrow = pRow
If (pRow Is currentrow) Then
'This indicates the start point is the point right before afterrow
substart = ss1 + (afterrow.value (5) - ss1) * (EE1 - flood) / (EE1 - afterrow.value (3))
Else
'This indicates the current row represents the point right before afterrow
Set previousrow = currentrow
If Abs(previousrow.value (3) - afterrow.value (3)) < 0.0001 Then
substart = previousrow.value (5)
Else
substart = previousrow.value(5) + (afterrow.value(5) - previousrow.value(5)) * (previousrow.value(3)
- flood) / (previousrow.value(3) - afterrow.value(3))
End If
End If
Else
'This indicates the failure to find a point having its elevation lower than the flood water level
'and therefore, the sub is ended. There is no flooded road segment
Exit Sub
End If
End If
'After identifying the sub start point, it continues to search for the sub end point
'tempRow is a variable used to store the current position of pRow
Dim tempRow As IRow
Set tempRow = pRow
Set pRow = pCursor.NextRow
If (Not pRow Is Nothing) Then
Set currentrow = pRow
Else
'Reaches the end
'use the ss2 point to get the flooded road segment
454
If EE2 <= flood Then
subend = ss2
Else
subend = tempRow.value(5) + (flood - tempRow.value(3)) * (ss2 - tempRow.value(5)) / (EE2 -
tempRow.value(3))
End If
'Creating a linear feature for the identified flooded road segment
If substart <= subend Then
myline.GetSubcurve substart, subend, False, newline
Set newfeature = newlinefeatureclass.CreateFeature
Set newfeature.Shape = newline
newfeature.value (2) = linemerge
newfeature.value (3) = substart
newfeature.value (4) = subend
newfeature.Store
Set newline = Nothing
Else
Exit Sub
End If
Exit Sub
End If
'It continues to find the first point with elevation higher than the flood water level
Do While (Not pRow Is Nothing)
If pRow.value (3) < flood Then
Set currentrow = pRow
Set pRow = pCursor.NextRow
'MsgBox "currentrow is not nothing" & currentrow.Value (5)
Else
Exit Do
End If
Loop
'Determining the sub end point, which has its elevation equaling to the flood water level
If (Not pRow Is Nothing) Then
Set afterrow = pRow
If (currentrow Is pRow) Then
Set previousrow = tempRow
Else
Set previousrow = currentrow
End If
'Set afterrow = pRow
If Abs(previousrow.value(3) - afterrow.value(3)) < 0.0001 Then
subend = afterrow.value(5)
Else
subend = previousrow.value(5) + (afterrow.value(5) - previousrow.value(5)) * (previousrow.value(3) -
flood) / (previousrow.value(3) - afterrow.value(3))
End If
'Creat a new line feature for the identified flooded road segment
If substart <= subend Then
myline.GetSubcurve substart, subend, False, newline
Set newfeature = newlinefeatureclass.CreateFeature
Set newfeature.Shape = newline
newfeature.value (2) = linemerge
455
newfeature.value (3) = substart
newfeature.value (4) = subend
newfeature.Store
'MsgBox "create line at position 2"
Set newline = Nothing
Else
End If
Else
'It indicates that it reaches the end, but doesn't find a point with elevation
'higher than the flood water level
'This means that ss2 and currentrow should be used to determine the flooded road segment
If EE2 <= flood Then
subend = ss2
Else
subend = currentrow.value(5) + (flood - currentrow.value(3)) * (ss2 - currentrow.value(5)) / (EE2 -
currentrow.value(3))
End If
If substart <= subend Then
myline.GetSubcurve substart, subend, False, newline
Set newfeature = newlinefeatureclass.CreateFeature
Set newfeature.Shape = newline
newfeature.value (2) = linemerge
newfeature.value (3) = substart
newfeature.value (4) = subend
newfeature.Store
Set newline = Nothing
Else
End If
Exit Sub
End If
'Continue the loops to find the next flooded road segment
Do While (Not pRow Is Nothing)
Set currentrow = pRow
Set pRow = pCursor.NextRow
Do While (Not pRow Is Nothing)
If pRow.value(3) > flood Then
Set currentrow = pRow
Set pRow = pCursor.NextRow
Else
Exit Do
End If
Loop
If (Not pRow Is Nothing) Then
Set previousrow = currentrow
Set afterrow = pRow
If Abs(previousrow.value(3) - afterrow.value(3)) < 0.0001 Then
substart = previousrow.value(5)
Else
substart = previousrow.value(5) + (afterrow.value(5) - previousrow.value(5)) * (previousrow.value(3) -
flood) / (previousrow.value(3) - afterrow.value(3))
End If
Set currentrow = pRow
456
Else
If EE2 < flood Then
subend = ss2
substart = currentrow.value(5) + (flood - currentrow.value(3)) * (ss2 - currentrow.value(5)) / (EE2 -
currentrow.value(3))
If substart <= subend Then
myline.GetSubcurve substart, subend, False, newline
Set newfeature = newlinefeatureclass.CreateFeature
Set newfeature.Shape = newline
newfeature.value (2) = linemerge
newfeature.value (3) = substart
newfeature.value (4) = subend
newfeature.Store
Set newline = Nothing
Else
End If
Else
End If
Exit Sub
End If
Set pRow = pCursor.NextRow
If pRow Is Nothing Then
If ss2 <= flood Then
subend = ss2
Else
subend = currentrow.value(5) + (ss2 - currentrow.value(5)) * (flood - currentrow.value(3)) / (EE2 -
currentrow.value(3))
End If
Set newline = Nothing
If substart <= subend Then
myline.GetSubcurve substart, subend, False, newline
Set newfeature = newlinefeatureclass.CreateFeature
Set newfeature.Shape = newline
newfeature.value (2) = linemerge
newfeature.value (3) = substart
newfeature.value (4) = subend
newfeature.Store
Set newline = Nothing
Exit Sub
Else
End If
Else
Do While (Not pRow Is Nothing)
If pRow.value (3) < flood Then
Set currentrow = pRow
Set pRow = pCursor.NextRow
Else
Exit Do
End If
Loop
End If
If Not pRow Is Nothing Then
Set previousrow = currentrow
457
Set afterrow = pRow
If Abs(previousrow.value (3) - afterrow.value (3)) < 0.0001 Then
subend = afterrow.value(5)
Else
subend = previousrow.value(5) + (afterrow.value(5) - previousrow.value(5)) * (previousrow.value(3) -
flood) / (previousrow.value(3) - afterrow.value(3))
End If
Else
If EE2 > flood Then
subend = currentrow.value(5) + (ss2 - currentrow.value(5)) * (flood - currentrow.value(3)) / (EE2 -
currentrow.value(3))
Else
Exit Sub
End If
End If
Set newline = Nothing
If substart <= subend Then
myline.GetSubcurve substart, subend, False, newline
Set newfeature = newlinefeatureclass.CreateFeature
Set newfeature.Shape = newline
newfeature.value (2) = linemerge
newfeature.value (3) = substart
newfeature.value (4) = subend
newfeature.Store
Set newline = Nothing
Else
End If
Loop
End Sub
Các file đính kèm theo tài liệu này:
- 1.pdf