Last active
September 26, 2024 05:16
-
-
Save giswqs/bf14ec5f4fd8ef80520d0885a95147c6 to your computer and use it in GitHub Desktop.
NFW drainage networks
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"id": "0", | |
"metadata": {}, | |
"source": [ | |
"[](https://colab.research.google.com/gist/giswqs/bf14ec5f4fd8ef80520d0885a95147c6)\n", | |
"\n", | |
"**Delineating Drainage Networks for Non-floodplain Wetlands**" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "1", | |
"metadata": {}, | |
"source": [ | |
"## Installation\n", | |
"\n", | |
"Uncomment and run the following cell to install necessary packages for this notebook." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"id": "2", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# %pip install \"leafmap[raster]\" geopandas" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "3", | |
"metadata": {}, | |
"source": [ | |
"## Import libraries" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"id": "4", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import os\n", | |
"import leafmap" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "5", | |
"metadata": {}, | |
"source": [ | |
"## Create interactive maps\n", | |
"\n", | |
"Specify the map center, zoom level, and height." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "6", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"m = leafmap.Map(center=[40, -100], zoom=4)\n", | |
"m.add_basemap(\"HYBRID\")\n", | |
"m.add_basemap(\"USGS 3DEP Elevation Index\", opacity=0.5)\n", | |
"m" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "7", | |
"metadata": {}, | |
"source": [ | |
"## Add gaging stations" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "742b8171", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"url = \"https://github.com/opengeos/datasets/releases/download/hydrology/usgs_gage_stations.csv\"\n", | |
"df = leafmap.csv_to_df(url)\n", | |
"print(f\"Number of stations: {len(df)}\")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "2ce86eee", | |
"metadata": {}, | |
"source": [ | |
"Randomly select 200 gaging stations to display on the map." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"id": "e43afcd7", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"df = df.sample(n=200, random_state=42).reset_index(drop=True)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "834ab213", | |
"metadata": {}, | |
"source": [ | |
"Add the gaging stations to the map." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "9276d2e7", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"m = leafmap.Map(center=[40, -100], zoom=4)\n", | |
"m.add_basemap(\"HYBRID\")\n", | |
"m.add_basemap(\"USGS 3DEP Elevation Index\", opacity=0.5)\n", | |
"m.add_basemap(\"FWS NWI Wetlands\")\n", | |
"m.add_basemap(\"USGS Hydrography\")\n", | |
"m.add_points_from_xy(df, x=\"Longitude\", y=\"Latitude\", layer_name=\"USGS Gage Stations\")\n", | |
"m" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"id": "998a9609", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"m.to_html(\"3dep_coverage.html\")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "9d1f8fa0", | |
"metadata": {}, | |
"source": [ | |
"You can check out the interactive map at https://apps.opengeos.org/3dep_coverage.html." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "13", | |
"metadata": {}, | |
"source": [ | |
"## Get watershed data\n", | |
"\n", | |
"Use the drawing tool to draw a polygon or place a marker on the map." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"id": "c163b409", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"if m.user_roi is not None:\n", | |
" geometry = m.user_roi_bounds()\n", | |
"else:\n", | |
" geometry = (-92.432145, 44.286116)\n", | |
" m.set_center(geometry[0], geometry[1], zoom=14)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "d3072dde", | |
"metadata": {}, | |
"source": [ | |
"Download NHD WBD HUC12 data." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "9ead51b9", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"gdf = leafmap.get_nhd(geometry, dataset=\"wbd12\")\n", | |
"huc12_id = gdf[\"huc12\"].values[0]\n", | |
"print(f\"HUC12 ID: {huc12_id}\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"id": "d426afc6", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"m.add_gdf(gdf, layer_name=\"WBD12\", info_mode=None)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "20", | |
"metadata": {}, | |
"source": [ | |
"## Download DEM\n", | |
"\n", | |
"Download a digital elevation model (DEM) for the watershed from the USGS 3DEP Elevation service. Convert the DEM to a Cloud Optimized GeoTIFF (COG)." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "21", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"dem = f\"{huc12_id}.tif\"\n", | |
"ds = leafmap.get_3dep_dem(\n", | |
" gdf, resolution=10, output=dem, dst_crs=\"EPSG:3857\", to_cog=True\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "22", | |
"metadata": {}, | |
"source": [ | |
"Display the DEM on the map." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "23", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"m.add_raster(dem, palette=\"terrain\", layer_name=\"DEM\")\n", | |
"m" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "24", | |
"metadata": {}, | |
"source": [ | |
"## Get DEM metadata" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"id": "25", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"metadata = leafmap.image_metadata(dem)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "e59d67ed", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"vmin, vmax = leafmap.image_min_max(dem)\n", | |
"print(f\"Min: {vmin}, Max: {vmax}\")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "28", | |
"metadata": {}, | |
"source": [ | |
"## Add colorbar" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "29", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"m.add_colormap(cmap=\"terrain\", vmin=int(vmin), vmax=int(vmax), label=\"Elevation (m)\")\n", | |
"m" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "30", | |
"metadata": {}, | |
"source": [ | |
"## Initialize WhiteboxTools\n", | |
"\n", | |
"Initialize the WhiteboxTools class." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"id": "31", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"wbt = leafmap.WhiteboxTools()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "32", | |
"metadata": {}, | |
"source": [ | |
"Check the WhiteboxTools version." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "33", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"wbt.version()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "36", | |
"metadata": {}, | |
"source": [ | |
"## Set working directory" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"id": "37", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"wbt.set_working_dir(os.getcwd())\n", | |
"wbt.verbose = False" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "38", | |
"metadata": {}, | |
"source": [ | |
"## Smooth DEM\n", | |
"\n", | |
"All WhiteboxTools functions will return 0 if they are successful, and 1 if they are not." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "39", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"wbt.feature_preserving_smoothing(dem, \"smoothed.tif\", filter=9)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "40", | |
"metadata": {}, | |
"source": [ | |
"Display the smoothed DEM and watershed boundary on the map." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "41", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"m = leafmap.Map()\n", | |
"m.add_raster(\"smoothed.tif\", palette=\"terrain\", layer_name=\"Smoothed DEM\")\n", | |
"m" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "42", | |
"metadata": {}, | |
"source": [ | |
"## Create hillshade" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "43", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"wbt.hillshade(\"smoothed.tif\", \"hillshade.tif\", azimuth=315, altitude=35)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "44", | |
"metadata": {}, | |
"source": [ | |
"Overlay the hillshade on the smoothed DEM with transparency." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"id": "45", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"m.add_raster(\"hillshade.tif\", layer_name=\"Hillshade\")\n", | |
"m.layers[-1].opacity = 0.6" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "50", | |
"metadata": {}, | |
"source": [ | |
"## Fill depressions" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "51", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"wbt.fill_depressions(\"smoothed.tif\", \"filled.tif\")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "56", | |
"metadata": {}, | |
"source": [ | |
"## Delineate flow direction" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "57", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"wbt.d8_pointer(\"filled.tif\", \"flow_direction.tif\")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "58", | |
"metadata": {}, | |
"source": [ | |
"## Calculate flow accumulation" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "59", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"wbt.d8_flow_accumulation(\"filled.tif\", \"flow_accum.tif\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "60", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"m.add_raster(\"flow_accum.tif\", layer_name=\"Flow Accumulation\", nodata=-32768, visible=False)\n", | |
"m" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "61", | |
"metadata": {}, | |
"source": [ | |
"## Extract streams" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "62", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"wbt.extract_streams(\"flow_accum.tif\", \"streams.tif\", threshold=1000)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 28, | |
"id": "63", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"m.add_raster(\"streams.tif\", layer_name=\"Streams\", visible=False)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "64", | |
"metadata": {}, | |
"source": [ | |
"## Calculate distance to outlet" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "65", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"wbt.distance_to_outlet(\n", | |
" \"flow_direction.tif\", streams=\"streams.tif\", output=\"distance_to_outlet.tif\"\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 30, | |
"id": "66", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"m.add_raster(\"distance_to_outlet.tif\", layer_name=\"Distance to Outlet\", visible=False)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "67", | |
"metadata": {}, | |
"source": [ | |
"## Vectorize streams" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "68", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"wbt.raster_streams_to_vector(\n", | |
" \"streams.tif\", d8_pntr=\"flow_direction.tif\", output=\"streams.shp\"\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "69", | |
"metadata": {}, | |
"source": [ | |
"The raster_streams_to_vector tool has a bug. The output vector file is missing the coordinate system. Use leafmap.vector_set_crs() to set the coordinate system." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 32, | |
"id": "70", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"leafmap.vector_set_crs(source=\"streams.shp\", output=\"streams.shp\", crs=\"EPSG:3857\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "71", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"m.add_shp(\n", | |
" \"streams.shp\", layer_name=\"Streams Vector\", style={\"color\": \"#ff0000\", \"weight\": 3}, info_mode=None\n", | |
")\n", | |
"m" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "75", | |
"metadata": {}, | |
"source": [ | |
"## Delineate the longest flow path" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "4607022e", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"wbt.basins(\"flow_direction.tif\", \"basins.tif\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "76", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"wbt.longest_flowpath(\n", | |
" dem=\"filled.tif\", basins=\"basins.tif\", output=\"longest_flowpath.shp\"\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "77", | |
"metadata": {}, | |
"source": [ | |
"Select only the longest flow path." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 36, | |
"id": "78", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"leafmap.select_largest(\n", | |
" \"longest_flowpath.shp\", column=\"LENGTH\", output=\"longest_flowpath.shp\"\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "79", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"m.add_shp(\n", | |
" \"longest_flowpath.shp\",\n", | |
" layer_name=\"Longest Flowpath\",\n", | |
" style={\"color\": \"#ff0000\", \"weight\": 3},\n", | |
")\n", | |
"m" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "80", | |
"metadata": {}, | |
"source": [ | |
"## Generate a pour point\n", | |
"\n", | |
"Use the drawing tool to place a pour point on the map." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 38, | |
"id": "81", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"if m.user_roi is not None:\n", | |
" m.save_draw_features(\"pour_point.shp\", crs=\"EPSG:3857\")\n", | |
"else:\n", | |
" coords = [-92.370558, 44.221075]\n", | |
" leafmap.coords_to_vector(coords, output=\"pour_point.shp\", crs=\"EPSG:3857\")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "82", | |
"metadata": {}, | |
"source": [ | |
"## Snap pour point to stream" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "83", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"wbt.snap_pour_points(\n", | |
" \"pour_point.shp\", \"flow_accum.tif\", \"pour_point_snapped.shp\", snap_dist=50\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 40, | |
"id": "84", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"m.add_shp(\"pour_point_snapped.shp\", layer_name=\"Pour Point\", info_mode=None)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "85", | |
"metadata": {}, | |
"source": [ | |
"## Delineate watershed" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "86", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"wbt.watershed(\"flow_direction.tif\", \"pour_point_snapped.shp\", \"watershed.tif\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "87", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"m.add_raster(\"watershed.tif\", layer_name=\"Watershed\", visible=False)\n", | |
"m" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "88", | |
"metadata": {}, | |
"source": [ | |
"## Convert watershed raster to vector" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "89", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"wbt.raster_to_vector_polygons(\"watershed.tif\", \"watershed.shp\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "90", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"m.add_shp(\n", | |
" \"watershed.shp\",\n", | |
" layer_name=\"Watershed Vector\",\n", | |
" style={\"color\": \"#ffff00\", \"weight\": 3},\n", | |
" info_mode=None,\n", | |
")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 45, | |
"id": "a29105d5", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"m.add_basemap(\"USGS Hydrography\")" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "geo", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.12.2" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment