Before tackling this tutorial, you will need to download and install a dataset following these instructions:
Create a folder called dam somewhere under your personal directory (e.g. C:\Users\jdoe\Documents\Tutorials\dam\).
Download the data for this exercise then extract the contents of dam.zip into your newly created dam folder.
In this tutorial, you'll use GIS tools to:
Reconstruct the impounded headwater of the Sebasticook River as it existed before the 2008 removal of the Fort Halifax Dam in Winslow, Maine (USA).
Learn how to estimate the length and volume of the headwater that was formerly retained behind the dam.
This exercise introduces key GIS techniques for working with historical landscapes and water bodies, and highlights the role of GIS in environmental restoration and river management.
The 2008 removal of the Fort Halifax Dam in Winslow, Maine. (Source: NRCM)
Open the dam.aprx ArcGIS project file.
The map project includes two layers: a polyline layer, Dam.shp, representing the Fort Halifax Dam prior to its removal, and a LIDAR-derived digital elevation model, Elevation.tif, depicting the Sebasticook River area with its current water level following the dam's removal. A World Imagery basemap is added for reference.
To reconstruct the impounded water level, we first need to estimate the typical elevation of the water retained behind the dam prior to its removal. The crest of the Fort Halifax Dam stood at approximately 20 meters above mean sea level (MSL). For this exercise, we’ll assume a representative impounded water level of 15 meters above MSL, reflecting a typical operating level below the dam crest.
A straightforward way to visualize the 15-meter water level is to adjust the symbology of the elevation layer from a stretched color ramp to a classified scheme. In this scheme, one class should represent all pixel values at or below 15 meters, effectively highlighting the area that would have been submerged behind the dam.
In the Contents pane, select the Elevation.tif layer.
In the Raster Layer ribbon, bring up its Symbology pane.
Set the Symbology scheme to Classify.
Set the upper value of the first class to 15 (the water level we are simulating in this example).
Assign a blue color to this class' color swatch. In this example a Sodalite Blue color is selected.
Changing the symbology provides a clear visual indication of the areas upstream of the dam that would be flooded using the 15-meter water level criterion. However, it also highlights all areas in the map with elevation values below 15 meters--even those that are not hydraulically connected to the upstream portion of the Sebasticook River. This includes parts of the Kennebec River (which the Sebasticook flows into) as well as other low-lying regions within the study area that are disconnected from the impounded water body.
To refine our analysis, we will create a mask that limits the flooded area to pixels with elevation values ≤ 15 meters and that are directly connected to the impounded section of the river. You will be guided through that process in later steps.
Before we can build this mask, however, we need to embed the dam’s height into the elevation raster. This step is essential because the dam will act as a barrier, restricting the simulated impoundment to one side, upstream, of the structure.
In the Analysis ribbon, open the geoprocessing pane
In the Geoprocessing pane, search for, then select the Feature to Raster tool.
The conversion tool will require that you specify what values will be assigned to the pixels. This value cannot be directly inputted into the Value field. Instead, the tool requires that an existing field in the vector layer be selected as input.
In this case, the Dam.shp layer includes a Height field, which we'll use as the input. If the layer did not contain a suitable field, you could simply add one to the attribute table before performing the polyline-to-raster conversion.
Set the input feature to dam, the Value field to Height and save the output to dam_rast.tif.
Important: If you're saving the raster as a .tif file, make sure to store it in the ./dam folder rather than inside the dam.gdb geodatabase, which is reserved for geodatabase formats.
Before running the geoprocess, click on the Environments tab.
We will want to make sure that the newly generated raster adopt the same pixel size and snapping environment as that of the elevation raster.
Under the Environments tab, set the Cell Size and Snap Raster fields to the Elevation.tif layer.
Click Run to complete the geoprocess.
If the dam raster layer was not added to the Contents pane, add it now.
Zoom in on the dam feature.
Turn off the dam vector layer to reveal the rasterized version of the layer.
You should now see a pixelated representation of the dam polyline.
Next, we'll combine the dam raster with the elevation raster.
In the Geoprocessing pane, search for and open the Raster Calculator tool.
Depending on your ArcGIS license level, you may see two versions of this tool—one from the Image Analysis toolset and another from the Spatial Analyst toolset. Both versions function identically. To maintain consistency with previous tutorials, we will use the version from the Spatial Analyst toolset.
In the expression box, type Con(IsNull( "dam_rast.tif"), "Elevation.tif", "dam_rast.tif")
Note that the Con() function name is case sensitive (the "C" is upper case).
Name the output elev2.tif. Be sure to save it in the dam/ folder and not the dam.gdb geodatabase.
Before running the geoprocess, click on the Environments tab.
Under the Environments tab, click on the yellow Extent icon and select Elevation.tif.
This ensures that the output raster covers the same extent as that of the original elevation raster.
Set the Cell Size and Snap Raster fields to Elevation.tif.
Click on Run to complete the geoprocess.
The IsNull() function checks each pixel in dam_rast.tif to determine whether it contains a NoData value. The Con() function then evaluates the result of IsNull(). If a pixel in dam_rast.tif is NoData (i.e., IsNull returns TRUE), the corresponding pixel value from Elevation.tif is used in the output raster. Otherwise, if the pixel in dam_rast.tif contains a valid value (IsNull returns FALSE), that value is retained.
Once the new elevation raster is added to the Contents pane, you might need to change its symbology to view the embedded dam elevation.
Now that the dam is embedded in the elevation raster, we can proceed with the creation of the raster mask.
In the geoprocessing pane, open the Raster Calculator tool. You might need to clear the expression from the previous operation.
Set the new expression to SetNull( "Elevation.tif" <= 15, 1) and name the output mask.tif. Note the upper case "S" and "N".
There is no need to change the Environment settings. Simply click on Run to complete the geoprocess.
The SetNull() function assigns a NoData value to raster cells where the specified condition evaluates to TRUE. In this expression, any pixel in Elevation.tif with a value less than or equal to 15 is set to NoData, effectively masking areas that would have been submerged. For all other pixels (where the condition is FALSE), the output cell is assigned a value of 1.
The output should consist of a raster with with just one unique pixel value, 1. By default, pixels with NoData values are displayed as transparent (colorless).
The mask refers to the portion of the raster where pixels have valid values. This mask will serve as a spatial barrier in the next series of steps, helping to constrain analysis to areas with NoData pixel values.
In the next steps, we’ll generate a raster that assigns a distance value to each pixel within a defined study area measured from a selected input feature. To constrain the analysis, we’ll apply the previously generated mask. This ensures that the distance accumulation raster is computed only within the intended boundary, thus preventing distance values from being assigned outside the masked extent.
The Distance Accumulation tool automatically limits its output to contiguous pixels, stopping at boundaries defined by non-null cells in the mask. This behavior helps simulate realistic flow or proximity patterns within the impounded area.
In the geoprocessing pane, search and open the Distance Accumulation tool.
The first input parameter for the Distance Accumulation tool is the feature from which distances will be calculated. In this case, that feature would naturally be the dam polyline. While the dam polyline might seem like the natural choice, using the entire line would cause the tool to compute distances on both sides of the dam, rather than just upstream, where impoundment occurred.
Since the elev2.tif raster already represents the dam as a boundary, we’ll instead create a point feature located on the upstream side of the dam and use that point as the source for distance calculation. Although it’s also possible to use a polyline drawn along the upstream side of the dam, the improvement in accuracy would be minimal for this application.
In the Distance Accumulation tool, to the right of the Input Raster or Feature Sources field, click on the little pencil icon and select Points.
You will now enter edit mode. By default, the new point layer will be saved in the dam.gdb geodatabase. While it could be saved as a shapefile, we won’t worry about the file type since this will be a temporary layer.
While in edit mode:
You can zoom in and out by scrolling the middle mouse wheel.
You can pan around the map by pressing and holding the middle mouse wheel.
These navigation tools will help you accurately place the point feature on the upstream side of the dam.
Zoom in somewhere close to the west side of the dam.
Place a point as close to the dam as possible (within one or two pixels from the dam).
If you are happy with its placement, click the green check mark. If not, press ctrl + Z to start over.
Set the output raster name to dist.tif (be sure not to save it in the geodatabase since this is a .tif file), and set the Input Raster or Feature Barriers to mask.tif.
Click on the Environments tab to change some of its settings.
Under the Environments tab, click on the Extent pull-down menu and select Elevation.tif.
This ensures that the distance accumulation raster will be computed for the entire elevation extent.
Set the Cell Size and Snap Raster to Elevation.tif.
Click Run to complete the geoprocess.
The Distance Accumulation tool includes a Geodesic option in its Distance Method parameter. This option is recommended when the map projection used does not preserve distance well, as it calculates distances over the Earth's surface rather than in a planar coordinate system. However, be aware that enabling the geodesic method can significantly increase processing time, especially when working with large raster datasets.
The distance raster displays the calculated distance from the point feature to each pixel, using the same units as the map’s projection. In this exercise, the projection uses meters as its unit of measurement, so the output distance values are expressed in meters.
The furthest extent of the distance raster (where pixel values reach approximately 7,159 meters) defines the upstream boundary of the impoundment based on the 15-meter water level set earlier in this exercise. Beyond this point, the river’s elevation is naturally higher and unaffected by the presence or removal of the dam.
The distance raster not only represents proximity to the source point, but also ensures that the output remains spatially contiguous. This helps exclude areas with elevations below the 15-meter threshold that are not hydraulically connected to the impoundment. As a result, the delineation of the impounded water body is more realistic, which in turn leads to a more accurate volume estimate in the next step.
Before computing the volume, we’ll create a new raster based on the distance raster, in which all pixel values are assigned the dam water level established at the beginning of this exercise (15 meters).
In the geoprocessing window, open the Raster Calculator.
Type the dam water level value, 15, in the expression box.
Name the output raster impounded.tif.
Click on the Environments tab.
Since no existing data layer (raster or vector) is used as input, the Raster Calculator tool will not automatically assign a coordinate system to the new raster. As a result, the output will default to an unknown coordinate system. To ensure spatial consistency, we’ll explicitly set the coordinate system for the output raster in the Environments tab of the tool.
Under the Output Coordinate System field, click on the pulldown menu and select Current Map. This will assign the map frame's coordinate system to the output raster.
Next, set the Extent to dist.tif.
Likewise, set the Cell Size and the Mask to dist.tif.
Click Run.
The output raster will cover the exact same extent as that of the dist.tif raster. But, instead of providing us with distance pixel values, it gives us elevation values.
Next, we'll compute the difference in volume between the impounded waters and the current water level.
Search for, then open the Cut Fill tool in the Geoprocessing pane.
Set the before raster layer to impoundment.tif.
Set the after raster layer to Elevation.tif.
Name the output volume.tif.
Click Run.
Note that the Z Factor is a conversion multiplier applied to raster cell values when the elevation units differ from the map’s horizontal units. In this example, both elevation and map units are in meters, so the Z Factor should be set to 1.
The output volume raster should have its symbology automatically applied. It categorizes pixels into three conditions:
Net Gain: areas where volume has increased,
Unchanged: areas with no change in volume,
Net Loss: areas where volume has decreased.
Right-click on the volume.tif layer and select Attribute Table from the pull-down menu.
The attribute table lists pixel counts associated with each value in the raster. Additional fields are automatically added, including a Volume column, which shows the total volume associated with each unique pixel value. In this example, the vast majority of pixels, 1,251,781 in total, contrube to a total change in volume of 2,840,193 cubic meters, which is roughly equivalent to 760 Olympic-sized swimming pools.
It’s important to note that the pixel value itself is not meaningful in terms of elevation or volume. Instead, it serves as a categorical label to group pixels that exhibit a similar change--such as gain, no change, or loss--in volume. A few scattered pixels may show no change in volume and are assigned different values accordingly.
Also, keep in mind that the actual volume values are not stored within the raster file. They are calculated during geoprocessing and added to the attribute table. These additional attributes are saved in the accompanying volume.tif.vat.dbf file.
This wraps up the tutorial.