Creating watersheds around solar facilities in Germany

I am looking for your advice with regard to running the DelineateIt module in order to create watersheds for the SDR and Water Yield models.
For my project, I am modelling ecosystem services of different land management practices at solar facilities in North-Eastern Germany. A total of 57 solar polygons have been mapped based on Google Satellite and OSM.
The DelineatIT model is run with two options:
Option 1: “Detect Pour Points” = yes.
Option 2: “Detect Pour Points” = no. A vector file with the 57 solar polygons serves as watershed outlets.
When comparing the watersheds, option 2 creates extremely small watersheds around the 57 solar polygons while option 1 creates large watersheds for the entirety of the study region.
When subsequently running the SDR model, the sediment export values differ roughly by factor 100 between options 1 and 2 (export values for option 2 are smaller) although the percentage differences are approximately in line.

Which option would you recommend to use in my study, 1 or 2?

I am attaching the DelineatIT logfiles here:

DelineateIT Log file option 1:
InVEST-natcap.invest.delineateit.delineateit-log-2023-04-11–14_11_26.txt (1.7 MB)

DelinateIT Log file option 2
InVEST-natcap.invest.delineateit.delineateit-log-2023-04-14–18_25_16.txt (29.6 KB)

@aludzuweit,

The choice depends on what you’re interested in modeling.
In general, if you provide watershed outlets, I’d expect them to be features that benefit from the service provided by the watershed. For example, a population center can benefit from sediment retention happening upstream. It’s not clear to me what service each watershed provides to the solar facility.

If you’re interested in modeling the impact of the solar facility, you don’t need to know the solar facility’s watershed. Instead you’d look at the impact of the solar facility on a larger watershed. You could provide watershed outlets corresponding to features likely to be affected - such as a local stream or town. Make sure that your DEM is large enough to include the entire watershed. If the 57 facilities do not all fall within the same watershed, maybe model them separately.

Thank you @esoth, this is very helpful!

My project is about agrivoltaics which means combining agriculture and solar PV on the same plot of land. The study aims to identify how more sustainable land management practices under the solar panels (for example combining agriculture with flowering strips and trees on parts of the land) could help to avoid soil erosion, lead to more efficient water use and increase pollinators. You are right in that the entire watershed would benefit from these more sustainable land management practices rather than just the land under the solar panels so modelling based on the larger watershed is likely more accurate.

I’ll consider modelling the solar farms per watershed if I have enough time. Right now, all 57 solar farms are situated in 5 different watersheds and modelled together. By the way, what is your recommendation for creating sub-watersheds as DelinateIT does not offer this functionality currently?

Hello @aludzuweit , you are right that DelineateIt does not currently create subwatersheds, although we are planning on adding this functionality in a future release of InVEST. Until it does, you can still use a little python scripting to create subwatersheds from a DEM.

If you create an environment with either conda or mamba like so:

mamba create -p ./env310 -c conda-forge "python=3.10" pygeoprocessing
mamba activate ./env310

You can then run the following python code to create subwatersheds:

import logging

import pygeoprocessing.routing

logging.basicConfig(level=logging.DEBUG)
DEM = 'DEM_gura.tif'
MY_FLOW_ACCUM_THRESHOLD = 1000

filled_dem_path = 'filled_dem.tif'
pygeoprocessing.routing.fill_pits((DEM, 1), filled_dem_path)

flow_dir_path = 'flow_direction_d8.tif'
pygeoprocessing.routing.flow_dir_d8((filled_dem_path, 1), flow_dir_path)

flow_accum_path = 'flow_accumulation_d8.tif'
pygeoprocessing.routing.flow_accumulation_d8(
    (flow_dir_path, 1), flow_accum_path)

strahler_streams_path = 'strahler_streams.gpkg'
pygeoprocessing.routing.extract_strahler_streams_d8(
    (flow_dir_path, 1), (flow_accum_path, 1), (filled_dem_path, 1),
    strahler_streams_path,
    min_flow_accum_threshold=MY_FLOW_ACCUM_THRESHOLD,
    river_order=5,
    min_p_val=0.05,
    autotune_flow_accumulation=False)

subwatersheds_path = 'subwatersheds.gpkg'
pygeoprocessing.routing.calculate_subwatershed_boundary(
    (flow_dir_path, 1), strahler_streams_path, subwatersheds_path,
    max_steps_per_watershed=1000000,
    outlet_at_confluence=False)

DEM is the path to your DEM (I used the sample DEM from SDR).
MY_FLOW_ACCUM_THRESHOLD is the flow accumulation threshold required before a stream tributary is formed. 1 subwatershed is formed per tributary.

The parameters for the functions are described in the pygeoprocessing routing API documentation: pygeoprocessing.routing.routing module — PyGeoprocessing 2.4.0.post0+gc3296f7.d20230328 documentation

Let us know if you have any questions!
James

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