Urban Flood risk mitigation model - data needs

Hello everyone,

I have three questions related to the data needed to run the Urban Flood Risk Model:

  1. Do I have to select all the watersheds that are completely within the area of study (in this case a LULC map of a city)? How many of them can I select? Please see the attached image.

  2. The “data needs” section of the user guide doesn’t mention a “soils hydrological group raster”, but it provides a link to download them. Also, the InVEST’s directory requires such raster. Should it cover the same area as the LULC?

  3. I understand from the InVEST directory that I should also insert the “depth of rainfall (mm)”. Should be this a number describing the annual average rainfall that occurs in my study area?

Thank you,
Marco

1 Like

Hi @marco.guzzetti, good questions. Here is some feedback, let us know if things are still confusing.

  1. To determine the area for analysis, the model first takes the intersection of the bounding boxes of the LULC, soilgroup raster, and watersheds vector. So you could provide the whole watershed layer that you show, and the bounding box of the LULC will limit the area of study. Or you could select only the watersheds you are interested in and let the watershed layer’s bounding box limit the study area.

  2. Thanks for pointing this out, looks like someone has made the update to the UG already: http://releases.naturalcapitalproject.org/invest-userguide/latest/urban_flood_mitigation.html#data-needs The model will limit analysis to areas that are covered by both the LULC and the soil group raster, see #1. But you do not need to do any pre-processing of the extent of the soil raster.

  3. No, I don’t think it is intended to be an annual average, but rather a total amount for a storm event. I found this in the User’s Guide appendix:

“Depth of rainfall event of interest (mm). To calculate the design storm, users can look up intensity-frequency-duration (IFD) tables available for their city. The storm duration is equal to the average time of concentration of the studied watersheds. Time of concentration can be derived from existing studies or from web tools: eg. https://www.lmnoeng.com/Hydrology/TimeConc.php. See Balbi et al. (2017) for a detailed description of these methods.”

Thank you @dave, very useful reply.

I have two other questions:

  1. I’m not sure how to convert hydraulic conductivity to soil hydrologic group. The provided link is not working (FutureWater’s Global Maps of Soil Hydraulic Properties Available – FutureWater), while, I don’t understand how to use table 2. Could you please provide more information about this?

  2. Depth of rainfall: I’ve found an article that says that in my study area (Johannesburg - South Africa) a storm produced 500mm of rain (although I don’t know the duration of the storm). Do you think that I can use that number?

As always, thank you for your help.

Marco

Hi @marco.guzzetti -

While I don’t know much about the Urban Flood Risk model, I’m curious as to why the FutureWater link didn’t work for you. They do not provide a direct download on that web page, you need to email them and request the dataset. The dataset does contain soil hydrologic groups (1/2/3/4 etc), I use this layer frequently for the Seasonal Water Yield model, which also incorporates curve number.

~ Stacie

Thanks for chiming in Stacie!

As for the depth of rainfall number…I’m not a hydrologist, but my experience with modelling suggests you should just try it! You can always re-run the model with a different number, or even systematically try a lots of different values and observe how “sensitive” the results are to this parameter.

Hello @swolny,

thanks for your intervention. Maybe I wasn’t clear and I apologize for that. I’m not saying that I cannot download the dataset (I emailed them and I received it within a few hours). What I’m saying is that in the InVEST guidelines there’s a link that could help to convert hydraulic conductivity to soil hydrologic groups (see image)

It seems to me that the dataset from FutureWater should be converted in some ways, but I’m not sure how.

Thanks in advance.

Marco

Cheers @dave, I’ll try that!

Hi Marco -

I’m not sure how FutureWater is packaging their data nowadays (I received it a year ago), but mine contains an already-prepared layer called Hydrologic_Soil_Group.tif - does yours have this layer?

If so, this raster has values of 1/2/3/4/14/24/34. The model requires only values of 1/2/3/4, so you would first need to combine any values of 14, 24 or 34 into one of the allowed values. The USDA has this advice for that:

For soils in groups A/D, B/D, or C/D, the first letter applies to the drained condition and the second applies to the undrained condition. Which single group to use may depend on the area in question. For example, on a watershed basis, group D would likely be the best choice. On the other hand, for a specific site or field, the appropriate choice of hydrologic soil group would depend on whether or not the site has been drained.

Once you have a raster with values only 1/2/3/4, that is (I believe, if it’s like our Seasonal Water Yield model - @dave? ) the layer that goes into the model. This raster will be combined with the CN values in the biophysical table to compute runoff. For example, CN_A in the biophysical table corresponds with the Curve Number for the combination of each land cover type + hydrologic soil group A (which = value 1 in the raster, I’m not sure why we do 1 in the raster and A in the table, the Seasonal water Yield model does as well, it’s confusing.)

I’m interpreting the Urban Flood guide as giving guidance for creating the Hydrologic_Soil_Group raster if you don’t already have it provided (like FutureWater does), but need to create it and do have hydraulic properties data. Personally, I’m confused about the reference to FutureWater’s data, since hopefully they still provide Hydrologic_Soil_Group.tif, in which case you shouldn’t need to do the translation provided in the table you reference.

Hopefully I haven’t just made things more confusing. If anything I’ve said is incorrect relative to the Urban Flood model, someone please correct me!

~ Stacie

1 Like

Hi @swolny,

first of all, thank you for your time! I checked my raster and it’s like what you are saying. I was a bit confused because from the guidelines I understood that that layer shows " hydraulic conductivity" but that’s not the case since it already provides the hydrologic soil groups.

Again, sorry for all this mess but you helped me to clarify my doubts. Thanks for that!

Marco

@marco.guzzetti and @swolny, from your experience now (which is more than mine) can you confirm that this is an accurate re-phrasing of that guidance in the User’s Guide table? If so, I’ll update the User’s Guide.

Soil groups are determined from hydraulic conductivity and soil depths. FutureWater has created a global map of hydraulic conductivity and of soil hydrologic groups (available at: http://www.futurewater.eu/2015/07/soil-hydraulic-properties/). If soil group data is not directly available, Table 2 below can be used to convert soil conductrivity into soil groups. Otherwise, look for guidance online, e.g.: http://www.bwsr.state.mn.us/outreach/eLINK/Guidance/HSG_guidance.pdf

the final link goes nowhere, so we’ll strike it unless someone knows where that pdf lives.

Hey @dave -

That seems more accurate to me. I’d like to add a bit more information, and another data source. Something like this:

Two global layers of hydrologic soil group are available, from FutureWater (available at: http://www.futurewater.eu/2015/07/soil-hydraulic-properties/) and ORNL-DAAC’s HYSOGs250m (available at https://daac.ornl.gov/SOILS/guides/Global_Hydrologic_Soil_Group.html.)

The FutureWater raster provides numeric group values 1-4, 14, 24 and 34. The Urban Flood Risk model requires only values of 1/2/3/4, so you need to convert any values of 14, 24 or 34 into one of the allowed values.

HYSOGs250m provides letter values A-D, A/D, B/D, C/D and D/D. For use in this model, these letter values must be translated into numeric values, where A = 1, B = 2, C = 3 and D = 4. Again, pixels with dual values like A/D, B/D etc must be converted to a value in the range of 1-4 as required by the model.

If soil group data is not directly available, soil groups may also be determined from hydraulic conductivity and soil depths. FutureWater’s Soil Hydraulic Properties dataset also contains hydraulic conductivity, as may other soil databases. Table 2 below can be used to convert soil conductivity into soil groups.

Whatever information is added to the Urban Flood chapter, I’d also like to add to the Seasonal Water Yield chapter.

~ Stacie

Hi @dave,

I’m not such a great expert but I agree with @swolny. Speaking as a user I think that her suggestion would have helped me to avoid a little bit of confusion.

Thank you for your support! Stay safe and have a very nice weekend.

Marco

Hello @dave, I see the catation Balbi et al. (2017) , but there is no detailed information for it, could you please give me more information about the reference? I am confused about the concept of “Depth of rainfall event of interest (mm)”. Thank you very much!

Hi @KaixuanDai,

I also tried to find what the Balbi et al. (2017) might be referring to but it isn’t clear. I’ll try and find out the reference.

I think that depth of rainfall is the measured rain total for a given simulated storm. So if you wanted to model the effects of a 10mm rainfall event or a 20mm rainfall event, that’s the number you would be putting in here.

Cheers,

Doug

1 Like

Hi @dcdenu4

I find that paper maybe as:

de Oliveira Nascimento, N., Balbi, D. A. F., & Naghettini, M. (2000). Modeling the Time Distributions of Heavy Storms-Design Hyetographs. In Building Partnerships (pp. 1-10).

I think the depth of one rainfall event could be derived from the Intensity-Duration-Frequency curve (IDF Curve).

Thanks for you reply!

Kaixuan Dai

Hi, I have a similar problem with processing my soil group raster dataset. When I run the model, the error that I get is that "a value in my raster is outside the range of (1,2,3,4). I have read the responses in this thread over and over. I have used the reclassify raster function and the raster calculator to classify all values >4 as null, in two separate instances. The solution that is proposed above, of reclassifying NODATA to 7 does not seem to work for my data. Currently, my raster has these values (1,2,3,4,NODATA) showing up. What could I be doing wrong please?

Here is my log and my soil group dataset.

2022-02-27 21:11:16,930 (natcap.invest.utils) utils.prepare_workspace(162) Level 100 Writing log messages to C:\Users\slebu\Documents\urban_flood_risk_mitigation_workspace\InVEST-Urban-Flood-Risk-Mitigation-log-2022-02-27–21_11_16.txt
2022-02-27 21:11:16,932 (natcap.invest.ui.model) model._logged_target(1643) Level 100 Starting model with parameters:
Arguments for InVEST natcap.invest.urban_flood_risk_mitigation 3.10.1:
aoi_watersheds_path C:/Users/slebu/OneDrive/Documents/INVEST/watershed/projected dare watershed/dare_projected_watershed.shp
built_infrastructure_vector_path C:/Users/slebu/OneDrive/Documents/INVEST/buildfootprint/Shape/buildings_dare.shp
curve_number_table_path C:/Users/slebu/OneDrive/Documents/INVEST/biophysical_table_3.csv
infrastructure_damage_loss_table_path C:/Users/slebu/OneDrive/Documents/INVEST/buildfootprint/Shape/buildfootprint2.csv
lulc_path C:/Users/slebu/OneDrive/Documents/ArcGIS/Projects/MyProject9/landcover_Clip.tif
n_workers -1
rainfall_depth 152.4
results_suffix dryrun11
soils_hydrological_group_raster_path C:/Users/slebu/OneDrive/Documents/ArcGIS/Projects/MyProject16/setnull_soil.tif
workspace_dir C:\Users\slebu\Documents\urban_flood_risk_mitigation_workspace

2022-02-27 21:11:16,934 (natcap.invest.validation) validation._wrapped_validate_func(1026) DEBUG Using ARG_SPEC for validation
2022-02-27 21:11:16,934 (natcap.invest.validation) validation._wrapped_validate_func(1030) INFO Starting whole-model validation with ARGS_SPEC
2022-02-27 21:11:16,934 (natcap.invest.validation) validation.timeout(716) DEBUG Starting file checking thread with timeout=5
2022-02-27 21:11:16,993 (natcap.invest.validation) validation.timeout(727) DEBUG File checking thread completed.
2022-02-27 21:11:16,993 (natcap.invest.validation) validation.timeout(716) DEBUG Starting file checking thread with timeout=5
2022-02-27 21:11:17,035 (natcap.invest.validation) validation.timeout(727) DEBUG File checking thread completed.
2022-02-27 21:11:17,035 (natcap.invest.validation) validation.timeout(716) DEBUG Starting file checking thread with timeout=5
2022-02-27 21:11:17,040 (natcap.invest.validation) validation.timeout(727) DEBUG File checking thread completed.
2022-02-27 21:11:17,040 (natcap.invest.validation) validation.timeout(716) DEBUG Starting file checking thread with timeout=5
2022-02-27 21:11:17,041 (natcap.invest.validation) validation.timeout(727) DEBUG File checking thread completed.
2022-02-27 21:11:17,041 (natcap.invest.validation) validation.timeout(716) DEBUG Starting file checking thread with timeout=5
2022-02-27 21:11:17,063 (natcap.invest.validation) validation.timeout(727) DEBUG File checking thread completed.
2022-02-27 21:11:17,063 (natcap.invest.validation) validation.timeout(716) DEBUG Starting file checking thread with timeout=5
2022-02-27 21:11:17,559 (natcap.invest.validation) validation.timeout(727) DEBUG File checking thread completed.
2022-02-27 21:11:17,559 (natcap.invest.validation) validation.timeout(716) DEBUG Starting file checking thread with timeout=5
2022-02-27 21:11:17,586 (natcap.invest.validation) validation.timeout(727) DEBUG File checking thread completed.
2022-02-27 21:11:17,654 (natcap.invest.validation) validation._wrapped_validate_func(1067) DEBUG Validation warnings: []
2022-02-27 21:11:17,691 (pygeoprocessing.geoprocessing) geoprocessing.raster_calculator(396) INFO starting stats_worker
2022-02-27 21:11:17,692 (pygeoprocessing.geoprocessing_core) threading.run(870) DEBUG stats worker PID: 11040
2022-02-27 21:11:17,692 (pygeoprocessing.geoprocessing) geoprocessing.raster_calculator(402) INFO started stats_worker <Thread(Thread-349, started daemon 29452)>
2022-02-27 21:11:17,698 (pygeoprocessing.geoprocessing) geoprocessing.raster_calculator(498) ERROR exception encountered in raster_calculator
Traceback (most recent call last):
File “natcap\invest\urban_flood_risk_mitigation.py”, line 815, in _lu_to_cn_op
File “<array_function internals>”, line 5, in choose
File “numpy\core\fromnumeric.py”, line 429, in choose
File “numpy\core\fromnumeric.py”, line 57, in _wrapfunc
ValueError: invalid entry in choice array

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “pygeoprocessing\geoprocessing.py”, line 443, in raster_calculator
File “natcap\invest\urban_flood_risk_mitigation.py”, line 822, in _lu_to_cn_op
ValueError: invalid entry in choice array
Check that the Soil Group raster does not contain values other than (1, 2, 3, 4)
2022-02-27 21:11:17,700 (pygeoprocessing.geoprocessing) geoprocessing.raster_calculator(513) INFO Waiting for raster stats worker result.
2022-02-27 21:11:17,700 (pygeoprocessing.geoprocessing_core) threading.run(870) WARNING No valid pixels were received, sending None.
2022-02-27 21:11:17,700 (taskgraph.Task) Task.add_task(706) ERROR Something went wrong when adding task create Curve Number raster (1), terminating taskgraph.
Traceback (most recent call last):
File “natcap\invest\urban_flood_risk_mitigation.py”, line 815, in _lu_to_cn_op
File “<array_function internals>”, line 5, in choose
File “numpy\core\fromnumeric.py”, line 429, in choose
File “numpy\core\fromnumeric.py”, line 57, in _wrapfunc
ValueError: invalid entry in choice array

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “taskgraph\Task.py”, line 674, in add_task
File “taskgraph\Task.py”, line 1093, in _call
File “pygeoprocessing\geoprocessing.py”, line 443, in raster_calculator
File “natcap\invest\urban_flood_risk_mitigation.py”, line 822, in _lu_to_cn_op
ValueError: invalid entry in choice array
Check that the Soil Group raster does not contain values other than (1, 2, 3, 4)
2022-02-27 21:11:17,704 (natcap.invest.utils) utils.prepare_workspace(167) ERROR Exception while executing Urban-Flood-Risk-Mitigation
Traceback (most recent call last):
File “natcap\invest\urban_flood_risk_mitigation.py”, line 815, in _lu_to_cn_op
File “<array_function internals>”, line 5, in choose
File “numpy\core\fromnumeric.py”, line 429, in choose
File “numpy\core\fromnumeric.py”, line 57, in _wrapfunc
ValueError: invalid entry in choice array

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “natcap\invest\utils.py”, line 165, in prepare_workspace
File “natcap\invest\ui\model.py”, line 1649, in _logged_target
File “natcap\invest\urban_flood_risk_mitigation.py”, line 233, in execute
File “taskgraph\Task.py”, line 674, in add_task
File “taskgraph\Task.py”, line 1093, in _call
File “pygeoprocessing\geoprocessing.py”, line 443, in raster_calculator
File “natcap\invest\urban_flood_risk_mitigation.py”, line 822, in _lu_to_cn_op
ValueError: invalid entry in choice array
Check that the Soil Group raster does not contain values other than (1, 2, 3, 4)
2022-02-27 21:11:17,708 (natcap.invest.utils) utils.prepare_workspace(170) INFO Elapsed time: 0.78s
2022-02-27 21:11:17,709 (natcap.invest.utils) utils.prepare_workspace(173) INFO Execution finished

setnull_soil.tif (901.1 KB)

Hi @sarahlebu -

Thanks for posting your log file and soil raster. I’m looking at the raster, and there are many pixels with value 0, along with the rest that have values 1-4. I’m guessing that you tried to set NoData to 0, but the raster does not have a NoData value set. I’m not sure which GIS you’re using, but in ArcGIS you can use SetNull or Reclassify to set the NoData value (there are other ways as well). in QGIS, r.null might be the tool to use, but I don’t have experience with it. After setting the NoData value, verify it by looking at the raster Properties. You can also symbolize the raster by Unique values to make sure that 0 is not included in the valid raster values.

~ Stacie

Hi @swolny, thank you so much for your response. You are right that my data had 0 values that did not reclassify correctly to NoData. I use ArcGIS Pro. I found a solution in reclassifying all 0 values to nodata.

Thanks again

Uploading my updated raster here for others who might like to compare with the first one.
Reclass_recl2.tif (899.3 KB)

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.