You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[x ] Adheres to PEP-8 formatting (or consistent and explained when deviating)
[x ] Commit history that reflects small and frequent commits since project assignment
[x ] Clear installation instructions, installation tested if available
Cade: The installation instructions are very clear. When I tried to create an environment using your demDiff.yml, it failed to solve the environment. It raised the following packages as the issue:
Solving environment: failed
PackagesNotFoundError: The following packages are not available from current channels:
zstd==1.5.6=h138b38a_0
zlib==1.2.13=h4b97444_1
xz==5.6.4=h46256e1_1
xyzservices==2022.9.0=py311hecd8cb5_1
xerces-c==3.2.4=hcec6c5f_1
xarray==2025.4.0=py311hecd8cb5_0
wheel==0.45.1=py311hecd8cb5_0
urllib3==2.5.0=py311hecd8cb5_0
uriparser==0.9.8=h60e8073_0
unicodedata2==15.1.0=py311h46256e1_1
tk==8.6.15=h3a5a201_0
tiledb==2.3.3=h1b93210_3
tbb==2021.8.0=ha357a0b_0
sqlite==3.50.2=hc8b0dd6_1
six==1.17.0=py311hecd8cb5_0
shapely==2.1.1=py311h9c78e49_0
setuptools==78.1.1=py311hecd8cb5_0
scipy==1.13.0=py311h224febf_0
scikit-learn==1.2.2=py311hcec6c5f_0
rioxarray==0.18.1=py311hecd8cb5_0
requests==2.32.4=py311hecd8cb5_0
readline==8.3=h49f2429_0
rasterio==1.4.3=py311h43b108d_0
qhull==2020.2=ha357a0b_2
pytz==2025.2=py311hecd8cb5_0
python-dateutil==2.9.0post0=py311hecd8cb5_2
python==3.11.13=hbff2529_0
pysocks==1.7.1=py311hecd8cb5_0
pyproj==3.6.1=py311h5e63ee0_1
pyparsing==3.2.0=py311hecd8cb5_0
pyogrio==0.10.0=py311h8ffba06_0
proj==9.3.1=h2218de1_1
poppler-data==0.4.11=hecd8cb5_1
poppler==24.09.0=h1093dcf_3
pixman==0.46.4=hb254d66_0
pillow==11.3.0=py311h25d8182_0
pcre2==10.42=h9b97e30_1
pandas==2.3.1=py311hebe84f7_0
packaging==25.0=py311hecd8cb5_0
openssl==3.0.17=hee2dfae_0
openldap==2.6.10=h5897940_0
openjpeg==2.5.2=h2d09ccc_1
numpy-base==1.26.4=py311h53bf9ac_0
numpy==1.26.4=py311h728a8a3_0
numexpr==2.8.7=py311h728a8a3_0
nss==3.89.1=hcec6c5f_0
nspr==4.35=hcec6c5f_0
networkx==3.4.2=py311hecd8cb5_0
ncurses==6.5=h923df54_0
mkl_random==1.2.4=py311ha357a0b_0
mkl_fft==1.3.8=py311h6c40b1e_0
mkl-service==2.4.0=py311h46256e1_2
mkl==2023.1.0=h8e150cf_43560
minizip==4.0.3=h79ad51c_0
matplotlib-base==3.10.0=py311h919b35b_0
markupsafe==3.0.2=py311h46256e1_0
mapclassify==2.5.0=py311hecd8cb5_0
lz4-c==1.9.4=hcec6c5f_1
lmdb==0.9.31=hc8b0dd6_0
llvm-openmp==19.1.7=h5048363_2
libzip==1.8.0=h29ab7a1_1
libxml2==2.13.8=h6070cd6_0
libwebp-base==1.3.2=h46256e1_1
libtiff==4.7.0=h2dfa3ea_0
libssh2==1.11.1=h3a17b82_0
libspatialite==5.1.0=ha633967_2
libsodium==1.0.18=h1de35cc_0
libpq==17.4=h40f65ae_2
libpng==1.6.39=h6c40b1e_0
libnghttp2==1.57.0=h9beae6a_0
libnetcdf==4.8.1=hedf2ebd_5
libkrb5==1.21.3=h54be378_4
libkml==1.3.0=h85bf17e_7
libiconv==1.16=h6c40b1e_3
libglib==2.84.2=heb90364_0
libgfortran5==11.3.0=h9dfd629_28
libgfortran==5.0.0=11_3_0_hecd8cb5_28
libgdal==3.6.2=he467f5b_10
libffi==3.4.4=hecd8cb5_1
libevent==2.1.12=h04015c4_1
libev==4.33=h9ed2024_1
libdeflate==1.22=h46256e1_0
libcxx==19.1.7=haebbb44_3
libcurl==8.14.1=h1448931_1
libboost==1.82.0=hf53b9f2_2
libavif==1.1.1=h46256e1_0
lerc==4.0.0=h6d0c2b6_0
lcms2==2.16=h31d93a5_1
kiwisolver==1.4.8=py311h6d0c2b6_0
kealib==1.5.0=h003f39c_2
json-c==0.16=hca72f7f_0
jpeg==9e=h46256e1_3
joblib==1.5.1=py311hecd8cb5_0
jinja2==3.1.6=py311hecd8cb5_0
intel-openmp==2023.1.0=ha357a0b_43548
idna==3.7=py311hecd8cb5_0
icu==73.1=hcec6c5f_0
hdf5==1.14.5=h80586a8_2
hdf4==4.2.13=h39711bb_2
harfbuzz==10.2.0=h060d35a_1
graphite2==1.3.14=he9d5cce_1
giflib==5.2.2=h46256e1_0
gettext==0.21.0=h4e8c18a_2
geotiff==1.7.0=h2a015a5_4
geos==3.10.6=h6d0c2b6_0
geopandas-base==1.0.1=py311hecd8cb5_0
geopandas==1.0.1=py311hecd8cb5_0
fribidi==1.0.10=haf1e3a3_0
freexl==2.0.0=hce1ea5d_0
freetype==2.13.3=h02243ff_0
fonttools==4.55.3=py311h46256e1_0
fontconfig==2.14.1=h269ac6a_3
folium==0.14.0=py311hecd8cb5_0
expat==2.7.1=h6d0c2b6_0
dav1d==1.2.1=h6c40b1e_0
cyrus-sasl==2.1.28=hd1e62a0_3
contourpy==1.3.1=py311h1962661_0
click==8.1.8=py311hecd8cb5_0
cfitsio==3.470=hbd21bf8_7
cffi==1.17.1=py311h9205ec4_1
certifi==2025.8.3=py311hecd8cb5_0
cairo==1.16.0=h08824b9_6
ca-certificates==2025.7.15=hecd8cb5_0
c-ares==1.19.1=h6c40b1e_0
bzip2==1.0.8=h6c40b1e_6
brotlicffi==1.0.9.2=py311h6d0c2b6_1
brotli-python==1.0.9=py311h6d0c2b6_9
branca==0.6.0=py311hecd8cb5_0
bottleneck==1.4.2=py311h9b7fc35_0
boost-cpp==1.82.0=ha357a0b_2
blosc==1.21.6=h64ef47d_0
blas==1.0=mkl
attrs==24.3.0=py311hecd8cb5_0
aom==3.6.0=hcec6c5f_0
[ x] Current version number (note the current version number)
Example problem with required data either provided or with a data fetching script
Cade: example problem provided but I couldn't find the data directory, the directory is referenced in the code tho. Maybe the directory is private/stored locally?
[ x] Appropriate use of functions, tasks are broken into logical chunks
[ x] Readability, organization, accessibility: Code is well-commented where necessary, files are organized in a logical manner, naming is intuitive or explanatory
Cade: I think the code is logical and well written! The use of classes is very clean and makes it more readable.
[x ] Documentation is explanative of: what, why, how
Cade: The readme file/documentation is very well organized. Makes me realize I need to put some serious work into mine! I really like the table of repository contents that specifies the role of each file.
Cade: task 2 is specified (addapting to chinook and parallelization), this is not implemented yet.
What does this code do?
This code provides ways to do digital elevation model differencing. It has built in functionality that handles DEMs with different grids and grid pixel size, different reference systems, and varing extents. It also incorporates checks to see if the resulting DEM difference is physically reasonable.
How does this code do it?
This code has 7 main steps: load in the data, preparing the DEM, reprojecting the DEM based on conversions, aligning the DEMs to a common grid, take the difference between the DEMs, and checks that the dem differencing is reasonable. It also has options to plot the data and save the data.
What data does this code work with?
This code deals with DEM data (.tif files).
What do you find cool/interesting/unique about this code?
I think it's pretty cool that the code is able to take DEMs with different grids/projections and convert it into a useable format. It also has checks within the code to make sure that the resulting DEM difference makes sense. This is done with flat ground that we don't expect to be any different. I also admire how clean using classes made the code.
How can this code be improved (e.g., restructuring, optimization, improved examples, clearer explanation? - provide some input into how you could implement that)
The code is already quite good, great job! I know that you are planning to implement parallelization, I'm guessing that will help with speeding up the code. For me, the example DEMs that are in the bottom of the dem_diff.py file are good but I think could be more helpful if they were somewhere else. Maybe they could go into an example_parameters text file? I think this could also benefit from using a parameter file for running your code but I know that might be out of scope with your goals with this project.
I was also wondering if the DEM file needs to be organized in a certain way to be read by your script? I think a little more clarification on the file type/organization would be helpful to know if someone is trying to pull in their own data that is not one of the examples you provided.
Very good job!
Pull request:
I have also made a pull request to change part of the demDiff.yml, I'm still getting errors when I try to create an environment but I think the prefix might have been causing issues too (ask Bryant?).
Checklist
Solving environment: failed
PackagesNotFoundError: The following packages are not available from current channels:
zstd==1.5.6=h138b38a_0
zlib==1.2.13=h4b97444_1
xz==5.6.4=h46256e1_1
xyzservices==2022.9.0=py311hecd8cb5_1
xerces-c==3.2.4=hcec6c5f_1
xarray==2025.4.0=py311hecd8cb5_0
wheel==0.45.1=py311hecd8cb5_0
urllib3==2.5.0=py311hecd8cb5_0
uriparser==0.9.8=h60e8073_0
unicodedata2==15.1.0=py311h46256e1_1
tk==8.6.15=h3a5a201_0
tiledb==2.3.3=h1b93210_3
tbb==2021.8.0=ha357a0b_0
sqlite==3.50.2=hc8b0dd6_1
six==1.17.0=py311hecd8cb5_0
shapely==2.1.1=py311h9c78e49_0
setuptools==78.1.1=py311hecd8cb5_0
scipy==1.13.0=py311h224febf_0
scikit-learn==1.2.2=py311hcec6c5f_0
rioxarray==0.18.1=py311hecd8cb5_0
requests==2.32.4=py311hecd8cb5_0
readline==8.3=h49f2429_0
rasterio==1.4.3=py311h43b108d_0
qhull==2020.2=ha357a0b_2
pytz==2025.2=py311hecd8cb5_0
python-dateutil==2.9.0post0=py311hecd8cb5_2
python==3.11.13=hbff2529_0
pysocks==1.7.1=py311hecd8cb5_0
pyproj==3.6.1=py311h5e63ee0_1
pyparsing==3.2.0=py311hecd8cb5_0
pyogrio==0.10.0=py311h8ffba06_0
proj==9.3.1=h2218de1_1
poppler-data==0.4.11=hecd8cb5_1
poppler==24.09.0=h1093dcf_3
pixman==0.46.4=hb254d66_0
pillow==11.3.0=py311h25d8182_0
pcre2==10.42=h9b97e30_1
pandas==2.3.1=py311hebe84f7_0
packaging==25.0=py311hecd8cb5_0
openssl==3.0.17=hee2dfae_0
openldap==2.6.10=h5897940_0
openjpeg==2.5.2=h2d09ccc_1
numpy-base==1.26.4=py311h53bf9ac_0
numpy==1.26.4=py311h728a8a3_0
numexpr==2.8.7=py311h728a8a3_0
nss==3.89.1=hcec6c5f_0
nspr==4.35=hcec6c5f_0
networkx==3.4.2=py311hecd8cb5_0
ncurses==6.5=h923df54_0
mkl_random==1.2.4=py311ha357a0b_0
mkl_fft==1.3.8=py311h6c40b1e_0
mkl-service==2.4.0=py311h46256e1_2
mkl==2023.1.0=h8e150cf_43560
minizip==4.0.3=h79ad51c_0
matplotlib-base==3.10.0=py311h919b35b_0
markupsafe==3.0.2=py311h46256e1_0
mapclassify==2.5.0=py311hecd8cb5_0
lz4-c==1.9.4=hcec6c5f_1
lmdb==0.9.31=hc8b0dd6_0
llvm-openmp==19.1.7=h5048363_2
libzip==1.8.0=h29ab7a1_1
libxml2==2.13.8=h6070cd6_0
libwebp-base==1.3.2=h46256e1_1
libtiff==4.7.0=h2dfa3ea_0
libssh2==1.11.1=h3a17b82_0
libspatialite==5.1.0=ha633967_2
libsodium==1.0.18=h1de35cc_0
libpq==17.4=h40f65ae_2
libpng==1.6.39=h6c40b1e_0
libnghttp2==1.57.0=h9beae6a_0
libnetcdf==4.8.1=hedf2ebd_5
libkrb5==1.21.3=h54be378_4
libkml==1.3.0=h85bf17e_7
libiconv==1.16=h6c40b1e_3
libglib==2.84.2=heb90364_0
libgfortran5==11.3.0=h9dfd629_28
libgfortran==5.0.0=11_3_0_hecd8cb5_28
libgdal==3.6.2=he467f5b_10
libffi==3.4.4=hecd8cb5_1
libevent==2.1.12=h04015c4_1
libev==4.33=h9ed2024_1
libdeflate==1.22=h46256e1_0
libcxx==19.1.7=haebbb44_3
libcurl==8.14.1=h1448931_1
libboost==1.82.0=hf53b9f2_2
libavif==1.1.1=h46256e1_0
lerc==4.0.0=h6d0c2b6_0
lcms2==2.16=h31d93a5_1
kiwisolver==1.4.8=py311h6d0c2b6_0
kealib==1.5.0=h003f39c_2
json-c==0.16=hca72f7f_0
jpeg==9e=h46256e1_3
joblib==1.5.1=py311hecd8cb5_0
jinja2==3.1.6=py311hecd8cb5_0
intel-openmp==2023.1.0=ha357a0b_43548
idna==3.7=py311hecd8cb5_0
icu==73.1=hcec6c5f_0
hdf5==1.14.5=h80586a8_2
hdf4==4.2.13=h39711bb_2
harfbuzz==10.2.0=h060d35a_1
graphite2==1.3.14=he9d5cce_1
giflib==5.2.2=h46256e1_0
gettext==0.21.0=h4e8c18a_2
geotiff==1.7.0=h2a015a5_4
geos==3.10.6=h6d0c2b6_0
geopandas-base==1.0.1=py311hecd8cb5_0
geopandas==1.0.1=py311hecd8cb5_0
fribidi==1.0.10=haf1e3a3_0
freexl==2.0.0=hce1ea5d_0
freetype==2.13.3=h02243ff_0
fonttools==4.55.3=py311h46256e1_0
fontconfig==2.14.1=h269ac6a_3
folium==0.14.0=py311hecd8cb5_0
expat==2.7.1=h6d0c2b6_0
dav1d==1.2.1=h6c40b1e_0
cyrus-sasl==2.1.28=hd1e62a0_3
contourpy==1.3.1=py311h1962661_0
click==8.1.8=py311hecd8cb5_0
cfitsio==3.470=hbd21bf8_7
cffi==1.17.1=py311h9205ec4_1
certifi==2025.8.3=py311hecd8cb5_0
cairo==1.16.0=h08824b9_6
ca-certificates==2025.7.15=hecd8cb5_0
c-ares==1.19.1=h6c40b1e_0
bzip2==1.0.8=h6c40b1e_6
brotlicffi==1.0.9.2=py311h6d0c2b6_1
brotli-python==1.0.9=py311h6d0c2b6_9
branca==0.6.0=py311hecd8cb5_0
bottleneck==1.4.2=py311h9b7fc35_0
boost-cpp==1.82.0=ha357a0b_2
blosc==1.21.6=h64ef47d_0
blas==1.0=mkl
attrs==24.3.0=py311hecd8cb5_0
aom==3.6.0=hcec6c5f_0
[ x] Current version number (note the current version number)
Example problem with required data either provided or with a data fetching script
Cade: example problem provided but I couldn't find the data directory, the directory is referenced in the code tho. Maybe the directory is private/stored locally?
[ x] Appropriate use of functions, tasks are broken into logical chunks
[ x] Readability, organization, accessibility: Code is well-commented where necessary, files are organized in a logical manner, naming is intuitive or explanatory
Cade: I think the code is logical and well written! The use of classes is very clean and makes it more readable.
[x ] Documentation is explanative of: what, why, how
Cade: The readme file/documentation is very well organized. Makes me realize I need to put some serious work into mine! I really like the table of repository contents that specifies the role of each file.
[ x] Task Peer review 1 (Cade) #1 Selected (note which task is selected)
Cade: task 1 is specified (classes) and is implemented
[ x] Task Removing prefix from demDiff.yml #2 Selected (note which task is selected)
Cade: task 2 is specified (addapting to chinook and parallelization), this is not implemented yet.
I was also wondering if the DEM file needs to be organized in a certain way to be read by your script? I think a little more clarification on the file type/organization would be helpful to know if someone is trying to pull in their own data that is not one of the examples you provided.
Very good job!
Pull request:
I have also made a pull request to change part of the demDiff.yml, I'm still getting errors when I try to create an environment but I think the prefix might have been causing issues too (ask Bryant?).
Pull request: #2