I would like to create a simple floodplain map. I have LiDAR data with 1 meter accuracy. I have clipped it to a small area of interest that my computer can handle processing the LiDAR. I want to create contours based on a specific river, where flooding is likely to occur. That way I can create map with intervals of 1 foot above river, 2 feet above river...etc. The problem is using the contour tool, you can't base them off a polyline, only a base elevation. This is not useful since as rivers descend, the "base" elevation will change. I am using ArcMap 10.6.

Is this possible to do?

  • I think ESRI help has the answer support.esri.com/en/technical-article/000015264
    – Mapperz
    Jun 4, 2019 at 20:52
  • Hi, this link is just to create contours. I am specifically needing to create contours relative to a polyline (river). I need lines that are based off this polyline, not just a DEM.
    – sparky
    Jun 4, 2019 at 21:26
  • 2
    You could try getting the elevation of the river with Add Surface Information, build a terrain based on the 3d polygon, export the terrain to raster then using your existing DEM as Snap Raster, Cell Size and Extent environment settings execute Euclidean Allocation then Minus the Allocation from the DEM to flatten the DEM to the elevation of the raster, from the flattened raster create contours as normal from base 0 and they should be somewhat close to the elevation above the closest point in the river. Jun 4, 2019 at 23:03
  • 2
    Does the polyline follow the thalweg? Do you have cross-sectional profiles? Jun 5, 2019 at 3:05
  • 1
    Thanks all for the suggestions. I am first going to try to use the Whitebox GAT Toool Elevation Above Stream, if this doesn't work then I will try what @MichaelStimson suggested. Will post how it goes. The polyline was created using standard ArcGIS watershed mapping techniques, using the LiDAR DEM. I do not have cross sectional profiles.
    – sparky
    Jun 5, 2019 at 13:52

2 Answers 2


These workflow:

arcpy.InterpolateShape_3d(in_surface="dem", in_feature_class="STREAMS", out_feature_class="C:/SCRATCH/streams3d.shp", sample_distance="", z_factor="1", method="BILINEAR", vertices_only="DENSIFY", pyramid_level_resolution="0")
arcpy.SplitLine_management(in_features="streams3d", out_feature_class="C:/SCRATCH/bits3d.shp")
arcpy.Adjust3DZ_management(in_features="bits3d", reverse_sign="NO_REVERSE", adjust_value="2", from_units="", to_units="")
arcpy.AddZInformation_3d(in_feature_class="bits3d", out_property="Z_MEAN", noise_filtering="NO_FILTER")
arcpy.gp.EucAllocation_sa("bits3d", "C:/SCRATCH/EA", "", "", "1", "FID", "", "")
arcpy.AddField_management(in_table="EA", field_name="FLOOD_L", field_type="DOUBLE", field_precision="", field_scale="", field_length="", field_alias="", field_is_nullable="NULLABLE", field_is_required="NON_REQUIRED", field_domain="")
arcpy.AddJoin_management(in_layer_or_view="EA", in_field="VALUE", join_table="bits3d", join_field="FID", join_type="KEEP_ALL")
arcpy.CalculateField_management(in_table="EA", field="ea.vat:FLOOD_L", expression="[bits3d.Z_Mean]", expression_type="VB", code_block="")
arcpy.Lookup_3d(in_raster="EA", lookup_field="ea.vat:FLOOD_L", out_raster="C:/SCRATCH/LOOKUP")
arcpy.gp.RasterCalculator_sa('Con("LOOKUP" >= "dem","LOOKUP" - "dem")', "C:/SCRATCH/DEPTH")

is simplistic technique to compute flood extent for 2 m water level rise. Much better result can be achieved by replacing euclidean allocation with catchments of bits3d. Picture shows flood depths:

enter image description here


This worked for me: Create a raster covering the study area where all values = 0 except for the river of interest value = 1. Use this as stream input for Flow Distance in Spatial Analyst. This produces a DEM whose values are elevation above the river, and using this DEM can create contours based on that specific river.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.