Skip to content

Commit

Permalink
Update readme
Browse files Browse the repository at this point in the history
  • Loading branch information
montimaj committed Nov 5, 2022
1 parent eac287e commit ddaeefe
Show file tree
Hide file tree
Showing 14 changed files with 5,099 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ISO-8859-1
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
PROJCS["Albers_Conical_Equal_Area",GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101004]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Albers"],PARAMETER["False_Easting",0.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-96.0],PARAMETER["Standard_Parallel_1",29.5],PARAMETER["Standard_Parallel_2",45.5],PARAMETER["Latitude_Of_Origin",23.0],UNIT["Meter",1.0]]
Binary file not shown.
Binary file not shown.
1 change: 1 addition & 0 deletions Inputs/Data/Arizona_GW/GW_Basin/Groundwater_Basin.cpg
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
UTF-8
Binary file not shown.
1 change: 1 addition & 0 deletions Inputs/Data/Arizona_GW/GW_Basin/Groundwater_Basin.prj
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
PROJCS["NAD_1983_UTM_Zone_12N",GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-111.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]]
Binary file not shown.
Binary file not shown.
Binary file not shown.
4,759 changes: 4,759 additions & 0 deletions Inputs/Data/Arizona_GW/GW_Data/GW_2020.csv

Large diffs are not rendered by default.

16 changes: 15 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,24 @@
# Advancing Remote Sensing and Machine Learning-Driven Frameworks for Groundwater Withdrawal Estimation in Arizona: Linking Land Subsidence to Groundwater Withdrawals

Abstract: Groundwater plays a crucial role in sustaining global food security but is being over-exploited in many basins of the world. Despite its importance and finite availability, local-scale monitoring of groundwater withdrawals required for sustainable water management practices is not carried out in most countries, including the United States. In this study, we combine publicly available datasets into a machine learning framework for estimating groundwater withdrawals over the state of Arizona. Here we include evapotranspiration, precipitation, crop coefficients, land use, annual discharge, well density, and watershed stress metrics for our predictions. We employ random forests to predict groundwater withdrawals from 2002-2020 at a 2 km spatial resolution using in-situ groundwater withdrawal data available for Arizona Active Management Areas (AMA) and Irrigation Non-Expansion Areas (INA) from 2002-2009 for training and 2010-2020 for validating the model respectively. The results show high training (R2≈ 0.9) and good testing (R2≈ 0.7) scores with normalized mean absolute error (NMAE) ≈ 0.62 and normalized root mean square error (NRMSE) ≈ 2.34 for the AMA/INA region. Using this method, we spatially extrapolate the existing groundwater withdrawal estimates to the entire state and observe the co-occurrence of both groundwater withdrawals and land subsidence in South-Central and Southern Arizona. Our model predicts groundwater withdrawals in regions where production wells are present on agricultural lands and subsidence is observed from Interferometric Synthetic Aperture Radar (InSAR), but withdrawals are not monitored. By performing a comparative analysis over these regions using the predicted groundwater withdrawals and InSAR-based land subsidence estimates, we observe a varying degree of subsidence for similar volumes of withdrawals in different basins. The performance of our model on validation datasets and its favorable comparison with independent water use proxies such as InSAR demonstrate the effectiveness and extensibility of our combined remote sensing and machine learning-based approach.
## Abstract
Groundwater plays a crucial role in sustaining global food security but is being over-exploited in many basins of the world. Despite its importance and finite availability, local-scale monitoring of groundwater withdrawals required for sustainable water management practices is not carried out in most countries, including the United States. In this study, we combine publicly available datasets into a machine learning framework for estimating groundwater withdrawals over the state of Arizona. Here we include evapotranspiration, precipitation, crop coefficients, land use, annual discharge, well density, and watershed stress metrics for our predictions. We employ random forests to predict groundwater withdrawals from 2002-2020 at a 2 km spatial resolution using in-situ groundwater withdrawal data available for Arizona Active Management Areas (AMA) and Irrigation Non-Expansion Areas (INA) from 2002-2009 for training and 2010-2020 for validating the model respectively. The results show high training (R2≈ 0.9) and good testing (R2≈ 0.7) scores with normalized mean absolute error (NMAE) ≈ 0.62 and normalized root mean square error (NRMSE) ≈ 2.34 for the AMA/INA region. Using this method, we spatially extrapolate the existing groundwater withdrawal estimates to the entire state and observe the co-occurrence of both groundwater withdrawals and land subsidence in South-Central and Southern Arizona. Our model predicts groundwater withdrawals in regions where production wells are present on agricultural lands and subsidence is observed from Interferometric Synthetic Aperture Radar (InSAR), but withdrawals are not monitored. By performing a comparative analysis over these regions using the predicted groundwater withdrawals and InSAR-based land subsidence estimates, we observe a varying degree of subsidence for similar volumes of withdrawals in different basins. The performance of our model on validation datasets and its favorable comparison with independent water use proxies such as InSAR demonstrate the effectiveness and extensibility of our combined remote sensing and machine learning-based approach.

![preview](Workflow/Workflow_AZ.png)

## Dependencies

[Anaconda](https://www.anaconda.com/products/individual) is required for installing the Python 3 packages. Once Anaconda
is installed, the following can be run from the command line to install the required packages.

```
conda env create -f environment.yml
```

We use [OSGeo4W](https://www.osgeo.org/projects/osgeo4w/) binary distribution for Windows and use system call from Python to generate rasters. For Linux or MacOS, gdal needs to be installed separately, and the appropriate 'gdal_path' needs to be set in Python_Files/gw_driver.py

## Publications
Hydrological Processes Paper: https://onlinelibrary.wiley.com/doi/10.1002/hyp.14757

AGU Fall Meeting 2020 Poster: https://bit.ly/3fz6a6y

Citation:
Expand Down
321 changes: 321 additions & 0 deletions environment.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,321 @@
name: HydroEnv
channels:
- conda-forge
- defaults
dependencies:
- _libgcc_mutex=0.1=conda_forge
- _openmp_mutex=4.5=1_gnu
- _py-xgboost-mutex=2.0=cpu_0
- affine=2.3.0=py_0
- aiohttp=3.8.1=py39h3811e60_0
- aiosignal=1.2.0=pyhd8ed1ab_0
- alsa-lib=1.2.3=h516909a_0
- asttokens=2.0.5=pyhd8ed1ab_0
- async-timeout=4.0.2=pyhd8ed1ab_0
- attrs=21.4.0=pyhd8ed1ab_0
- backcall=0.2.0=pyh9f0ad1d_0
- backports=1.0=py_2
- backports.functools_lru_cache=1.6.4=pyhd8ed1ab_0
- blosc=1.21.0=h9c3ff4c_0
- bokeh=2.4.2=py39hf3d152e_0
- boost-cpp=1.74.0=h6cacc03_7
- branca=0.4.2=pyhd8ed1ab_0
- brotli=1.0.9=h7f98852_6
- brotli-bin=1.0.9=h7f98852_6
- brotlipy=0.7.0=py39h3811e60_1003
- bzip2=1.0.8=h7f98852_4
- c-ares=1.18.1=h7f98852_0
- ca-certificates=2021.10.8=ha878542_0
- cachetools=4.2.4=pyhd8ed1ab_0
- cairo=1.16.0=ha12eb4b_1010
- certifi=2021.10.8=py39hf3d152e_1
- cffi=1.15.0=py39h4bc2ebd_0
- cfitsio=4.1.0=hd9d235c_0
- charset-normalizer=2.0.12=pyhd8ed1ab_0
- click=8.0.4=py39hf3d152e_0
- click-plugins=1.1.1=py_0
- cligj=0.7.2=pyhd8ed1ab_1
- cloudpickle=2.0.0=pyhd8ed1ab_0
- cryptography=36.0.2=py39hd97740a_0
- curl=7.82.0=h7bff187_0
- cycler=0.11.0=pyhd8ed1ab_0
- cytoolz=0.11.2=py39h3811e60_1
- dask=2022.3.0=pyhd8ed1ab_0
- dask-core=2022.3.0=pyhd8ed1ab_0
- dask-glm=0.2.0=py_1
- dask-jobqueue=0.7.3=pyhd8ed1ab_0
- dask-ml=2022.1.22=pyhd8ed1ab_0
- dask-searchcv=0.2.0=py_0
- dask-xgboost=0.1.11=pyh9f0ad1d_0
- dbus=1.13.6=h5008d03_3
- decorator=5.1.1=pyhd8ed1ab_0
- distributed=2022.3.0=pyhd8ed1ab_0
- earthengine-api=0.1.303=pyhd8ed1ab_0
- executing=0.8.3=pyhd8ed1ab_0
- expat=2.4.7=h27087fc_0
- fiona=1.8.21=py39hc5a795b_0
- folium=0.12.1.post1=pyhd8ed1ab_1
- font-ttf-dejavu-sans-mono=2.37=hab24e00_0
- font-ttf-inconsolata=3.000=h77eed37_0
- font-ttf-source-code-pro=2.038=h77eed37_0
- font-ttf-ubuntu=0.83=hab24e00_0
- fontconfig=2.13.96=h8e229c2_2
- fonts-conda-ecosystem=1=0
- fonts-conda-forge=1=0
- fonttools=4.31.2=py39hb9d737c_0
- freetype=2.10.4=h0708190_1
- freexl=1.0.6=h7f98852_0
- frozenlist=1.3.0=py39h3811e60_0
- fsspec=2022.2.0=pyhd8ed1ab_0
- future=0.18.2=py39hf3d152e_4
- gdal=3.4.2=py39hc691d54_1
- geopandas=0.10.2=pyhd8ed1ab_1
- geopandas-base=0.10.2=pyha770c72_1
- geos=3.10.2=h9c3ff4c_0
- geotiff=1.7.1=h509b78c_0
- gettext=0.19.8.1=h73d1719_1008
- giflib=5.2.1=h36c2ea0_2
- google-api-core=1.31.5=pyhd8ed1ab_0
- google-api-python-client=1.12.8=pyhd3deb0d_0
- google-auth=1.35.0=pyh6c4a22f_0
- google-auth-httplib2=0.1.0=pyhd8ed1ab_0
- google-cloud-core=1.7.2=pyh6c4a22f_0
- google-cloud-storage=2.1.0=pyh6c4a22f_0
- google-crc32c=1.1.2=py39hb81f231_2
- google-resumable-media=2.1.0=pyh6c4a22f_0
- googleapis-common-protos=1.56.0=py39hf3d152e_0
- grpcio=1.44.0=py39hff7568b_0
- gst-plugins-base=1.20.1=hcf0ee16_1
- gstreamer=1.20.1=hd4edc92_1
- hdf4=4.2.15=h10796ff_3
- hdf5=1.12.1=nompi_h2386368_104
- heapdict=1.0.1=py_0
- httplib2=0.20.4=pyhd8ed1ab_0
- icu=69.1=h9c3ff4c_0
- idna=3.3=pyhd8ed1ab_0
- importlib-metadata=4.11.3=py39hf3d152e_0
- importlib_metadata=4.11.3=hd8ed1ab_0
- ipython=8.1.1=py39hf3d152e_0
- jbig=2.1=h7f98852_2003
- jedi=0.18.1=py39hf3d152e_0
- jinja2=3.0.3=pyhd8ed1ab_0
- joblib=1.1.0=pyhd8ed1ab_0
- jpeg=9e=h7f98852_0
- json-c=0.15=h98cffda_0
- kealib=1.4.14=h87e4c3c_3
- keyutils=1.6.1=h166bdaf_0
- kiwisolver=1.4.0=py39hf939315_0
- krb5=1.19.3=h3790be6_0
- lcms2=2.12=hddcbb42_0
- ld_impl_linux-64=2.36.1=hea4e1c9_2
- lerc=3.0=h9c3ff4c_0
- libblas=3.9.0=13_linux64_openblas
- libbrotlicommon=1.0.9=h7f98852_6
- libbrotlidec=1.0.9=h7f98852_6
- libbrotlienc=1.0.9=h7f98852_6
- libcblas=3.9.0=13_linux64_openblas
- libclang=13.0.1=default_hc23dcda_0
- libcrc32c=1.1.2=h9c3ff4c_0
- libcurl=7.82.0=h7bff187_0
- libdap4=3.20.6=hd7c4107_2
- libdeflate=1.10=h7f98852_0
- libedit=3.1.20191231=he28a2e2_2
- libev=4.33=h516909a_1
- libevent=2.1.10=h9b69904_4
- libffi=3.4.2=h7f98852_5
- libgcc-ng=11.2.0=h1d223b6_14
- libgdal=3.4.2=h886d1c3_1
- libgfortran-ng=11.2.0=h69a702a_14
- libgfortran5=11.2.0=h5c6108e_14
- libglib=2.70.2=h174f98d_4
- libgomp=11.2.0=h1d223b6_14
- libiconv=1.16=h516909a_0
- libkml=1.3.0=h238a007_1014
- liblapack=3.9.0=13_linux64_openblas
- libllvm11=11.1.0=hf817b99_3
- libllvm13=13.0.1=hf817b99_2
- libnetcdf=4.8.1=nompi_hb3fd0d9_101
- libnghttp2=1.47.0=h727a467_0
- libnsl=2.0.0=h7f98852_0
- libogg=1.3.4=h7f98852_1
- libopenblas=0.3.18=pthreads_h8fe5266_0
- libopus=1.3.1=h7f98852_1
- libpng=1.6.37=h21135ba_2
- libpq=14.2=hd57d9b9_0
- libprotobuf=3.19.4=h780b84a_0
- librttopo=1.1.0=hf69c175_9
- libspatialindex=1.9.3=h9c3ff4c_4
- libspatialite=5.0.1=ha867d66_15
- libssh2=1.10.0=ha56f1ee_2
- libstdcxx-ng=11.2.0=he4da1e4_14
- libtiff=4.3.0=h542a066_3
- libuuid=2.32.1=h7f98852_1000
- libvorbis=1.3.7=h9c3ff4c_0
- libwebp=1.2.2=h3452ae3_0
- libwebp-base=1.2.2=h7f98852_1
- libxcb=1.13=h7f98852_1004
- libxgboost=1.5.1=cpu_h3d145d1_2
- libxkbcommon=1.0.3=he3ba5ed_0
- libxml2=2.9.12=h885dcf4_1
- libzip=1.8.0=h4de3113_1
- libzlib=1.2.11=h36c2ea0_1013
- lightgbm=3.3.2=py39he80948d_0
- llvmlite=0.38.0=py39h1bbdace_0
- locket=0.2.0=py_2
- lz4-c=1.9.3=h9c3ff4c_1
- mapclassify=2.4.3=pyhd8ed1ab_0
- markupsafe=2.1.1=py39hb9d737c_0
- matplotlib=3.5.1=py39hf3d152e_0
- matplotlib-base=3.5.1=py39h2fa2bec_0
- matplotlib-inline=0.1.3=pyhd8ed1ab_0
- msgpack-python=1.0.3=py39h1a9c180_0
- multidict=6.0.2=py39h3811e60_0
- multipledispatch=0.6.0=py_0
- munch=2.5.0=py_0
- munkres=1.1.4=pyh9f0ad1d_0
- mysql-common=8.0.28=ha770c72_0
- mysql-libs=8.0.28=hfa10184_0
- ncurses=6.3=h9c3ff4c_0
- networkx=2.7.1=pyhd8ed1ab_0
- nspr=4.32=h9c3ff4c_1
- nss=3.76=h2350873_0
- numba=0.55.1=py39h56b8d98_0
- numpy=1.21.5=py39haac66dc_0
- openjpeg=2.4.0=hb52868f_1
- openssl=1.1.1l=h7f98852_0
- packaging=21.3=pyhd8ed1ab_0
- pandas=1.4.1=py39hde0f152_0
- parso=0.8.3=pyhd8ed1ab_0
- partd=1.2.0=pyhd8ed1ab_0
- patsy=0.5.2=pyhd8ed1ab_0
- pcre=8.45=h9c3ff4c_0
- pexpect=4.8.0=pyh9f0ad1d_2
- pickleshare=0.7.5=py_1003
- pillow=9.0.1=py39hae2aec6_2
- pip=22.0.4=pyhd8ed1ab_0
- pixman=0.40.0=h36c2ea0_0
- poppler=22.01.0=h1434ded_1
- poppler-data=0.4.11=hd8ed1ab_0
- postgresql=14.2=h2510834_0
- proj=9.0.0=h93bde94_1
- prompt-toolkit=3.0.27=pyha770c72_0
- protobuf=3.19.4=py39he80948d_0
- psutil=5.9.0=py39h3811e60_0
- pthread-stubs=0.4=h36c2ea0_1001
- ptyprocess=0.7.0=pyhd3deb0d_0
- pure_eval=0.2.2=pyhd8ed1ab_0
- py-xgboost=1.5.1=cpu_py39h4655687_2
- pyasn1=0.4.8=py_0
- pyasn1-modules=0.2.7=py_0
- pycparser=2.21=pyhd8ed1ab_0
- pygments=2.11.2=pyhd8ed1ab_0
- pyopenssl=22.0.0=pyhd8ed1ab_0
- pyparsing=3.0.7=pyhd8ed1ab_0
- pyproj=3.3.0=py39hcadae2f_2
- pyqt=5.12.3=py39hf3d152e_8
- pyqt-impl=5.12.3=py39hde8b62d_8
- pyqt5-sip=4.19.18=py39he80948d_8
- pyqtchart=5.12=py39h0fcd23e_8
- pyqtwebengine=5.12.1=py39h0fcd23e_8
- pysocks=1.7.1=py39hf3d152e_4
- python=3.9.10=h85951f9_2_cpython
- python-dateutil=2.8.2=pyhd8ed1ab_0
- python_abi=3.9=2_cp39
- pytz=2022.1=pyhd8ed1ab_0
- pyu2f=0.1.5=pyhd8ed1ab_0
- pyyaml=6.0=py39h3811e60_3
- qt=5.12.9=h1304e3e_6
- rasterio=1.2.10=py39h2e4b6e6_5
- readline=8.1=h46c0cb4_0
- requests=2.27.1=pyhd8ed1ab_0
- rioxarray=0.10.2=pyhd8ed1ab_0
- rsa=4.8=pyhd8ed1ab_0
- rtree=0.9.7=py39hb102c33_3
- scikit-learn=1.0.2=py39h4dfa638_0
- scipy=1.8.0=py39hee8e79c_1
- seaborn=0.11.2=hd8ed1ab_0
- seaborn-base=0.11.2=pyhd8ed1ab_0
- setuptools=60.10.0=py39hf3d152e_0
- shapely=1.8.0=py39ha65c37e_5
- simplejson=3.17.6=py39h3811e60_0
- six=1.16.0=pyh6c4a22f_0
- snuggs=1.4.7=py_0
- sortedcontainers=2.4.0=pyhd8ed1ab_0
- sqlite=3.37.1=h4ff8645_0
- stack_data=0.2.0=pyhd8ed1ab_0
- statsmodels=0.13.2=py39hce5d2b2_0
- tblib=1.7.0=pyhd8ed1ab_0
- threadpoolctl=3.1.0=pyh8a188c0_0
- tiledb=2.7.1=h1e4a385_0
- tk=8.6.12=h27826a3_0
- toolz=0.11.2=pyhd8ed1ab_0
- tornado=6.1=py39h3811e60_2
- traitlets=5.1.1=pyhd8ed1ab_0
- typing-extensions=4.1.1=hd8ed1ab_0
- typing_extensions=4.1.1=pyha770c72_0
- tzcode=2022a=h166bdaf_0
- tzdata=2022a=h191b570_0
- unicodedata2=14.0.0=py39h3811e60_0
- uritemplate=3.0.1=py_0
- urllib3=1.26.9=pyhd8ed1ab_0
- wcwidth=0.2.5=pyh9f0ad1d_2
- wheel=0.37.1=pyhd8ed1ab_0
- xarray=2022.3.0=pyhd8ed1ab_0
- xerces-c=3.2.3=h8ce2273_4
- xgboost=1.5.1=cpu_py39h4655687_2
- xorg-kbproto=1.0.7=h7f98852_1002
- xorg-libice=1.0.10=h7f98852_0
- xorg-libsm=1.2.3=hd9c2040_1000
- xorg-libx11=1.7.2=h7f98852_0
- xorg-libxau=1.0.9=h7f98852_0
- xorg-libxdmcp=1.1.3=h7f98852_0
- xorg-libxext=1.3.4=h7f98852_1
- xorg-libxrender=0.9.10=h7f98852_1003
- xorg-renderproto=0.11.1=h7f98852_1002
- xorg-xextproto=7.3.0=h7f98852_1002
- xorg-xproto=7.0.31=h7f98852_1007
- xyzservices=2022.3.0=pyhd8ed1ab_0
- xz=5.2.5=h516909a_1
- yaml=0.2.5=h7f98852_2
- yarl=1.7.2=py39h3811e60_1
- zict=2.1.0=pyhd8ed1ab_0
- zipp=3.7.0=pyhd8ed1ab_1
- zlib=1.2.11=h36c2ea0_1013
- zstd=1.5.2=ha95c52a_0
- pip:
- argon2-cffi==21.1.0
- bleach==4.1.0
- debugpy==1.5.1
- defusedxml==0.7.1
- entrypoints==0.3
- ipykernel==6.6.0
- ipympl==0.8.2
- ipython-genutils==0.2.0
- ipywidgets==7.6.5
- jsonschema==4.2.1
- jupyter==1.0.0
- jupyter-client==7.1.0
- jupyter-console==6.4.0
- jupyter-core==4.9.1
- jupyterlab-pygments==0.1.2
- jupyterlab-widgets==1.0.2
- mistune==0.8.4
- nbclient==0.5.9
- nbconvert==6.3.0
- nbformat==5.1.3
- nest-asyncio==1.5.4
- notebook==6.4.6
- pandocfilters==1.5.0
- plotly==5.4.0
- prometheus-client==0.12.0
- pyrsistent==0.18.0
- pyzmq==22.3.0
- qtconsole==5.2.1
- qtpy==1.11.2
- send2trash==1.8.0
- tenacity==8.0.1
- terminado==0.12.1
- testpath==0.5.0
- webencodings==0.5.1
- widgetsnbextension==3.5.2
prefix: /home/smxnv/anaconda3/envs/HydroEnv

0 comments on commit ddaeefe

Please sign in to comment.