From acf0787e7dd5a45c21eee33dba8f5b6d403285c4 Mon Sep 17 00:00:00 2001 From: Scott Henderson Date: Thu, 13 Feb 2025 19:30:13 +0100 Subject: [PATCH] 3DEP and NASADEM examples (#11) * update notebook, readme, lockfiles * 3dep and nasadem notebooks * add contributing doc * nasadem files * fix badge, use admonitions * fix background header, pixi run cmd --- 3dep/10m-seamless.ipynb | 1073 ++++++++++++++++++++++++++ 3dep/USGS_Seamless_DEM_13_7912.vrt | 46 ++ CONTRIBUTING.md | 43 ++ README.md | 216 +----- globaldems/nasadem-ellipsoid.gti.vrt | 39 + globaldems/nasadem.gti | 9 + globaldems/nasadem.ipynb | 703 +++++++++++++++++ globaldems/nasadem_7661.vrt | 47 ++ globaldems/nasadem_7912.gti.vrt | 39 + globaldems/nasadem_7912.vrt | 47 ++ globaldems/readme.md | 22 +- globaldems/srtm.ipynb | 1 + myst.yml | 7 +- notes.md | 213 +++++ pixi.lock | 763 +++++++++++++++++- pixi.toml | 1 + 16 files changed, 3030 insertions(+), 239 deletions(-) create mode 100644 3dep/10m-seamless.ipynb create mode 100644 3dep/USGS_Seamless_DEM_13_7912.vrt create mode 100644 CONTRIBUTING.md create mode 100644 globaldems/nasadem-ellipsoid.gti.vrt create mode 100644 globaldems/nasadem.gti create mode 100644 globaldems/nasadem.ipynb create mode 100644 globaldems/nasadem_7661.vrt create mode 100644 globaldems/nasadem_7912.gti.vrt create mode 100644 globaldems/nasadem_7912.vrt create mode 100644 notes.md diff --git a/3dep/10m-seamless.ipynb b/3dep/10m-seamless.ipynb new file mode 100644 index 0000000..cb18aee --- /dev/null +++ b/3dep/10m-seamless.ipynb @@ -0,0 +1,1073 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 3DEP Seamless DEMs\n", + "\n", + "```\n", + "Horizontal Coordinates: NAD83 [EPSG: 4269]\n", + "Vertical Coordinates: NAVD88 [EPSG: 5703]\n", + "```\n", + "https://portal.opentopography.org/raster?opentopoID=OTNED.012021.4269.1 \n", + "\n", + "```{note}\n", + "We assume that instead of NAD83(1986) the Seamless data are referenced to the more recent and more accurate realization NAD83(2011) -> EPSG:6318\n", + "```\n", + "\n", + "```{note} 10m ( 1/3 arcsec) seamless covers CONUS, Alaska & other US territories \n", + "30m (1 arcsec) seamless covers canada too\n", + "https://portal.opentopography.org/datasetMetadata?otCollectionID=OT.012021.4269.2\n", + "```\n", + "\n", + "```{warning}\n", + "Beware that this seamless data can be based on different sources including older lidar, *hand-drawn contours from topographic maps*, and SRTM data!\n", + "```\n", + "\n", + "More important references:\n", + "* https://www.usgs.gov/faqs/what-data-sources-are-used-produce-3d-elevation-program-3dep-dems\n", + "* https://www.usgs.gov/faqs/what-vertical-accuracy-3d-elevation-program-3dep-dems" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Driver: VRT/Virtual Raster\n", + "Size is 3888006, 939612\n", + "Coordinate System is:\n", + "GEOGCRS[\"NAD83\",\n", + " DATUM[\"North American Datum 1983\",\n", + " ELLIPSOID[\"GRS 1980\",6378137,298.257222101004,\n", + " LENGTHUNIT[\"metre\",1]]],\n", + " PRIMEM[\"Greenwich\",0,\n", + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n", + " CS[ellipsoidal,2],\n", + " AXIS[\"geodetic latitude (Lat)\",north,\n", + " ORDER[1],\n", + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n", + " AXIS[\"geodetic longitude (Lon)\",east,\n", + " ORDER[2],\n", + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n", + " ID[\"EPSG\",4269]]\n", + "Data axis to CRS axis mapping: 2,1\n", + "Origin = (-180.000555556093587,72.000555556294898)\n", + "Pixel Size = (0.000092592592660,-0.000092592592660)\n", + "Corner Coordinates:\n", + "Upper Left (-180.0005556, 72.0005556) (180d 0' 2.00\"W, 72d 0' 2.00\"N)\n", + "Lower Left (-180.0005556, -15.0005556) (180d 0' 2.00\"W, 15d 0' 2.00\"S)\n", + "Upper Right ( 180.0000003, 72.0005556) (180d 0' 0.00\"E, 72d 0' 2.00\"N)\n", + "Lower Right ( 180.0000003, -15.0005556) (180d 0' 0.00\"E, 15d 0' 2.00\"S)\n", + "Center ( -0.0002776, 28.5000000) ( 0d 0' 1.00\"W, 28d30' 0.00\"N)\n", + "Band 1 Block=128x128 Type=Float32, ColorInterp=Gray\n", + " NoData Value=-999999\n", + " Overviews: 1944003x469806, 972001x234903, 486000x117451, 243000x58725, 121500x29362\n" + ] + } + ], + "source": [ + "%%bash\n", + "\n", + "CPL_DEBUG=OFF GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + " AWS_NO_SIGN_REQUEST=YES \\\n", + " gdalinfo -nofl /vsis3/prd-tnm/StagedProducts/Elevation/13/TIFF/USGS_Seamless_DEM_13.vrt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Report:\n", + " Location: (793805P,361805L)\n", + " Band 1:\n", + " /vsicurl/https://prd-tnm.s3.amazonaws.com/StagedProducts/Elevation/13/TIFF/current/n39w107/USGS_13_n39w107.tif\n", + " Value: 2759.5849609375\n" + ] + } + ], + "source": [ + "%%bash\n", + "# NOTE: -r bilinear or cubic will report fractional pixel position\n", + "INPUT=/vsis3/prd-tnm/StagedProducts/Elevation/13/TIFF/USGS_Seamless_DEM_13.vrt\n", + "CPL_DEBUG=OFF GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + " AWS_NO_SIGN_REQUEST=YES \\\n", + " gdallocationinfo -geoloc $INPUT -106.5000000 38.5000000" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# NOTE: that 'EPSG:4326' and EPSG:4269 are both lon,lat but not equivalent!\n", + "# This is fairly uncertain, it's going from EPSG ensemble to NAD83(1986)\n", + "# Implicitly the 'top' choice of change is to do nothing and assume +/-4m acccuracy\n", + "#!projinfo -s EPSG:4326 -t EPSG:4269 -o proj --spatial-test intersects" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3DEP Seamless metadata\n", + "\n", + "Metadata files for this particular 10m tile live on AWS S3:\n", + "\n", + "https://prd-tnm.s3.amazonaws.com/index.html?prefix=StagedProducts/Elevation/13/TIFF/current/n39w107/" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Look at metadata\n", + "import geopandas as gpd\n", + "gf = gpd.read_file('https://prd-tnm.s3.amazonaws.com/StagedProducts/Elevation/13/TIFF/current/n39w107/USGS_13_n39w107.gpkg')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
workpackageworkpackage_idp_methodp_devicecollect_startcollect_endpub_datemetadata_linkinternal_uuidgeometry
0NoneNaNLT4XLT20001958-01-011958-12-31NaTNoneNoneMULTIPOLYGON (((-106.99106 38.99655, -106.9908...
1NoneNaNLT4XLT4X1975-01-011975-12-31NaTNoneNoneMULTIPOLYGON (((-106.1256 38.93334, -106.12583...
2NoneNaNLT4XLT4X1952-01-011952-12-31NaTNoneNoneMULTIPOLYGON (((-105.99953 38.80491, -105.9995...
3NoneNaNLT4XLT4X1952-01-011952-12-31NaTNoneNoneMULTIPOLYGON (((-106 38.875, -106.00055 38.875...
4NoneNaNLT4XLT4X1975-01-011975-12-31NaTNoneNoneMULTIPOLYGON (((-106.0006 38.80658, -106.00083...
5NoneNaNLT4XLT4X1952-01-011952-12-31NaTNoneNoneMULTIPOLYGON (((-106 39.00005, -106 39, -106.0...
6NoneNaNLT4XLT4X1975-01-011975-12-31NaTNoneNoneMULTIPOLYGON (((-106.10139 38.91186, -106.1014...
7NoneNaNLT4XLT4X1956-01-011956-12-31NaTNoneNoneMULTIPOLYGON (((-106.0006 39, -106.0006 39, -1...
8NoneNaNlinear-mode lidarUNKNOWN2011-01-012011-12-31NaTNoneNoneMULTIPOLYGON (((-106.00119 38.42658, -106.0011...
9NoneNaNLT4XLT4X1956-01-011956-12-31NaTNoneNoneMULTIPOLYGON (((-106.12555 39.00005, -106.1255...
10NoneNaNlinear-mode lidarUNKNOWN2011-01-012011-12-31NaTNoneNoneMULTIPOLYGON (((-106.09823 38.90898, -106.0981...
11CO_UpperColorado_Topobathy_2020_D20198573.0Topobathymetric LIDARNone2020-10-032020-10-102022-03-31https://prd-tnm.s3.amazonaws.com/index.html?pr...NoneMULTIPOLYGON (((-107.0003 38.52293, -107.00011...
12CO_SanLuisJuanMiguel_2020_D20193462.0linear-mode lidarNone2019-09-212020-10-042021-12-08https://prd-tnm.s3.amazonaws.com/index.html?pr...NoneMULTIPOLYGON (((-106.99998 38.14333, -106.9999...
13CO_WestCentral_2019_A19175987.0linear-mode lidarNone2019-08-212019-09-192021-03-12https://prd-tnm.s3.amazonaws.com/index.html?pr...NoneMULTIPOLYGON (((-106.99994 38.96877, -106.9999...
\n", + "
" + ], + "text/plain": [ + " workpackage workpackage_id \\\n", + "0 None NaN \n", + "1 None NaN \n", + "2 None NaN \n", + "3 None NaN \n", + "4 None NaN \n", + "5 None NaN \n", + "6 None NaN \n", + "7 None NaN \n", + "8 None NaN \n", + "9 None NaN \n", + "10 None NaN \n", + "11 CO_UpperColorado_Topobathy_2020_D20 198573.0 \n", + "12 CO_SanLuisJuanMiguel_2020_D20 193462.0 \n", + "13 CO_WestCentral_2019_A19 175987.0 \n", + "\n", + " p_method p_device collect_start collect_end pub_date \\\n", + "0 LT4X LT2000 1958-01-01 1958-12-31 NaT \n", + "1 LT4X LT4X 1975-01-01 1975-12-31 NaT \n", + "2 LT4X LT4X 1952-01-01 1952-12-31 NaT \n", + "3 LT4X LT4X 1952-01-01 1952-12-31 NaT \n", + "4 LT4X LT4X 1975-01-01 1975-12-31 NaT \n", + "5 LT4X LT4X 1952-01-01 1952-12-31 NaT \n", + "6 LT4X LT4X 1975-01-01 1975-12-31 NaT \n", + "7 LT4X LT4X 1956-01-01 1956-12-31 NaT \n", + "8 linear-mode lidar UNKNOWN 2011-01-01 2011-12-31 NaT \n", + "9 LT4X LT4X 1956-01-01 1956-12-31 NaT \n", + "10 linear-mode lidar UNKNOWN 2011-01-01 2011-12-31 NaT \n", + "11 Topobathymetric LIDAR None 2020-10-03 2020-10-10 2022-03-31 \n", + "12 linear-mode lidar None 2019-09-21 2020-10-04 2021-12-08 \n", + "13 linear-mode lidar None 2019-08-21 2019-09-19 2021-03-12 \n", + "\n", + " metadata_link internal_uuid \\\n", + "0 None None \n", + "1 None None \n", + "2 None None \n", + "3 None None \n", + "4 None None \n", + "5 None None \n", + "6 None None \n", + "7 None None \n", + "8 None None \n", + "9 None None \n", + "10 None None \n", + "11 https://prd-tnm.s3.amazonaws.com/index.html?pr... None \n", + "12 https://prd-tnm.s3.amazonaws.com/index.html?pr... None \n", + "13 https://prd-tnm.s3.amazonaws.com/index.html?pr... None \n", + "\n", + " geometry \n", + "0 MULTIPOLYGON (((-106.99106 38.99655, -106.9908... \n", + "1 MULTIPOLYGON (((-106.1256 38.93334, -106.12583... \n", + "2 MULTIPOLYGON (((-105.99953 38.80491, -105.9995... \n", + "3 MULTIPOLYGON (((-106 38.875, -106.00055 38.875... \n", + "4 MULTIPOLYGON (((-106.0006 38.80658, -106.00083... \n", + "5 MULTIPOLYGON (((-106 39.00005, -106 39, -106.0... \n", + "6 MULTIPOLYGON (((-106.10139 38.91186, -106.1014... \n", + "7 MULTIPOLYGON (((-106.0006 39, -106.0006 39, -1... \n", + "8 MULTIPOLYGON (((-106.00119 38.42658, -106.0011... \n", + "9 MULTIPOLYGON (((-106.12555 39.00005, -106.1255... \n", + "10 MULTIPOLYGON (((-106.09823 38.90898, -106.0981... \n", + "11 MULTIPOLYGON (((-107.0003 38.52293, -107.00011... \n", + "12 MULTIPOLYGON (((-106.99998 38.14333, -106.9999... \n", + "13 MULTIPOLYGON (((-106.99994 38.96877, -106.9999... " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Just treat polygon boundaries as EPSG:4326\n", + "gf = gf.to_crs('EPSG:4326')\n", + "gf" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Make this Notebook Trusted to load map: File -> Trust Notebook
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Interesting! Going into this tile we have 13 different data sources. Some going back to 1958\n", + "# Which dataset is out query point accessing?\n", + "point=gpd.GeoSeries(gpd.points_from_xy(x=[-106.50000], y=[38.50000], crs='EPSG:4326'))\n", + "m = gf.explore(column='workpackage')\n", + "point.explore(m=m, color='magenta')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## PROJ Transforms" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Candidate operations found: 22\n", + "-------------------------------------\n", + "Operation No. 1:\n", + "\n", + "unknown id, Inverse of NAD83(2011) to NAVD88 height (3) + NAD83(2011) to WGS 84 (1) + WGS 84 to WGS 84 (G1150), 4.015 m, United States (USA) - CONUS onshore - Alabama; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; South Dakota; Tennessee; Texas; Utah; Vermont; Virginia; Washington; West Virginia; Wisconsin; Wyoming.\n", + "\n", + "PROJ string:\n", + "+proj=pipeline\n", + " +step +proj=axisswap +order=2,1\n", + " +step +proj=unitconvert +xy_in=deg +xy_out=rad\n", + " +step +proj=vgridshift +grids=us_noaa_g2018u0.tif +multiplier=1\n", + " +step +proj=unitconvert +xy_in=rad +xy_out=deg\n", + " +step +proj=axisswap +order=2,1\n", + "\n", + "-------------------------------------\n", + "Operation No. 2:\n", + "\n", + "unknown id, Inverse of NAD83(NSRS2007) to NAD83(2011) (1) + Inverse of NAD83(NSRS2007) to NAVD88 height (1) + NAD83(NSRS2007) to WGS 84 (1) + WGS 84 to WGS 84 (G1150), 4.1 m, United States (USA) - CONUS onshore - Alabama; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; South Dakota; Tennessee; Texas; Utah; Vermont; Virginia; Washington; West Virginia; Wisconsin; Wyoming.\n", + "\n", + "PROJ string:\n" + ] + } + ], + "source": [ + "# To WGS84 1150\n", + "# top transform is to just apply a vertical shift grid us_noaa_g2018u0.tif\n", + "!projinfo -s EPSG:6318+5703 -t EPSG:7661 -o PROJ --hide-ballpark --spatial-test intersects | head -n 20" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Candidate operations found: 42\n", + "-------------------------------------\n", + "Operation No. 1:\n", + "\n", + "unknown id, Inverse of NAD83(2011) to NAVD88 height (3) + Conversion from NAD83(2011) (geog3D) to NAD83(2011) (geocentric) + Inverse of ITRF2014 to NAD83(2011) (1) + Conversion from ITRF2014 (geocentric) to ITRF2014 (geog3D), 0.015 m, United States (USA) - CONUS onshore - Alabama; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; South Dakota; Tennessee; Texas; Utah; Vermont; Virginia; Washington; West Virginia; Wisconsin; Wyoming.\n", + "\n", + "PROJ string:\n", + "+proj=pipeline\n", + " +step +proj=axisswap +order=2,1\n", + " +step +proj=unitconvert +xy_in=deg +xy_out=rad\n", + " +step +proj=vgridshift +grids=us_noaa_g2018u0.tif +multiplier=1\n", + " +step +proj=cart +ellps=GRS80\n", + " +step +inv +proj=helmert +x=1.0053 +y=-1.90921 +z=-0.54157 +rx=0.02678138\n", + " +ry=-0.00042027 +rz=0.01093206 +s=0.00036891 +dx=0.00079 +dy=-0.0006\n", + " +dz=-0.00144 +drx=6.667e-05 +dry=-0.00075744 +drz=-5.133e-05\n", + " +ds=-7.201e-05 +t_epoch=2010 +convention=coordinate_frame\n", + " +step +inv +proj=cart +ellps=GRS80\n", + " +step +proj=unitconvert +xy_in=rad +xy_out=deg\n", + " +step +proj=axisswap +order=2,1\n", + "\n", + "-------------------------------------\n", + "Operation No. 2:\n", + "\n", + "unknown id, Inverse of NAD83(NSRS2007) to NAD83(2011) (1) + Inverse of NAD83(NSRS2007) to NAVD88 height (1) + Null geographic offset from NAD83(NSRS2007) (geog3D) to NAD83(NSRS2007) (geog2D) + NAD83(NSRS2007) to NAD83(2011) (1) + Conversion from NAD83(2011) (geog2D) to NAD83(2011) (geocentric) + Inverse of ITRF2014 to NAD83(2011) (1) + Conversion from ITRF2014 (geocentric) to ITRF2014 (geog3D), 0.15 m, United States (USA) - CONUS onshore - Alabama; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; South Dakota; Tennessee; Texas; Utah; Vermont; Virginia; Washington; West Virginia; Wisconsin; Wyoming.\n", + "\n", + "PROJ string:\n", + "+proj=pipeline\n", + " +step +proj=axisswap +order=2,1\n", + " +step +proj=unitconvert +xy_in=deg +xy_out=rad\n", + " +step +inv +proj=gridshift +no_z_transform\n" + ] + } + ], + "source": [ + "# NOTE: override NAD83 (EPSG:4269) with NAD83(2011) (EPSG:6318)\n", + "!projinfo -s EPSG:6318+5703 -t EPSG:7912 -o PROJ --hide-ballpark --spatial-test intersects | head -n 30" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Annotated pipeline\n", + "\n", + "```bash\n", + "+proj=pipeline\n", + " # Inverse of NAD83(2011) to NAVD88 height\n", + " # (NAVD88 Geoid Height -> NAD83(2011) Ellipsoid Height)\n", + " +step +proj=axisswap +order=2,1 \n", + " +step +proj=unitconvert +xy_in=deg +xy_out=rad\n", + " +step +proj=vgridshift +grids=us_noaa_g2018u0.tif +multiplier=1 \n", + " # Conversion from NAD83(2011) (geog3D) to NAD83(2011) (geocentric)\n", + " +step +proj=cart +ellps=GRS80 \n", + " # Inverse of ITRF2014 to NAD83(2011)\n", + " # (NAD83(2011) 3D -> ITRF2014 3D)\n", + " +step +inv +proj=helmert +x=1.0053 +y=-1.90921 +z=-0.54157 +rx=0.02678138 \n", + " +ry=-0.00042027 +rz=0.01093206 +s=0.00036891 +dx=0.00079 +dy=-0.0006\n", + " +dz=-0.00144 +drx=6.667e-05 +dry=-0.00075744 +drz=-5.133e-05\n", + " +ds=-7.201e-05 +t_epoch=2010 +convention=coordinate_frame \n", + " # Conversion from ITRF2014 (geocentric) to ITRF2014 (geog3D)\n", + " +step +inv +proj=cart +ellps=GRS80\n", + " +step +proj=unitconvert +xy_in=rad +xy_out=deg\n", + " +step +proj=axisswap +order=2,1\n", + "````" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+proj=pipeline +step +proj=axisswap +order=2,1 +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=vgridshift +grids=us_noaa_g2018u0.tif +multiplier=1 +step +proj=cart +ellps=GRS80 +step +inv +proj=helmert +x=1.0053 +y=-1.90921 +z=-0.54157 +rx=0.02678138 +ry=-0.00042027 +rz=0.01093206 +s=0.00036891 +dx=0.00079 +dy=-0.0006 +dz=-0.00144 +drx=6.667e-05 +dry=-0.00075744 +drz=-5.133e-05 +ds=-7.201e-05 +t_epoch=2010 +convention=coordinate_frame +step +inv +proj=cart +ellps=GRS80 +step +proj=unitconvert +xy_in=rad +xy_out=deg +step +proj=axisswap +order=2,1\n" + ] + } + ], + "source": [ + "# Top ranked transform as single line to pass to GDAL\n", + "!projinfo -s EPSG:6318+5703 -t EPSG:7912 -o PROJ --hide-ballpark --spatial-test intersects --single-line -q" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+proj=pipeline +step +proj=axisswap +order=2,1 +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=vgridshift +grids=us_noaa_g2018u0.tif +multiplier=1 +step +proj=cart +ellps=GRS80 +step +inv +proj=helmert +x=1.0053 +y=-1.90921 +z=-0.54157 +rx=0.02678138 +ry=-0.00042027 +rz=0.01093206 +s=0.00036891 +dx=0.00079 +dy=-0.0006 +dz=-0.00144 +drx=6.667e-05 +dry=-0.00075744 +drz=-5.133e-05 +ds=-7.201e-05 +t_epoch=2010 +convention=coordinate_frame +step +inv +proj=cart +ellps=GRS80 +step +proj=unitconvert +xy_in=rad +xy_out=deg +step +proj=axisswap +order=2,1\n", + "Creating output file that is 3888006P x 939612L.\n", + "Using internal nodata values (e.g. -999999) for image /vsis3/prd-tnm/StagedProducts/Elevation/13/TIFF/USGS_Seamless_DEM_13.vrt.\n", + "Copying nodata values from source /vsis3/prd-tnm/StagedProducts/Elevation/13/TIFF/USGS_Seamless_DEM_13.vrt to destination USGS_Seamless_DEM_13_7912.vrt.\n", + "Processing /vsis3/prd-tnm/StagedProducts/Elevation/13/TIFF/USGS_Seamless_DEM_13.vrt [1/1] : 0...10...20...30...40...50...60...70...80...90...100 - done.\n" + ] + } + ], + "source": [ + "%%bash\n", + "# VRT of a VRT inception\n", + "\n", + "SSRS='EPSG:9055+5773'\n", + "TSRS='EPSG:7912'\n", + "CPL_DEBUG=OFF GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + "PROJ_PIPELINE='+proj=pipeline +step +proj=axisswap +order=2,1 +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=vgridshift +grids=us_noaa_g2018u0.tif +multiplier=1 +step +proj=cart +ellps=GRS80 +step +inv +proj=helmert +x=1.0053 +y=-1.90921 +z=-0.54157 +rx=0.02678138 +ry=-0.00042027 +rz=0.01093206 +s=0.00036891 +dx=0.00079 +dy=-0.0006 +dz=-0.00144 +drx=6.667e-05 +dry=-0.00075744 +drz=-5.133e-05 +ds=-7.201e-05 +t_epoch=2010 +convention=coordinate_frame +step +inv +proj=cart +ellps=GRS80 +step +proj=unitconvert +xy_in=rad +xy_out=deg +step +proj=axisswap +order=2,1'\n", + "INPUT=/vsis3/prd-tnm/StagedProducts/Elevation/13/TIFF/USGS_Seamless_DEM_13.vrt\n", + "OUTPUT=USGS_Seamless_DEM_13_7912.vrt\n", + "\n", + "echo $PROJ_PIPELINE\n", + "\n", + "CPL_DEBUG=OFF PROJ_DEBUG=2 \\\n", + " PROJ_NETWORK=ON \\\n", + " GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + " AWS_NO_SIGN_REQUEST=YES \\\n", + " gdalwarp -overwrite -wm 500 -co BLOCKXSIZE=256 -co BLOCKYSIZE=256 -te -180.0005556 -15.0005556 180.0000003 72.0005556 -tr 0.000092592592660 0.000092592592660 -r bilinear -ot Float32 -s_srs $SSRS -t_srs $TSRS -ct \"${PROJ_PIPELINE}\" ${INPUT} ${OUTPUT}" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Report:\n", + " Location: (793805.999902109P,361806.000216605L)\n", + " Band 1:\n", + " Value: 2744.60235816757\n" + ] + } + ], + "source": [ + "%%bash\n", + "\n", + "INPUT=USGS_Seamless_DEM_13_7912.vrt\n", + "\n", + "# Value: 2744.60235816757\n", + "\n", + "CPL_DEBUG=OFF GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + " PROJ_NETWORK=ON \\\n", + " PROJ_DEBUG=2 \\\n", + " AWS_NO_SIGN_REQUEST=YES \\\n", + " gdallocationinfo -r bilinear -geoloc $INPUT -106.5000000 38.5000000" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 38.50001 -106.50001 2744.47006 inf\n" + ] + } + ], + "source": [ + "%%bash\n", + "# Hmmmm, stated accuracy of transform is 0.015 m , but seeing a difference of 0.12m\n", + "PROJ_PIPELINE_7912='+proj=pipeline +step +proj=axisswap +order=2,1 +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=vgridshift +grids=us_noaa_g2018u0.tif +multiplier=1 +step +proj=cart +ellps=GRS80 +step +inv +proj=helmert +x=1.0053 +y=-1.90921 +z=-0.54157 +rx=0.02678138 +ry=-0.00042027 +rz=0.01093206 +s=0.00036891 +dx=0.00079 +dy=-0.0006 +dz=-0.00144 +drx=6.667e-05 +dry=-0.00075744 +drz=-5.133e-05 +ds=-7.201e-05 +t_epoch=2010 +convention=coordinate_frame +step +inv +proj=cart +ellps=GRS80 +step +proj=unitconvert +xy_in=rad +xy_out=deg +step +proj=axisswap +order=2,1'\n", + "echo 38.5000000 -106.5000000 2759.5849609375 | cct -d 5 $PROJ_PIPELINE_7912" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "default", + "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.13.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/3dep/USGS_Seamless_DEM_13_7912.vrt b/3dep/USGS_Seamless_DEM_13_7912.vrt new file mode 100644 index 0000000..7190607 --- /dev/null +++ b/3dep/USGS_Seamless_DEM_13_7912.vrt @@ -0,0 +1,46 @@ + + GEOGCRS["ITRF2014",DYNAMIC[FRAMEEPOCH[2010]],DATUM["International Terrestrial Reference Frame 2014",ELLIPSOID["GRS 1980",6378137,298.257222101,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,3],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],AXIS["ellipsoidal height (h)",up,ORDER[3],LENGTHUNIT["metre",1]],USAGE[SCOPE["Geodesy."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",7912]] + -1.8000055560000001e+02, 9.2592592659999998e-05, 0.0000000000000000e+00, 7.2000555599999998e+01, 0.0000000000000000e+00, -9.2592592659999998e-05 + + -999999 + Gray + + 256 + 256 + + 5.24288e+08 + Bilinear + Float32 + + + + + + /vsis3/prd-tnm/StagedProducts/Elevation/13/TIFF/USGS_Seamless_DEM_13.vrt + + + -180.00055555609359,9.2592592660220417e-05,0,72.000555556294898,0,-9.25925926599094e-05 + 1944005.9985859466,10799.999992111891,0,777605.99944264861,0,-10799.999992148167 + -180.00055560000001,9.2592592659999998e-05,0,72.000555599999998,0,-9.2592592659999998e-05 + 1944005.9990647638,10799.9999921376,0,777605.99991390284,0,-10799.9999921376 + + + COMPD_CS["WGS 84 (G1150) + EGM96 height",GEOGCS["WGS 84 (G1150)",DATUM["World_Geodetic_System_1984_G1150",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","1154"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","9055"]],VERT_CS["EGM96 height",VERT_DATUM["EGM96 geoid",2005,AUTHORITY["EPSG","5171"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Gravity-related height",UP],AUTHORITY["EPSG","5773"]]] + GEOGCRS["ITRF2014",DYNAMIC[FRAMEEPOCH[2010]],DATUM["International Terrestrial Reference Frame 2014",ELLIPSOID["GRS 1980",6378137,298.257222101,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,3],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],AXIS["ellipsoidal height (h)",up,ORDER[3],LENGTHUNIT["metre",1]],USAGE[SCOPE["Geodesy."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",7912]] + + + + + + + + + + -999999 + 0 + -999999 + 0 + + + + diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..106ee85 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,43 @@ +# Contributing Guide + +Contributions are welcome here! + +- Report bugs, request features or submit feedback as a [GitHub Issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/about-issues). + + +## Fork this repository + +We recommend first forking this repository and creating a local copy: + +``` +git clone https://github.com/YOURACCOUNT/3D_CRS_Transformation_Resources.git +cd xarray-tutorial +``` + +## Add content + +Develop your new content on a branch. See [JupyterBook Docs](https://jupyterbook.org/en/stable/intro.html) for guides on adding `.md`, `.ipynb` and other content. + +``` +git checkout -b newcontent +``` + +## Preview your changes + +Jupyter Book will execute notebooks and render HTML pages for the website. Be sure to fix any execution errors and preview the website in your web browser to make sure everything looks good! + +``` +pixi run website +``` + +Happy with how things look? Finally, open a pull request to merge you changes: + +## Open a pull request + +``` +git add . +git commit -m "added pages x,y and improved z" +git push +``` + +Follow the link reported in a terminal to open a pull request! diff --git a/README.md b/README.md index 2039363..86994a2 100644 --- a/README.md +++ b/README.md @@ -1,218 +1,18 @@ # 3D CRS Transformation Resources -A centralized repository for resources, documentation and code samples to help the community navigate the confusing, complex, but very important topic of 3D coordinate reference system (CRS) transformations when combining datasets for precise geodetic analysis. - -This repository was initially created for an improptu community tutorial session led by David Shean and Scott Henderson at the 2023 UW/NASA [ICESat-2 Hackweek event](https://icesat-2-2023.hackweek.io/). We are continuing to review and update materials, including new recipes and examples for commonly used 3D datasets. - -## Background -* Awesome ICESat-2 Hackweek 2022 Tutorial from Tyler, Hannah and Scott: https://icesat-2-2022.hackweek.io/tutorials/geospatial/geospatial-advanced.html?highlight=datum -* NSIDC notebook on `iceflow` tool (Kevin Beam) for combining (ICESat, Operation IceBridge and ICESat-2): https://github.com/nsidc/NSIDC-Data-Tutorials/blob/main/notebooks/iceflow/corrections.ipynb -* David's GDA module on CRS and projections: https://uwgda-jupyterbook.readthedocs.io/en/latest/modules/04_Vector1_Geopandas_CRS_Proj/04_Vector1_Geopandas_CRS_Proj_prep.html - -### More resources specific to North America -* https://geodesy.noaa.gov/corbin/class_description/NGS_Video_Library.shtml - * What are Geodetic Datums? - * How Were Geodetic Datums Established? - * What Is the Status of Today’s Geodetic Datums? - * What’s Next for Geodetic Datums? -* https://www.meted.ucar.edu/oceans/navy_geodesy/ -* PSU Course GPS and GNSS for Geospatial Professionals (Lesson 5): https://www.e-education.psu.edu/geog862/node/1669 -* https://www.dnr.wa.gov/publications/eng_plso_state_plane_coord_refresher.pdf -* https://www.uvm.edu/giv/resources/WGS84_NAD83.pdf - -### Why is this so complicated!? -* The Earth's surface/shape is constantly changing -* Our ability to measure the Earth's surface/shape and locations on the surface continues to improve (Thanks GNSS!) -* The systems used to define coordinate systems and datums continues to evolve -* The support for these systems in open-source tools continue to evolve, with a lot of confusing and/or outdated documentation out there on the web -* There is a long (fascinating) history of surveying approaches, measurements, correction approaches, and definitions -* Many legacy datasets use older CRS definitions -* Many datasets have missing CRS information in metadata, sometimes incorrect information -* The acronyms used for different CRS and datums can feel like alphabet soup: NAD83, WGS84, GRS80, NAVD88, EGM, ITRF - -### What is a CRS? -#### How are they defined? -* https://uwgda-jupyterbook.readthedocs.io/en/latest/modules/04_Vector1_Geopandas_CRS_Proj/04_Vector1_Geopandas_CRS_Proj_demo.html#crs-and-projections -* Emerging json definitions (in parallel with WKT): https://github.com/opengeospatial/CRS-JSON-Encoding -#### EPSG codes vs. proj strings vs WKT -### Horizontal CRS -#### Ellipsoid models -* https://proj.org/en/9.2/_images/general_ellipsoid.png -### Vertical CRS -#### Geoid models -### Projections -### ITRF Realizations -### epochs, time and plate deformation models -* Plate motion ~1-8 cm/yr -### Specific notes for North America -* https://geodesy.noaa.gov/datums/index.shtml -* https://geodesy.noaa.gov/datums/newdatums/background.shtml -* There is hope! https://geodesy.noaa.gov/datums/newdatums/index.shtml - * https://xkcd.com/2920/ - -### Transformations -* Allows you to go back and forth between different CRS -* You've all done this - convert from cartesian to polar coordiantes (high school math) -* Can be 2D or 3D -* Most open-source packages depend on PROJ library (https://proj.org/) for CRS support and transformations -### Vector -* `pyproj`: Python interface for PROJ -* `GeoPandas` uses pyproj under the hood for CRS transformations, with support for compound 3D CRS -### Raster -* `gdalwarp` with proper CRS definitions (and available vertical offset grids) should work - -## Common datasets and CRS definitions -### ICESat-2 -### Raster DEMs -#### ArcticDEM/REMA/EarthDEM products from PGC -* These are distributed as 2D projected CRS (EPSG:3031 or EPSG:3413), without a vertical datum definition -* Elevation values are "height above the WGS84 ellipsoid" - but no details about specific realization used by vendor (Maxar) providing source stereo imagery -* Most of the Maxar data were acquired and delivered after 2008, so should be using more modern realizations of ITRF (2008, 2014, 2020), which are similar -* Can likely assume ITRF2014 for most of the available DEM products -* Can use custom WKT2 definintions for these 3D CRS: - * Antarctica: https://github.com/ICESat2-SlideRule/sliderule/blob/cb8ead40d761c8d637397a28e7b6d53fcf1de3c4/plugins/pgc/plugin/ITRF2014_3031.wkt - * Arctic: https://github.com/ICESat2-SlideRule/sliderule/blob/cb8ead40d761c8d637397a28e7b6d53fcf1de3c4/plugins/pgc/plugin/ITRF2014_3413.wkt -#### Copernicus 30 m DEM -* EPSG:9518 (WGS84 + EGM2008) -### Point clouds and altimetry -#### 3DEP lidar -* NAD83(2011) horizontal with NAVD88 vertical datum -* Projection is Local UTM Zone -* EPSG:6339+5703 (example for UTM Zone 10N with NAVD88 datum, https://epsg.io/6339) - * Note: this is not the same as EPSG:32610 (WGS84) or EPSG:26910 (NAD83), because we are using NAD83(2011) realization -#### WA DNR -* EPSG:2926+5703 (WA state plane N) -* EPSG:2927+5703 (WA state plane S) -* NAVD88 model should be geoid2012 (I think, need to confirm) +[![Jupyter Book Badge](https://jupyterbook.org/badge.svg)](https://uw-cryo.github.io/3D_CRS_Transformation_Resources/) -## :warning: Setup -1. `conda install gdal pdal geopandas` or `conda update gdal pdal geopandas` - * Make sure you are using latest PROJ (>9.2 required for improved North American datum support) -2. Retrieve the vertical datum offset grids for your area of interest with https://proj.org/en/9.2/apps/projsync.html -`projsync --all` - -## Examples -### Check your dataset metadata -* `gdalinfo` -* Review documentation, lidar reports, etc. - -### ICESat-2 to other CRS -``` -# Fake some 3D data but with epsg:4326 -gf_orig = gpd.GeoDataFrame(geometry=gpd.points_from_xy([-120.4], [48.6], [1400]), crs='EPSG:4326') - -# override 4326 with 3D CRS and do a 3D transform (uses pyproj under the hood): -gf_new = gf.set_crs(epsg=7912, allow_override=True) - -gf_new.to_crs(epsg="2927+5703") -``` -### Other CRS to ICESat-2 - -## Testing and validation -### vdatum (https://vdatum.noaa.gov/) -### `cs2cs` -`echo -120.4 48.6 1400 | PROJ_DEBUG=2 PROJ_NETWORK=ON cs2cs -f "%.3f" -r epsg:7912 epsg:2927+5703` -### `projinfo` -`projinfo -s EPSG:7912 -t EPSG:2927+5703 -o PROJ --hide-ballpark --spatial-test intersects` -``` - Candidate operations found: 5 -------------------------------------- -Operation No. 1: -unknown id, Inverse of Conversion from ITRF2014 (geocentric) to ITRF2014 (geog3D) + ITRF2014 to NAD83(2011) (1) + Inverse of Conversion from NAD83(2011) (geog3D) to NAD83(2011) (geocentric) + NAD83(2011) to NAVD88 height (3) + Inver -se of NAD83(HARN) to NAD83(2011) (NADCON5, CONUS) + SPCS83 Washington South zone (US Survey feet), 0.105 m, United States (USA) - CONUS onshore - Alabama; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Geor -gia; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina -; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; South Dakota; Tennessee; Texas; Utah; Vermont; Virginia; Washington; West Virginia; Wisconsin; Wyoming. -PROJ string: -+proj=pipeline - +step +proj=axisswap +order=2,1 - +step +proj=unitconvert +xy_in=deg +xy_out=rad - +step +proj=cart +ellps=GRS80 - +step +proj=helmert +x=1.0053 +y=-1.90921 +z=-0.54157 +rx=0.02678138 - +ry=-0.00042027 +rz=0.01093206 +s=0.00036891 +dx=0.00079 +dy=-0.0006 - +dz=-0.00144 +drx=6.667e-05 +dry=-0.00075744 +drz=-5.133e-05 - +ds=-7.201e-05 +t_epoch=2010 +convention=coordinate_frame - +step +inv +proj=cart +ellps=GRS80 - +step +inv +proj=vgridshift +grids=us_noaa_g2018u0.tif +multiplier=1 - +step +inv +proj=gridshift +no_z_transform - +grids=us_noaa_nadcon5_nad83_2007_nad83_2011_conus.tif - +step +inv +proj=gridshift +no_z_transform - +grids=us_noaa_nadcon5_nad83_fbn_nad83_2007_conus.tif - +step +inv +proj=gridshift +no_z_transform - +grids=us_noaa_nadcon5_nad83_harn_nad83_fbn_conus.tif - +step +proj=lcc +lat_0=45.3333333333333 +lon_0=-120.5 +lat_1=47.3333333333333 - +lat_2=45.8333333333333 +x_0=500000.0001016 +y_0=0 +ellps=GRS80 - +step +proj=unitconvert +xy_in=m +xy_out=us-ft - ``` -* Note the 0.105 m uncertainty - -## WA DNR LiDAR products -The Washington Department of Natural Resources maintains an excellent lidar portal with subsetting of standardized DSM and DTM products, as well as download of the lidar point clouds. See here: https://lidarportal.dnr.wa.gov/ - -### Combining separate lidar tiles in a vrt -Your selected area of interest on the DNR portal may cross the boundaries of the original tiled lidar data. So you will get multiple small DSM/DTM tiles. You can combine these in a virtual raster (vrt) using the `gdalbuildvrt` command (https://gdal.org/programs/gdalbuildvrt.html): -`gdalbuildvrt out_raster.vrt tile1.tif tile2.tif tile3.tif` - -Check with gdalinfo: `gdalinfo out_raster.vrt` - -Output dimensions and geographic extent should be larger than any individual tile. +A centralized repository for resources, documentation and code samples to help the community navigate the confusing, complex, but very important topic of 3D coordinate reference system (CRS) transformations when combining datasets for precise geodetic analysis. -Note: To combine multiple point cloud tiles (las/laz), you can use PDAL merge command (https://pdal.io/en/2.6.0/apps/merge.html): -`pdal merge tile1.laz tile2.laz tile3.laz out_merged.laz` +This repository was initially created for an improptu community tutorial session led by David Shean and Scott Henderson at the 2023 UW/NASA [ICESat-2 Hackweek event](https://icesat-2-2023.hackweek.io/). -### Coordinate system transformation -All products are distributed using one of two default CRS: either WA State Plane North or WA State Plane South, both using the NAD83(HARN) horizontal datum and the NAVD88 vertical datum (unsure if geoid2012 or geoid2018?), with all horizontal and vertical units in U.S. Survey Feet. There are historical reasons for these choices -* EPSG:2926 - NAD83(HARN) / Washington North (ftUS), https://www.spatialreference.org/ref/epsg/2926/ -* EPSG:2927 - NAD83(HARN) / Washington South (ftUS), https://www.spatialreference.org/ref/epsg/2927/ -* EPSG:6360 - NAVD88 height (ftUS) +We are continuing to review and update materials, including new recipes and examples for commonly used 3D datasets. The best way to navigate the material is via the Jupyter Book website (linked with the button above). -PROJ information about conversion from these coordinate systems to UTM Zone 10N WGS84 with height in meters above the ellipsoid: +## Running code examples +If you want to execute code examples, we recommend [pixi.sh](https://pixi.sh/latest/) for managing the Python evironment: -`projinfo -s EPSG:2927+6360 -t EPSG:32610+4979 -o PROJ --hide-ballpark --spatial-test intersects | less` ``` -Candidate operations found: 17 -------------------------------------- -Operation No. 1: - -unknown id, Inverse of SPCS83 Washington South zone (US Survey feet) + Conversion from NAVD88 height (ftUS) to NAVD88 height + Inverse of NAD83(HARN) to NAVD88 height (1) + NAD83(H -ARN) to WGS 84 (3) + UTM zone 10N, 1.05 m, United States (USA) - CONUS onshore north of 41°N and west of 112°W - Oregon and Washington; California and Nevada north of 41°N; Utah no -rth of 41°N and west of 112°W; Idaho and Montana west of 112°W. - -PROJ string: -+proj=pipeline - +step +proj=unitconvert +xy_in=us-ft +xy_out=m - +step +inv +proj=lcc +lat_0=45.3333333333333 +lon_0=-120.5 - +lat_1=47.3333333333333 +lat_2=45.8333333333333 +x_0=500000.0001016 - +y_0=0 +ellps=GRS80 - +step +proj=unitconvert +z_in=us-ft +z_out=m - +step +proj=vgridshift +grids=us_noaa_g1999u01.tif +multiplier=1 - +step +proj=cart +ellps=GRS80 - +step +proj=helmert +x=-0.991 +y=1.9072 +z=0.5129 +rx=-0.0257899075194932 - +ry=-0.0096500989602704 +rz=-0.0116599432323421 +s=0 - +convention=coordinate_frame - +step +inv +proj=cart +ellps=WGS84 - +step +proj=utm +zone=10 +ellps=WGS84 +git clone https://github.com/uw-cryo/3D_CRS_Transformation_Resources.git +pixi shell ``` -There are 17 different possible operations, with subtle differences (and uncertainty) depending on the NAD83 and NAVD88 definitions and offset grids used. To be more precise, we should also unambiguously define the WGS84 realization (not just "WGS84"), but there are no convenient EPSG codes for UTM projections using "WGS 84 (G1762)", so we will need to create a custom WKT CRS (to be done later). - -Sample gdalwarp command to transform sample WA DNR LiDAR product for Island County, WA, with output CRS of: - -#### WGS84 UTM 10N with height in meters above the WGS84 ellipsoid, and output posting of 1 m: - -`gdalwarp -s_srs EPSG:2927+6360 -t_srs EPSG:32610+4979 -tr 1.0 1.0 -r cubic -dstnodata -9999 -co COMPRESS=LZW -co TILED=YES -co BIGTIFF=IF_SAFER island_2014_dsm_13.tif island_2014_dsm_13_UTM10N_wgs84.tif` - -#### NAD83(2011) UTM 10N with height in meters above the NAD83(2011) ellipsoid, and output posting of 1 m -`gdalwarp -s_srs EPSG:2927+6360 -t_srs EPSG:6339+6319 -tr 1.0 1.0 -r cubic -dstnodata -9999 -co COMPRESS=LZW -co TILED=YES -co BIGTIFF=IF_SAFER island_2014_dsm_13.tif island_2014_dsm_13_UTM10N_nad83_2011.tif` - -Check output CRS with gdalinfo: `gdalinfo island_2014_dsm_13_UTM10N_nad83_2011.tif` - -Should have the horizontal CRS and a vertical CRS defined with units of meters. - -## Gotchas and other notes -* There is no perfect transformation approach, and all transformations have some uncertainty - * https://vdatum.noaa.gov/docs/est_uncertainties.html -* There are many possible ways to go from one CRS to another, the PROJ pipelines allow you to control this -* Many CRS (esp compound or 3D CRS) don't have EPSG codes - you can define the CRS with machine-readable, well-known text (use WKT2) - -## Other resources -* Comparison of values with different versions of the NAVD88 geoid (geoid2018 vs geoid2012): https://gist.github.com/scottyhq/bf13033a9655f302e8f9dc9235daf9fc diff --git a/globaldems/nasadem-ellipsoid.gti.vrt b/globaldems/nasadem-ellipsoid.gti.vrt new file mode 100644 index 0000000..88c4e9d --- /dev/null +++ b/globaldems/nasadem-ellipsoid.gti.vrt @@ -0,0 +1,39 @@ + + GEOGCRS["WGS 84 (G1150)",DYNAMIC[FRAMEEPOCH[2001]],DATUM["World Geodetic System 1984 (G1150)",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,3],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],AXIS["ellipsoidal height (h)",up,ORDER[3],LENGTHUNIT["metre",1]],USAGE[SCOPE["Geodesy. Navigation and positioning using GPS satellite system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",7661]] + -1.8000013890000000e+02, 2.7777777779492454e-04, 0.0000000000000000e+00, 6.0000138900000003e+01, 0.0000000000000000e+00, -2.7777777783099178e-04 + + 512 + 512 + + 5.24288e+08 + Bilinear + Float32 + + + + + + nasadem.gti + + + -180.0001388888889,0.00027777777777781459,0,60.000138888888891,0,-0.00027777777777781459 + 648000.4999999142,3599.999999999523,0,216000.49999997139,0,-3599.999999999523 + -180.0001389,0.00027777777779492454,0,60.000138900000003,0,-0.00027777777783099178 + 648000.5,3599.9999997777777,0,216000.49999862071,0,-3599.9999993103465 + + + COMPD_CS["WGS 84 + EGM96 height",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]],VERT_CS["EGM96 height",VERT_DATUM["EGM96 geoid",2005,AUTHORITY["EPSG","5171"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Gravity-related height",UP],AUTHORITY["EPSG","5773"]],AUTHORITY["EPSG","9707"]] + GEOGCRS["WGS 84 (G1150)",DYNAMIC[FRAMEEPOCH[2001]],DATUM["World Geodetic System 1984 (G1150)",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,3],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],AXIS["ellipsoidal height (h)",up,ORDER[3],LENGTHUNIT["metre",1]],USAGE[SCOPE["Geodesy. Navigation and positioning using GPS satellite system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",7661]] + + + + + + + + + + + + + diff --git a/globaldems/nasadem.gti b/globaldems/nasadem.gti new file mode 100644 index 0000000..2d1a2b0 --- /dev/null +++ b/globaldems/nasadem.gti @@ -0,0 +1,9 @@ + + /vsiaz/items/nasadem.parquet + assets.elevation.href + -1.8000013888888890e+02, 2.7777777777781459e-04,0.0000000000000000e+00,6.0000138888888891e+01,0.0000000000000000e+00,-2.7777777777781459e-04 + 1296001 + 417601 + 1 + Int16 + diff --git a/globaldems/nasadem.ipynb b/globaldems/nasadem.ipynb new file mode 100644 index 0000000..cb60649 --- /dev/null +++ b/globaldems/nasadem.ipynb @@ -0,0 +1,703 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# NASADEM\n", + "\n", + "It's reprocessed SRTM, so assume the same vertical reference as SRTM:\n", + "\n", + "WGS (G1150) 3D + EGM1996 = EPSG:9055+5773 \n", + "\n", + "https://spatialreference.org/ref/epsg/9055/ \n", + "\n", + "https://spatialreference.org/ref/epsg/5773/\n", + "\n", + "https://portal.opentopography.org/datasetMetadata?otCollectionID=OT.032021.4326.2\n", + "\n", + "Also on Planetary Computer:\n", + "https://planetarycomputer.microsoft.com/dataset/nasadem\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Driver: VRT/Virtual Raster\n", + "Size is 1288801, 421201\n", + "Coordinate System is:\n", + "GEOGCRS[\"WGS 84\",\n", + " DATUM[\"World Geodetic System 1984\",\n", + " ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n", + " LENGTHUNIT[\"metre\",1]]],\n", + " PRIMEM[\"Greenwich\",0,\n", + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n", + " CS[ellipsoidal,2],\n", + " AXIS[\"geodetic latitude (Lat)\",north,\n", + " ORDER[1],\n", + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n", + " AXIS[\"geodetic longitude (Lon)\",east,\n", + " ORDER[2],\n", + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n", + " ID[\"EPSG\",4326]]\n", + "Data axis to CRS axis mapping: 2,1\n", + "Origin = (-179.000138888888898,61.000138888888891)\n", + "Pixel Size = (0.000277777777778,-0.000277777777778)\n", + "Corner Coordinates:\n", + "Upper Left (-179.0001389, 61.0001389) (179d 0' 0.50\"W, 61d 0' 0.50\"N)\n", + "Lower Left (-179.0001389, -56.0001389) (179d 0' 0.50\"W, 56d 0' 0.50\"S)\n", + "Upper Right ( 179.0001389, 61.0001389) (179d 0' 0.50\"E, 61d 0' 0.50\"N)\n", + "Lower Right ( 179.0001389, -56.0001389) (179d 0' 0.50\"E, 56d 0' 0.50\"S)\n", + "Center ( 0.0000000, 2.5000000) ( 0d 0' 0.00\"E, 2d30' 0.00\"N)\n", + "Band 1 Block=128x128 Type=Int16, ColorInterp=Gray\n", + " NoData Value=-32768\n" + ] + } + ], + "source": [ + "%%bash\n", + "\n", + "INPUT=/vsicurl/https://opentopography.s3.sdsc.edu/raster/NASADEM/NASADEM_be.vrt\n", + "CPL_DEBUG=OFF GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + " gdalinfo -nofl $INPUT" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "#%%bash\n", + "# Also inspect a single tile:\n", + "#GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + "# gdalinfo /vsicurl/https://opentopography.s3.sdsc.edu/raster/NASADEM/NASADEM_be/NASADEM_HGT_n38w107.tif" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Report:\n", + " Location: (261000P,81000L)\n", + " Band 1:\n", + " /vsicurl/https://opentopography.s3.sdsc.edu/raster/NASADEM/NASADEM_be/NASADEM_HGT_n38w107.tif\n", + " Value: 2762\n" + ] + } + ], + "source": [ + "%%bash\n", + "\n", + "INPUT=/vsicurl/https://opentopography.s3.sdsc.edu/raster/NASADEM/NASADEM_be.vrt\n", + "CPL_DEBUG=OFF GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + " gdallocationinfo -geoloc $INPUT -106.500 38.500" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Convert to Ellipsoid Height \n", + "\n", + "Combined vertical shift grid + helmert transform https://github.com/OSGeo/PROJ/issues/4362\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Creating output file that is 1288801P x 421201L.\n", + "Using internal nodata values (e.g. -32768) for image /vsicurl/https://opentopography.s3.sdsc.edu/raster/NASADEM/NASADEM_be.vrt.\n", + "Copying nodata values from source /vsicurl/https://opentopography.s3.sdsc.edu/raster/NASADEM/NASADEM_be.vrt to destination nasadem_7661.vrt.\n", + "Processing /vsicurl/https://opentopography.s3.sdsc.edu/raster/NASADEM/NASADEM_be.vrt [1/1] : 0...10...20...30...40...50...60...70...80...90...100 - done.\n" + ] + } + ], + "source": [ + "%%bash\n", + "\n", + "SSRS='EPSG:9055+5773'\n", + "TSRS='EPSG:7661'\n", + "PROJ_PIPELINE=`projinfo -s EPSG:9055+5773 -t EPSG:7661 -o PROJ --hide-ballpark -q --single-line`\n", + "INPUT=/vsicurl/https://opentopography.s3.sdsc.edu/raster/NASADEM/NASADEM_be.vrt\n", + "OUTPUT=nasadem_7661.vrt\n", + "\n", + "CPL_DEBUG=OFF PROJ_DEBUG=2 \\\n", + " PROJ_NETWORK=ON \\\n", + " GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + " gdalwarp -overwrite -wm 500 -r bilinear -ot Float32 -te -179.0001389 -56.0001389 179.0001389 61.0001389 -s_srs $SSRS -t_srs $TSRS -ct \"${PROJ_PIPELINE}\" ${INPUT} ${OUTPUT}\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Report:\n", + " Location: (261000P,81000L)\n", + " Band 1:\n", + " Value: 2747.1591796875\n" + ] + } + ], + "source": [ + "%%bash\n", + "\n", + "INPUT=nasadem_7661.vrt\n", + "CPL_DEBUG=OFF GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + " gdallocationinfo -geoloc $INPUT -106.500 38.500" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'+proj=pipeline +step +proj=axisswap +order=2,1 +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=vgridshift +grids=us_nga_egm96_15.tif +multiplier=1 +step +proj=cart +ellps=WGS84 +step +proj=helmert +x=-0.0007 +y=-0.0012 +z=0.0261 +rx=0 +ry=0 +rz=0 +s=-0.00212 +dx=-0.0001 +dy=-0.0001 +dz=0.0019 +drx=0 +dry=0 +drz=0 +ds=-0.00011 +t_epoch=2010 +convention=position_vector +step +inv +proj=cart +ellps=GRS80 +step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m +step +proj=axisswap +order=2,1'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#projinfo -s EPSG:9055+5773 -t EPSG:7661 -o PROJ --hide-ballpark -q --single-line\n", + "#projinfo -s EPSG:9055 -t EPSG:7912 -o PROJ --hide-ballpark --single-line -q\n", + "pipeline='''+proj=pipeline\n", + " +step +proj=axisswap +order=2,1\n", + " +step +proj=unitconvert +xy_in=deg +xy_out=rad\n", + " +step +proj=vgridshift +grids=us_nga_egm96_15.tif +multiplier=1\n", + " +step +proj=cart +ellps=WGS84\n", + " +step +proj=helmert +x=-0.0007 +y=-0.0012 +z=0.0261 +rx=0 +ry=0 +rz=0\n", + " +s=-0.00212 +dx=-0.0001 +dy=-0.0001 +dz=0.0019 +drx=0 +dry=0 +drz=0\n", + " +ds=-0.00011 +t_epoch=2010 +convention=position_vector\n", + " +step +inv +proj=cart +ellps=GRS80\n", + " +step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m\n", + " +step +proj=axisswap +order=2,1'''\n", + "pipeline.replace('\\n','')" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Creating output file that is 1288801P x 421201L.\n", + "Using internal nodata values (e.g. -32768) for image /vsicurl/https://opentopography.s3.sdsc.edu/raster/NASADEM/NASADEM_be.vrt.\n", + "Copying nodata values from source /vsicurl/https://opentopography.s3.sdsc.edu/raster/NASADEM/NASADEM_be.vrt to destination nasadem_7912.vrt.\n", + "Processing /vsicurl/https://opentopography.s3.sdsc.edu/raster/NASADEM/NASADEM_be.vrt [1/1] : 0...10...20...30...40...50...60...70...80...90...100 - done.\n" + ] + } + ], + "source": [ + "%%bash\n", + "\n", + "SSRS='EPSG:9055+5773'\n", + "TSRS='EPSG:7912'\n", + "PROJ_PIPELINE='+proj=pipeline +step +proj=axisswap +order=2,1 +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=vgridshift +grids=us_nga_egm96_15.tif +multiplier=1 +step +proj=cart +ellps=WGS84 +step +proj=helmert +x=-0.0007 +y=-0.0012 +z=0.0261 +rx=0 +ry=0 +rz=0 +s=-0.00212 +dx=-0.0001 +dy=-0.0001 +dz=0.0019 +drx=0 +dry=0 +drz=0 +ds=-0.00011 +t_epoch=2010 +convention=position_vector +step +inv +proj=cart +ellps=GRS80 +step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m +step +proj=axisswap +order=2,1'\n", + "INPUT=/vsicurl/https://opentopography.s3.sdsc.edu/raster/NASADEM/NASADEM_be.vrt\n", + "OUTPUT=nasadem_7912.vrt\n", + "\n", + "CPL_DEBUG=OFF PROJ_DEBUG=2 \\\n", + " PROJ_NETWORK=ON \\\n", + " GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + " gdalwarp -overwrite -wm 500 -r bilinear -ot Float32 -te -179.0001389 -56.0001389 179.0001389 61.0001389 -s_srs $SSRS -t_srs $TSRS -ct \"${PROJ_PIPELINE}\" ${INPUT} ${OUTPUT}\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Report:\n", + " Location: (261000P,81000L)\n", + " Band 1:\n", + " Value: 2747.1611328125\n" + ] + } + ], + "source": [ + "%%bash\n", + "\n", + "INPUT=nasadem_7912.vrt\n", + "CPL_DEBUG=OFF GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + " gdallocationinfo -geoloc $INPUT -106.500 38.500" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Planetary Computer \n", + "\n", + "Here we demonstrate using stac-geoparquet + GDAL GTI instead of a VRT" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO: Open of `/vsiaz/items/nasadem.parquet'\n", + " using driver `Parquet' successful.\n", + "\n", + "Layer name: nasadem\n", + "Geometry: Polygon\n", + "Feature Count: 14520\n", + "Extent: (-179.000139, -56.000139) - (179.000139, 61.000139)\n", + "Layer SRS WKT:\n", + "GEOGCRS[\"WGS 84\",\n", + " ENSEMBLE[\"World Geodetic System 1984 ensemble\",\n", + " MEMBER[\"World Geodetic System 1984 (Transit)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G730)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G873)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G1150)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G1674)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G1762)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G2139)\"],\n", + " ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n", + " LENGTHUNIT[\"metre\",1]],\n", + " ENSEMBLEACCURACY[2.0]],\n", + " PRIMEM[\"Greenwich\",0,\n", + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n", + " CS[ellipsoidal,2],\n", + " AXIS[\"geodetic latitude (Lat)\",north,\n", + " ORDER[1],\n", + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n", + " AXIS[\"geodetic longitude (Lon)\",east,\n", + " ORDER[2],\n", + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n", + " USAGE[\n", + " SCOPE[\"Horizontal component of 3D system.\"],\n", + " AREA[\"World.\"],\n", + " BBOX[-90,-180,90,180]],\n", + " ID[\"EPSG\",4326]]\n", + "Data axis to CRS axis mapping: 2,1\n", + "Geometry Column = geometry\n", + "type: String (0.0)\n", + "stac_version: String (0.0)\n", + "stac_extensions: StringList (0.0)\n", + "id: String (0.0)\n", + "bbox: RealList (0.0)\n", + "links: String(JSON) (0.0)\n", + "assets.elevation.href: String (0.0)\n", + "assets.elevation.roles: StringList (0.0)\n", + "assets.elevation.title: String (0.0)\n", + "assets.elevation.type: String (0.0)\n", + "assets.rendered_preview.href: String (0.0)\n", + "assets.rendered_preview.rel: String (0.0)\n", + "assets.rendered_preview.roles: StringList (0.0)\n", + "assets.rendered_preview.title: String (0.0)\n", + "assets.rendered_preview.type: String (0.0)\n", + "assets.tilejson.href: String (0.0)\n", + "assets.tilejson.roles: StringList (0.0)\n", + "assets.tilejson.title: String (0.0)\n", + "assets.tilejson.type: String (0.0)\n", + "collection: String (0.0)\n", + "datetime: DateTime (UTC)\n", + "proj:bbox: RealList (0.0)\n", + "proj:epsg: Integer64 (0.0)\n", + "proj:shape: Integer64List (0.0)\n", + "proj:transform: RealList (0.0)\n" + ] + } + ], + "source": [ + "%%bash\n", + "# Feature Count: 14520, assets.elevation.href\n", + "CPL_DEBUG=OFF GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + " VSICURL_PC_URL_SIGNING=YES \\\n", + " AZURE_STORAGE_ACCOUNT=pcstacitems \\\n", + " AZURE_STORAGE_SAS_TOKEN=`curl -s https://planetarycomputer.microsoft.com/api/sas/v1/token/pcstacitems/items | jq -r '.token'` \\\n", + " ogrinfo -al -so /vsiaz/items/nasadem.parquet" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Driver: GTI/GDAL Raster Tile Index\n", + "Files: none associated\n", + "Size is 1288802, 421202\n", + "Coordinate System is:\n", + "GEOGCRS[\"WGS 84\",\n", + " ENSEMBLE[\"World Geodetic System 1984 ensemble\",\n", + " MEMBER[\"World Geodetic System 1984 (Transit)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G730)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G873)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G1150)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G1674)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G1762)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G2139)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G2296)\"],\n", + " ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n", + " LENGTHUNIT[\"metre\",1]],\n", + " ENSEMBLEACCURACY[2.0]],\n", + " PRIMEM[\"Greenwich\",0,\n", + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n", + " CS[ellipsoidal,2],\n", + " AXIS[\"geodetic latitude (Lat)\",north,\n", + " ORDER[1],\n", + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n", + " AXIS[\"geodetic longitude (Lon)\",east,\n", + " ORDER[2],\n", + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n", + " USAGE[\n", + " SCOPE[\"Horizontal component of 3D system.\"],\n", + " AREA[\"World.\"],\n", + " BBOX[-90,-180,90,180]],\n", + " ID[\"EPSG\",4326]]\n", + "Data axis to CRS axis mapping: 2,1\n", + "Origin = (-179.000138889999988,61.000138890000002)\n", + "Pixel Size = (0.000277777777778,-0.000277777777778)\n", + "Corner Coordinates:\n", + "Upper Left (-179.0001389, 61.0001389) (179d 0' 0.50\"W, 61d 0' 0.50\"N)\n", + "Lower Left (-179.0001389, -56.0004167) (179d 0' 0.50\"W, 56d 0' 1.50\"S)\n", + "Upper Right ( 179.0004167, 61.0001389) (179d 0' 1.50\"E, 61d 0' 0.50\"N)\n", + "Lower Right ( 179.0004167, -56.0004167) (179d 0' 1.50\"E, 56d 0' 1.50\"S)\n", + "Center ( 0.0001389, 2.4998611) ( 0d 0' 0.50\"E, 2d29'59.50\"N)\n", + "Band 1 Block=256x256 Type=Int16, ColorInterp=Gray\n", + " NoData Value=-32768\n" + ] + } + ], + "source": [ + "%%bash\n", + "\n", + "CPL_DEBUG=OFF GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + " VSICURL_PC_URL_SIGNING=YES \\\n", + " AZURE_STORAGE_ACCOUNT=pcstacitems \\\n", + " AZURE_STORAGE_SAS_TOKEN=`curl -s https://planetarycomputer.microsoft.com/api/sas/v1/token/pcstacitems/items | jq -r '.token'` \\\n", + " gdalinfo GTI:/vsiaz/items/nasadem.parquet -oo LOCATION_FIELD=assets.elevation.href" + ] + }, + { + "cell_type": "raw", + "metadata": { + "vscode": { + "languageId": "raw" + } + }, + "source": [ + "\n", + " GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]\n", + " -1.8000013888888890e+02, 2.7777777777781459e-04, 0.0000000000000000e+00, 6.0000138888888891e+01, 0.0000000000000000e+00, -2.7777777777781459e-04\n", + " \n", + " -32768" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "with open('nasadem.gti', 'w') as f:\n", + " f.write(\"\"\"\n", + " /vsiaz/items/nasadem.parquet\n", + " assets.elevation.href\n", + " -1.8000013888888890e+02, 2.7777777777781459e-04,0.0000000000000000e+00,6.0000138888888891e+01,0.0000000000000000e+00,-2.7777777777781459e-04\n", + " 1296001\n", + " 417601\n", + " 1\n", + " Int16\n", + "\n", + "\"\"\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Driver: GTI/GDAL Raster Tile Index\n", + "Files: nasadem.gti\n", + "Size is 1296001, 417601\n", + "Coordinate System is:\n", + "GEOGCRS[\"WGS 84\",\n", + " ENSEMBLE[\"World Geodetic System 1984 ensemble\",\n", + " MEMBER[\"World Geodetic System 1984 (Transit)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G730)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G873)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G1150)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G1674)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G1762)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G2139)\"],\n", + " MEMBER[\"World Geodetic System 1984 (G2296)\"],\n", + " ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n", + " LENGTHUNIT[\"metre\",1]],\n", + " ENSEMBLEACCURACY[2.0]],\n", + " PRIMEM[\"Greenwich\",0,\n", + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n", + " CS[ellipsoidal,2],\n", + " AXIS[\"geodetic latitude (Lat)\",north,\n", + " ORDER[1],\n", + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n", + " AXIS[\"geodetic longitude (Lon)\",east,\n", + " ORDER[2],\n", + " ANGLEUNIT[\"degree\",0.0174532925199433]],\n", + " USAGE[\n", + " SCOPE[\"Horizontal component of 3D system.\"],\n", + " AREA[\"World.\"],\n", + " BBOX[-90,-180,90,180]],\n", + " ID[\"EPSG\",4326]]\n", + "Data axis to CRS axis mapping: 2,1\n", + "Origin = (-180.000138888888898,60.000138888888891)\n", + "Pixel Size = (0.000277777777778,-0.000277777777778)\n", + "Corner Coordinates:\n", + "Upper Left (-180.0001389, 60.0001389) (180d 0' 0.50\"W, 60d 0' 0.50\"N)\n", + "Lower Left (-180.0001389, -56.0001389) (180d 0' 0.50\"W, 56d 0' 0.50\"S)\n", + "Upper Right ( 180.0001389, 60.0001389) (180d 0' 0.50\"E, 60d 0' 0.50\"N)\n", + "Lower Right ( 180.0001389, -56.0001389) (180d 0' 0.50\"E, 56d 0' 0.50\"S)\n", + "Center ( 0.0000000, 2.0000000) ( 0d 0' 0.00\"E, 2d 0' 0.00\"N)\n", + "Band 1 Block=256x256 Type=Int16, ColorInterp=Undefined\n" + ] + } + ], + "source": [ + "%%bash\n", + "\n", + "CPL_DEBUG=OFF GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + " VSICURL_PC_URL_SIGNING=YES \\\n", + " AZURE_STORAGE_ACCOUNT=pcstacitems \\\n", + " AZURE_STORAGE_SAS_TOKEN=`curl -s https://planetarycomputer.microsoft.com/api/sas/v1/token/pcstacitems/items | jq -r '.token'` \\\n", + " gdalinfo nasadem.gti" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Report:\n", + " Location: (264600P,77400L)\n", + " Band 1:\n", + " /vsicurl/https://nasademeuwest.blob.core.windows.net/nasadem-cog/v001/NASADEM_HGT_n38w107.tif\n", + " Value: 2762\n" + ] + } + ], + "source": [ + "%%bash\n", + "\n", + "INPUT=nasadem.gti\n", + "CPL_DEBUG=OFF GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + " VSICURL_PC_URL_SIGNING=YES \\\n", + " AZURE_STORAGE_ACCOUNT=pcstacitems \\\n", + " AZURE_STORAGE_SAS_TOKEN=`curl -s https://planetarycomputer.microsoft.com/api/sas/v1/token/pcstacitems/items | jq -r '.token'` \\\n", + " gdallocationinfo -geoloc $INPUT -106.500 38.500" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Report:\n", + " Location: (1800P,1800L)\n", + " Band 1:\n", + " Value: 2762\n" + ] + } + ], + "source": [ + "%%bash\n", + "# Query Tif directly\n", + "INPUT=/vsicurl/https://nasademeuwest.blob.core.windows.net/nasadem-cog/v001/NASADEM_HGT_n38w107.tif\n", + "CPL_DEBUG=OFF GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + " VSICURL_PC_URL_SIGNING=YES \\\n", + " gdallocationinfo -geoloc $INPUT -106.500 38.500" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ERROR 1: Point outside of projection domain\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Creating output file that is 1296001P x 417601L.\n", + "Processing nasadem.gti [1/1] : 0...10...20...30...40...50...60...70...80...90...100 - done.\n" + ] + } + ], + "source": [ + "\n", + "%%bash\n", + "\n", + "SSRS='EPSG:9055+5773'\n", + "TSRS='EPSG:7912'\n", + "PROJ_PIPELINE='+proj=pipeline +step +proj=axisswap +order=2,1 +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=vgridshift +grids=us_nga_egm96_15.tif +multiplier=1 +step +proj=cart +ellps=WGS84 +step +proj=helmert +x=-0.0007 +y=-0.0012 +z=0.0261 +rx=0 +ry=0 +rz=0 +s=-0.00212 +dx=-0.0001 +dy=-0.0001 +dz=0.0019 +drx=0 +dry=0 +drz=0 +ds=-0.00011 +t_epoch=2010 +convention=position_vector +step +inv +proj=cart +ellps=GRS80 +step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m +step +proj=axisswap +order=2,1'\n", + "INPUT=nasadem.gti\n", + "OUTPUT=nasadem_7912.gti.vrt\n", + "\n", + "CPL_DEBUG=OFF PROJ_DEBUG=2 \\\n", + " PROJ_NETWORK=ON \\\n", + " GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + " VSICURL_PC_URL_SIGNING=YES \\\n", + " AZURE_STORAGE_ACCOUNT=pcstacitems \\\n", + " AZURE_STORAGE_SAS_TOKEN=`curl -s https://planetarycomputer.microsoft.com/api/sas/v1/token/pcstacitems/items | jq -r '.token'` \\\n", + " gdalwarp -overwrite -wm 500 -co BLOCKXSIZE=512 -co BLOCKYSIZE=512 -r bilinear -ot Float32 -te -180.0001389 -56.0001389 180.0001389 60.0001389 -s_srs $SSRS -t_srs $TSRS -ct \"${PROJ_PIPELINE}\" ${INPUT} ${OUTPUT}\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Report:\n", + " Location: (264600P,77400L)\n", + " Band 1:\n", + " Value: 2747.1611328125\n" + ] + } + ], + "source": [ + "%%bash\n", + "# Does this match opentopography VRT? Value: 2747.1611328125, yes\n", + "INPUT=nasadem_7912.gti.vrt\n", + "CPL_DEBUG=OFF GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + " VSICURL_PC_URL_SIGNING=YES \\\n", + " AZURE_STORAGE_ACCOUNT=pcstacitems \\\n", + " AZURE_STORAGE_SAS_TOKEN=`curl -s https://planetarycomputer.microsoft.com/api/sas/v1/token/pcstacitems/items | jq -r '.token'` \\\n", + " gdallocationinfo -geoloc $INPUT -106.500 38.500" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Report:\n", + " Location: (264600.500023667P,77400.5000251724L)\n", + " Band 1:\n", + " Value: 2747.16103365231\n" + ] + } + ], + "source": [ + "%%bash\n", + "# Does this match using PROJ directly?\n", + "INPUT=nasadem_7912.gti.vrt\n", + "CPL_DEBUG=OFF GDAL_DISABLE_READDIR_ON_OPEN=EMPTY_DIR \\\n", + " VSICURL_PC_URL_SIGNING=YES \\\n", + " AZURE_STORAGE_ACCOUNT=pcstacitems \\\n", + " AZURE_STORAGE_SAS_TOKEN=`curl -s https://planetarycomputer.microsoft.com/api/sas/v1/token/pcstacitems/items | jq -r '.token'` \\\n", + " gdallocationinfo -r bilinear -geoloc $INPUT -106.500000 38.500000" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 38.50000 -106.50000 2747.16309 inf\n" + ] + } + ], + "source": [ + "%%bash\n", + "# 7912 Single point using proj, agrees w/ GDAL to w/n mm\n", + "PROJ_PIPELINE='+proj=pipeline +step +proj=axisswap +order=2,1 +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=vgridshift +grids=us_nga_egm96_15.tif +multiplier=1 +step +proj=cart +ellps=WGS84 +step +proj=helmert +x=-0.0007 +y=-0.0012 +z=0.0261 +rx=0 +ry=0 +rz=0 +s=-0.00212 +dx=-0.0001 +dy=-0.0001 +dz=0.0019 +drx=0 +dry=0 +drz=0 +ds=-0.00011 +t_epoch=2010 +convention=position_vector +step +inv +proj=cart +ellps=GRS80 +step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m +step +proj=axisswap +order=2,1'\n", + "#USE proj directly to convert this point\n", + "echo 38.5000000 -106.5000000 2762.0 | cct -d 5 $PROJ_PIPELINE" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "default", + "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.13.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/globaldems/nasadem_7661.vrt b/globaldems/nasadem_7661.vrt new file mode 100644 index 0000000..6e47e6f --- /dev/null +++ b/globaldems/nasadem_7661.vrt @@ -0,0 +1,47 @@ + + GEOGCRS["WGS 84 (G1150)",DYNAMIC[FRAMEEPOCH[2001]],DATUM["World Geodetic System 1984 (G1150)",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,3],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],AXIS["ellipsoidal height (h)",up,ORDER[3],LENGTHUNIT["metre",1]],USAGE[SCOPE["Geodesy. Navigation and positioning using GPS satellite system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",7661]] + -1.7900013890000000e+02, 2.7777777779502033e-04, 0.0000000000000000e+00, 6.1000138900000003e+01, 0.0000000000000000e+00, -2.7777777783053695e-04 + + -32768 + Gray + + 512 + 128 + + 5.24288e+08 + Bilinear + Float32 + + + + + + /vsicurl/https://opentopography.s3.sdsc.edu/raster/NASADEM/NASADEM_be.vrt + + + -179.0001388888889,0.00027777777777781469,0,61.000138888888891,0,-0.00027777777777781469 + 644400.49999991443,3599.9999999995216,0,219600.49999997081,0,-3599.9999999995216 + -179.0001389,0.00027777777779502033,0,61.000138900000003,0,-0.00027777777783053695 + 644400.5,3599.9999997765367,0,219600.49999829062,0,-3599.999999316241 + + + COMPD_CS["WGS 84 (G1150) + EGM96 height",GEOGCS["WGS 84 (G1150)",DATUM["World_Geodetic_System_1984_G1150",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","1154"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","9055"]],VERT_CS["EGM96 height",VERT_DATUM["EGM96 geoid",2005,AUTHORITY["EPSG","5171"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Gravity-related height",UP],AUTHORITY["EPSG","5773"]]] + GEOGCRS["WGS 84 (G1150)",DYNAMIC[FRAMEEPOCH[2001]],DATUM["World Geodetic System 1984 (G1150)",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,3],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],AXIS["ellipsoidal height (h)",up,ORDER[3],LENGTHUNIT["metre",1]],USAGE[SCOPE["Geodesy. Navigation and positioning using GPS satellite system."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",7661]] + + + + + + + + + + + -32768 + 0 + -32768 + 0 + + + + diff --git a/globaldems/nasadem_7912.gti.vrt b/globaldems/nasadem_7912.gti.vrt new file mode 100644 index 0000000..b26d1b2 --- /dev/null +++ b/globaldems/nasadem_7912.gti.vrt @@ -0,0 +1,39 @@ + + GEOGCRS["ITRF2014",DYNAMIC[FRAMEEPOCH[2010]],DATUM["International Terrestrial Reference Frame 2014",ELLIPSOID["GRS 1980",6378137,298.257222101,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,3],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],AXIS["ellipsoidal height (h)",up,ORDER[3],LENGTHUNIT["metre",1]],USAGE[SCOPE["Geodesy."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",7912]] + -1.8000013890000000e+02, 2.7777777779492454e-04, 0.0000000000000000e+00, 6.0000138900000003e+01, 0.0000000000000000e+00, -2.7777777783099178e-04 + + 512 + 512 + + 5.24288e+08 + Bilinear + Float32 + + + + + + nasadem.gti + + + -180.0001388888889,0.00027777777777781459,0,60.000138888888891,0,-0.00027777777777781459 + 648000.4999999142,3599.999999999523,0,216000.49999997139,0,-3599.999999999523 + -180.0001389,0.00027777777779492454,0,60.000138900000003,0,-0.00027777777783099178 + 648000.5,3599.9999997777777,0,216000.49999862071,0,-3599.9999993103465 + + + COMPD_CS["WGS 84 (G1150) + EGM96 height",GEOGCS["WGS 84 (G1150)",DATUM["World_Geodetic_System_1984_G1150",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","1154"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","9055"]],VERT_CS["EGM96 height",VERT_DATUM["EGM96 geoid",2005,AUTHORITY["EPSG","5171"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Gravity-related height",UP],AUTHORITY["EPSG","5773"]]] + GEOGCRS["ITRF2014",DYNAMIC[FRAMEEPOCH[2010]],DATUM["International Terrestrial Reference Frame 2014",ELLIPSOID["GRS 1980",6378137,298.257222101,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,3],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],AXIS["ellipsoidal height (h)",up,ORDER[3],LENGTHUNIT["metre",1]],USAGE[SCOPE["Geodesy."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",7912]] + + + + + + + + + + + + + diff --git a/globaldems/nasadem_7912.vrt b/globaldems/nasadem_7912.vrt new file mode 100644 index 0000000..9921e6a --- /dev/null +++ b/globaldems/nasadem_7912.vrt @@ -0,0 +1,47 @@ + + GEOGCRS["ITRF2014",DYNAMIC[FRAMEEPOCH[2010]],DATUM["International Terrestrial Reference Frame 2014",ELLIPSOID["GRS 1980",6378137,298.257222101,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,3],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],AXIS["ellipsoidal height (h)",up,ORDER[3],LENGTHUNIT["metre",1]],USAGE[SCOPE["Geodesy."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",7912]] + -1.7900013890000000e+02, 2.7777777779502033e-04, 0.0000000000000000e+00, 6.1000138900000003e+01, 0.0000000000000000e+00, -2.7777777783053695e-04 + + -32768 + Gray + + 512 + 128 + + 5.24288e+08 + Bilinear + Float32 + + + + + + /vsicurl/https://opentopography.s3.sdsc.edu/raster/NASADEM/NASADEM_be.vrt + + + -179.0001388888889,0.00027777777777781469,0,61.000138888888891,0,-0.00027777777777781469 + 644400.49999991443,3599.9999999995216,0,219600.49999997081,0,-3599.9999999995216 + -179.0001389,0.00027777777779502033,0,61.000138900000003,0,-0.00027777777783053695 + 644400.5,3599.9999997765367,0,219600.49999829062,0,-3599.999999316241 + + + COMPD_CS["WGS 84 (G1150) + EGM96 height",GEOGCS["WGS 84 (G1150)",DATUM["World_Geodetic_System_1984_G1150",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","1154"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","9055"]],VERT_CS["EGM96 height",VERT_DATUM["EGM96 geoid",2005,AUTHORITY["EPSG","5171"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Gravity-related height",UP],AUTHORITY["EPSG","5773"]]] + GEOGCRS["ITRF2014",DYNAMIC[FRAMEEPOCH[2010]],DATUM["International Terrestrial Reference Frame 2014",ELLIPSOID["GRS 1980",6378137,298.257222101,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433]],CS[ellipsoidal,3],AXIS["geodetic latitude (Lat)",north,ORDER[1],ANGLEUNIT["degree",0.0174532925199433]],AXIS["geodetic longitude (Lon)",east,ORDER[2],ANGLEUNIT["degree",0.0174532925199433]],AXIS["ellipsoidal height (h)",up,ORDER[3],LENGTHUNIT["metre",1]],USAGE[SCOPE["Geodesy."],AREA["World."],BBOX[-90,-180,90,180]],ID["EPSG",7912]] + + + + + + + + + + + -32768 + 0 + -32768 + 0 + + + + diff --git a/globaldems/readme.md b/globaldems/readme.md index eda91be..b10aa01 100644 --- a/globaldems/readme.md +++ b/globaldems/readme.md @@ -37,7 +37,7 @@ A table of EPSG codes for various WGS84 realizations Source: https://epsg.org -| Valid From | Realization | Std. Epoch | 2D Geographic | 3D Geodetic | 3D Geocentric | +| Valid From | Realization | Epoch | 2D Geographic | 3D Geodetic | 3D Geocentric | | - | - | - | - | - | - | | 1997-01-29 | WGS84 (G873) | 1997.0 | 9054 | 7659 | 7658 | | 2002-01-20 | WGS84 (G1150) | 2001.0 | 9055 | 7661 | 7660 | @@ -48,11 +48,11 @@ Source: https://epsg.org ### ITRF EPSG -A table of selec EPSG codes for various ITRF realizations +A table of selected EPSG codes for various ITRF realizations Source: https://epsg.org -| Valid From | Realization | Std. Epoch | 2D Geographic | 3D Geodetic | 3D Geocentric | +| Valid From | Realization | Epoch | 2D Geographic | 3D Geodetic | 3D Geocentric | | - | - | - | - | - | - | | 1999-05-01 | ITRF1997 | 1997.0 | 8996 | 7908 | 4918 | | 2001-03-19 | ITRF2000 | 1997.0 | 8997 | 7909 | 4919 | @@ -76,22 +76,26 @@ A "CompoundCRS" can combine a 2D Geographic CRS with a 1D Vertical CRS to form a ## Static CRS -USGS 3DEP uses NAD83 + NAVD88 Heights. This is not a global system and rather focuses on CONUS. The coordinate system moves with the North American plate. *It's refered to as 'static' because to an observer measuring positions on the plate, the plate is not moving :)* +### NAD83 +USGS 3DEP uses NAD83 + NAVD88 Heights. **This is not a global system and rather focuses on CONUS.** The coordinate system moves with the North American plate. *It's refered to as 'static' because to an observer measuring positions on the plate, the plate is not moving :)* Just like WGS and ITRF, there are different, increasingly accurate 'realizations' of the NAD83 datum over time: -| Valid From | Realization | Std. Epoch | 2D Geographic | 3D Geodetic | 3D Geocentric | +| Valid From | Realization | Epoch | 2D Geographic | 3D Geodetic | 3D Geocentric | | - | - | - | - | - | - | -| 1986 | NAD83(1986) | 1984.0 | 4269 | ? | ? | -| ? | NAD83(HARN) | ? | 4152 | 4957 | 4956 | +| 1986 | NAD83(1986) | 1984.0 | 4269 | - | - | +| 1993 | NAD83(HARN) | 1991.0 | 4152 | 4957 | 4956 | +| 1998 | NAD83(CORS96) | 2002.0 | 6783 | 6782 | 6781 | +| 2007 | NAD83(NSRS2007) | 2002.0 | 4759 | 4893 | 4892 | | 2012-06-12 | NAD83(2011) | 2010.0 | 6318 | 6319 | 6317 | +| unreleased | NATRF2022 | 2020.0 | - | - | - | Geoid Model: * **Vertical Coordinates: NAVD88 [EPSG: 5703]** -To be updated soon! -https://www.ngs.noaa.gov/datums/newdatums/release.shtml +To be updated ~2025: with geopotential datum will be called North American-Pacific Geopotential Datum of 2022 (NAPGD2022). The most prominent of these products will be a time-dependent model of the geoid, provided in three regions (the first covering the entirety of North and Central America, Hawaii, Alaska, Greenland, and the Caribbean; the second covering American Samoa; and the third covering Guam and the Commonwealth of the Mariana Islands). The name of this model will be GEOID2022. Read more: https://www.ngs.noaa.gov/datums/newdatums +A great reference: https://vdatum.noaa.gov/docs/datums.html#geodetic ## Projected CRS diff --git a/globaldems/srtm.ipynb b/globaldems/srtm.ipynb index 49e2401..70b9c1a 100644 --- a/globaldems/srtm.ipynb +++ b/globaldems/srtm.ipynb @@ -344,6 +344,7 @@ "source": [ "# Combined (inject shift grid https://github.com/OSGeo/PROJ/issues/4362\n", "# Pipeline as a single line to pass to GDAL\n", + "#projinfo -s EPSG:9055+5773 -t EPSG:7661 -o PROJ --hide-ballpark -q --single-line\n", "#projinfo -s EPSG:9055 -t EPSG:7912 -o PROJ --hide-ballpark --single-line -q\n", "pipeline='''+proj=pipeline\n", " +step +proj=axisswap +order=2,1\n", diff --git a/myst.yml b/myst.yml index 75e2da4..0d21f37 100644 --- a/myst.yml +++ b/myst.yml @@ -21,16 +21,21 @@ project: toc: - file: README.md + - file: notes.md - title: Examples children: - file: examples/3DEP_AK_notes.md - file: examples/Raster_DEM_3D_Transformation_GDAL.ipynb - file: examples/Vector_3D_Transformation_GeoPandas.ipynb - - title: Globaldems + - title: Global DEMs children: - file: globaldems/readme.md - file: globaldems/cop30.ipynb - file: globaldems/srtm.ipynb + - file: globaldems/nasadem.ipynb + - title: Regional DEMs + children: + - file: 3dep/10m-seamless.ipynb site: template: book-theme diff --git a/notes.md b/notes.md new file mode 100644 index 0000000..e371ca6 --- /dev/null +++ b/notes.md @@ -0,0 +1,213 @@ +# Background + +* Awesome ICESat-2 Hackweek 2022 Tutorial from Tyler, Hannah and Scott: https://icesat-2-2022.hackweek.io/tutorials/geospatial/geospatial-advanced.html?highlight=datum +* NSIDC notebook on `iceflow` tool (Kevin Beam) for combining (ICESat, Operation IceBridge and ICESat-2): https://github.com/nsidc/NSIDC-Data-Tutorials/blob/main/notebooks/iceflow/corrections.ipynb +* David's GDA module on CRS and projections: https://uwgda-jupyterbook.readthedocs.io/en/latest/modules/04_Vector1_Geopandas_CRS_Proj/04_Vector1_Geopandas_CRS_Proj_prep.html + +## Helpful resources specific to North America +* https://geodesy.noaa.gov/corbin/class_description/NGS_Video_Library.shtml + * What are Geodetic Datums? + * How Were Geodetic Datums Established? + * What Is the Status of Today’s Geodetic Datums? + * What’s Next for Geodetic Datums? +* https://www.meted.ucar.edu/oceans/navy_geodesy/ +* PSU Course GPS and GNSS for Geospatial Professionals (Lesson 5): https://www.e-education.psu.edu/geog862/node/1669 +* https://www.dnr.wa.gov/publications/eng_plso_state_plane_coord_refresher.pdf +* https://www.uvm.edu/giv/resources/WGS84_NAD83.pdf + +## Why is this so complicated!? +* The Earth's surface/shape is constantly changing +* Our ability to measure the Earth's surface/shape and locations on the surface continues to improve (Thanks GNSS!) +* The systems used to define coordinate systems and datums continues to evolve +* The support for these systems in open-source tools continue to evolve, with a lot of confusing and/or outdated documentation out there on the web +* There is a long (fascinating) history of surveying approaches, measurements, correction approaches, and definitions +* Many legacy datasets use older CRS definitions +* Many datasets have missing CRS information in metadata, sometimes incorrect information +* The acronyms used for different CRS and datums can feel like alphabet soup: NAD83, WGS84, GRS80, NAVD88, EGM, ITRF + +### What is a CRS? +#### How are they defined? +* https://uwgda-jupyterbook.readthedocs.io/en/latest/modules/04_Vector1_Geopandas_CRS_Proj/04_Vector1_Geopandas_CRS_Proj_demo.html#crs-and-projections +* Emerging json definitions (in parallel with WKT): https://github.com/opengeospatial/CRS-JSON-Encoding +#### EPSG codes vs. proj strings vs WKT +### Horizontal CRS +#### Ellipsoid models +* https://proj.org/en/9.2/_images/general_ellipsoid.png +### Vertical CRS +#### Geoid models +### Projections +### ITRF Realizations +### epochs, time and plate deformation models +* Plate motion ~1-8 cm/yr +### Specific notes for North America +* https://geodesy.noaa.gov/datums/index.shtml +* https://geodesy.noaa.gov/datums/newdatums/background.shtml +* There is hope! https://geodesy.noaa.gov/datums/newdatums/index.shtml + * https://xkcd.com/2920/ + +### Transformations +* Allows you to go back and forth between different CRS +* You've all done this - convert from cartesian to polar coordiantes (high school math) +* Can be 2D or 3D +* Most open-source packages depend on PROJ library (https://proj.org/) for CRS support and transformations +### Vector +* `pyproj`: Python interface for PROJ +* `GeoPandas` uses pyproj under the hood for CRS transformations, with support for compound 3D CRS +### Raster +* `gdalwarp` with proper CRS definitions (and available vertical offset grids) should work + +## Common datasets and CRS definitions +### ICESat-2 +### Raster DEMs +#### ArcticDEM/REMA/EarthDEM products from PGC +* These are distributed as 2D projected CRS (EPSG:3031 or EPSG:3413), without a vertical datum definition +* Elevation values are "height above the WGS84 ellipsoid" - but no details about specific realization used by vendor (Maxar) providing source stereo imagery +* Most of the Maxar data were acquired and delivered after 2008, so should be using more modern realizations of ITRF (2008, 2014, 2020), which are similar +* Can likely assume ITRF2014 for most of the available DEM products +* Can use custom WKT2 definintions for these 3D CRS: + * Antarctica: https://github.com/ICESat2-SlideRule/sliderule/blob/cb8ead40d761c8d637397a28e7b6d53fcf1de3c4/plugins/pgc/plugin/ITRF2014_3031.wkt + * Arctic: https://github.com/ICESat2-SlideRule/sliderule/blob/cb8ead40d761c8d637397a28e7b6d53fcf1de3c4/plugins/pgc/plugin/ITRF2014_3413.wkt +#### Copernicus 30 m DEM +* EPSG:9518 (WGS84 + EGM2008) +### Point clouds and altimetry +#### 3DEP lidar +* NAD83(2011) horizontal with NAVD88 vertical datum +* Projection is Local UTM Zone +* EPSG:6339+5703 (example for UTM Zone 10N with NAVD88 datum, https://epsg.io/6339) + * Note: this is not the same as EPSG:32610 (WGS84) or EPSG:26910 (NAD83), because we are using NAD83(2011) realization +#### WA DNR +* EPSG:2926+5703 (WA state plane N) +* EPSG:2927+5703 (WA state plane S) +* NAVD88 model should be geoid2012 (I think, need to confirm) + +## :warning: Setup +1. `conda install gdal pdal geopandas` or `conda update gdal pdal geopandas` + * Make sure you are using latest PROJ (>9.2 required for improved North American datum support) +2. Retrieve the vertical datum offset grids for your area of interest with https://proj.org/en/9.2/apps/projsync.html +`projsync --all` + +## Examples +### Check your dataset metadata +* `gdalinfo` +* Review documentation, lidar reports, etc. + +### ICESat-2 to other CRS +``` +# Fake some 3D data but with epsg:4326 +gf_orig = gpd.GeoDataFrame(geometry=gpd.points_from_xy([-120.4], [48.6], [1400]), crs='EPSG:4326') + +# override 4326 with 3D CRS and do a 3D transform (uses pyproj under the hood): +gf_new = gf.set_crs(epsg=7912, allow_override=True) + +gf_new.to_crs(epsg="2927+5703") +``` +### Other CRS to ICESat-2 + +## Testing and validation +### vdatum (https://vdatum.noaa.gov/) +### `cs2cs` +`echo -120.4 48.6 1400 | PROJ_DEBUG=2 PROJ_NETWORK=ON cs2cs -f "%.3f" -r epsg:7912 epsg:2927+5703` +### `projinfo` +`projinfo -s EPSG:7912 -t EPSG:2927+5703 -o PROJ --hide-ballpark --spatial-test intersects` +``` + Candidate operations found: 5 +------------------------------------- +Operation No. 1: +unknown id, Inverse of Conversion from ITRF2014 (geocentric) to ITRF2014 (geog3D) + ITRF2014 to NAD83(2011) (1) + Inverse of Conversion from NAD83(2011) (geog3D) to NAD83(2011) (geocentric) + NAD83(2011) to NAVD88 height (3) + Inver +se of NAD83(HARN) to NAD83(2011) (NADCON5, CONUS) + SPCS83 Washington South zone (US Survey feet), 0.105 m, United States (USA) - CONUS onshore - Alabama; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Geor +gia; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina +; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; South Dakota; Tennessee; Texas; Utah; Vermont; Virginia; Washington; West Virginia; Wisconsin; Wyoming. +PROJ string: ++proj=pipeline + +step +proj=axisswap +order=2,1 + +step +proj=unitconvert +xy_in=deg +xy_out=rad + +step +proj=cart +ellps=GRS80 + +step +proj=helmert +x=1.0053 +y=-1.90921 +z=-0.54157 +rx=0.02678138 + +ry=-0.00042027 +rz=0.01093206 +s=0.00036891 +dx=0.00079 +dy=-0.0006 + +dz=-0.00144 +drx=6.667e-05 +dry=-0.00075744 +drz=-5.133e-05 + +ds=-7.201e-05 +t_epoch=2010 +convention=coordinate_frame + +step +inv +proj=cart +ellps=GRS80 + +step +inv +proj=vgridshift +grids=us_noaa_g2018u0.tif +multiplier=1 + +step +inv +proj=gridshift +no_z_transform + +grids=us_noaa_nadcon5_nad83_2007_nad83_2011_conus.tif + +step +inv +proj=gridshift +no_z_transform + +grids=us_noaa_nadcon5_nad83_fbn_nad83_2007_conus.tif + +step +inv +proj=gridshift +no_z_transform + +grids=us_noaa_nadcon5_nad83_harn_nad83_fbn_conus.tif + +step +proj=lcc +lat_0=45.3333333333333 +lon_0=-120.5 +lat_1=47.3333333333333 + +lat_2=45.8333333333333 +x_0=500000.0001016 +y_0=0 +ellps=GRS80 + +step +proj=unitconvert +xy_in=m +xy_out=us-ft + ``` +* Note the 0.105 m uncertainty + +## WA DNR LiDAR products +The Washington Department of Natural Resources maintains an excellent lidar portal with subsetting of standardized DSM and DTM products, as well as download of the lidar point clouds. See here: https://lidarportal.dnr.wa.gov/ + +### Combining separate lidar tiles in a vrt +Your selected area of interest on the DNR portal may cross the boundaries of the original tiled lidar data. So you will get multiple small DSM/DTM tiles. You can combine these in a virtual raster (vrt) using the `gdalbuildvrt` command (https://gdal.org/programs/gdalbuildvrt.html): +`gdalbuildvrt out_raster.vrt tile1.tif tile2.tif tile3.tif` + +Check with gdalinfo: `gdalinfo out_raster.vrt` + +Output dimensions and geographic extent should be larger than any individual tile. + +Note: To combine multiple point cloud tiles (las/laz), you can use PDAL merge command (https://pdal.io/en/2.6.0/apps/merge.html): +`pdal merge tile1.laz tile2.laz tile3.laz out_merged.laz` + +### Coordinate system transformation +All products are distributed using one of two default CRS: either WA State Plane North or WA State Plane South, both using the NAD83(HARN) horizontal datum and the NAVD88 vertical datum (unsure if geoid2012 or geoid2018?), with all horizontal and vertical units in U.S. Survey Feet. There are historical reasons for these choices +* EPSG:2926 - NAD83(HARN) / Washington North (ftUS), https://www.spatialreference.org/ref/epsg/2926/ +* EPSG:2927 - NAD83(HARN) / Washington South (ftUS), https://www.spatialreference.org/ref/epsg/2927/ +* EPSG:6360 - NAVD88 height (ftUS) + +PROJ information about conversion from these coordinate systems to UTM Zone 10N WGS84 with height in meters above the ellipsoid: + +`projinfo -s EPSG:2927+6360 -t EPSG:32610+4979 -o PROJ --hide-ballpark --spatial-test intersects | less` +``` +Candidate operations found: 17 +------------------------------------- +Operation No. 1: + +unknown id, Inverse of SPCS83 Washington South zone (US Survey feet) + Conversion from NAVD88 height (ftUS) to NAVD88 height + Inverse of NAD83(HARN) to NAVD88 height (1) + NAD83(H +ARN) to WGS 84 (3) + UTM zone 10N, 1.05 m, United States (USA) - CONUS onshore north of 41°N and west of 112°W - Oregon and Washington; California and Nevada north of 41°N; Utah no +rth of 41°N and west of 112°W; Idaho and Montana west of 112°W. + +PROJ string: ++proj=pipeline + +step +proj=unitconvert +xy_in=us-ft +xy_out=m + +step +inv +proj=lcc +lat_0=45.3333333333333 +lon_0=-120.5 + +lat_1=47.3333333333333 +lat_2=45.8333333333333 +x_0=500000.0001016 + +y_0=0 +ellps=GRS80 + +step +proj=unitconvert +z_in=us-ft +z_out=m + +step +proj=vgridshift +grids=us_noaa_g1999u01.tif +multiplier=1 + +step +proj=cart +ellps=GRS80 + +step +proj=helmert +x=-0.991 +y=1.9072 +z=0.5129 +rx=-0.0257899075194932 + +ry=-0.0096500989602704 +rz=-0.0116599432323421 +s=0 + +convention=coordinate_frame + +step +inv +proj=cart +ellps=WGS84 + +step +proj=utm +zone=10 +ellps=WGS84 +``` + +There are 17 different possible operations, with subtle differences (and uncertainty) depending on the NAD83 and NAVD88 definitions and offset grids used. To be more precise, we should also unambiguously define the WGS84 realization (not just "WGS84"), but there are no convenient EPSG codes for UTM projections using "WGS 84 (G1762)", so we will need to create a custom WKT CRS (to be done later). + +Sample gdalwarp command to transform sample WA DNR LiDAR product for Island County, WA, with output CRS of: + +#### WGS84 UTM 10N with height in meters above the WGS84 ellipsoid, and output posting of 1 m: + +`gdalwarp -s_srs EPSG:2927+6360 -t_srs EPSG:32610+4979 -tr 1.0 1.0 -r cubic -dstnodata -9999 -co COMPRESS=LZW -co TILED=YES -co BIGTIFF=IF_SAFER island_2014_dsm_13.tif island_2014_dsm_13_UTM10N_wgs84.tif` + +#### NAD83(2011) UTM 10N with height in meters above the NAD83(2011) ellipsoid, and output posting of 1 m +`gdalwarp -s_srs EPSG:2927+6360 -t_srs EPSG:6339+6319 -tr 1.0 1.0 -r cubic -dstnodata -9999 -co COMPRESS=LZW -co TILED=YES -co BIGTIFF=IF_SAFER island_2014_dsm_13.tif island_2014_dsm_13_UTM10N_nad83_2011.tif` + +Check output CRS with gdalinfo: `gdalinfo island_2014_dsm_13_UTM10N_nad83_2011.tif` + +Should have the horizontal CRS and a vertical CRS defined with units of meters. + +## Gotchas and other notes +* There is no perfect transformation approach, and all transformations have some uncertainty + * https://vdatum.noaa.gov/docs/est_uncertainties.html +* There are many possible ways to go from one CRS to another, the PROJ pipelines allow you to control this +* Many CRS (esp compound or 3D CRS) don't have EPSG codes - you can define the CRS with machine-readable, well-known text (use WKT2) + +## Other resources +* Comparison of values with different versions of the NAVD88 geoid (geoid2018 vs geoid2012): https://gist.github.com/scottyhq/bf13033a9655f302e8f9dc9235daf9fc diff --git a/pixi.lock b/pixi.lock index ddfd216..bc40e9e 100644 --- a/pixi.lock +++ b/pixi.lock @@ -12,6 +12,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/appnope-0.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-24.3.0-pyh71513ae_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/blosc-1.21.6-h7dd00d9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/branca-0.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/brotli-1.1.0-hd74edd7_2.conda @@ -43,7 +61,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.0.1-pyha770c72_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/geos-3.13.0-hf9b8971_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/geotiff-1.7.3-h82bf549_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_1.conda @@ -62,24 +82,34 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.16-ha0e7c42_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-h9a09cb3_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarchive-3.7.7-h3b16cec_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.0-h819e3af_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.0-hf07054f_8_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.0-hf07054f_8_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libavif16-1.1.1-h45b7238_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.9.0-26_osxarm64_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.1.0-hd74edd7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.1.0-hd74edd7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.1.0-hd74edd7_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.9.0-26_osxarm64_openblas.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.11.1-h73640d1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-19.1.6-ha82da77_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libde265-1.0.15-h2ffa867_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.23-hec38601_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20240808-pl5321hafb1f1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-core-3.10.1-h9ef0d2d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-arrow-parquet-3.10.1-h5717a32_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-core-3.10.1-h9ef0d2d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-13.2.0-hf226fd6_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.34.0-hdbe95d5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.34.0-h7081f7f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libheif-1.19.5-gpl_h297b2c4_100.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.17-h0d3ecfb_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.0.0-hb547adb_1.conda @@ -89,13 +119,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h99b78c6_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.64.0-h6d7220d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.28-openmp_hf332438_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.0-h636d7b7_8_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.45-h3783ad8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librttopo-1.1.0-ha2cf0f4_17.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libspatialite-5.1.0-hf92fc0a_12.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.48.0-h3f77e49_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.13.5-h178c5d8_1.conda @@ -113,9 +150,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.4.2-pyh267e887_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.2.1-py313ha4a2180_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.3-h8a3d83b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.4.0-h81ee809_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.2.3-py313h47b39a6_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/parso-0.8.4-pyhd8ed1ab_1.conda @@ -125,6 +164,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-11.1.0-py313hb37fac4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/proj-9.5.1-h1318a7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.48-pyha770c72_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-6.1.1-py313h90d716c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda @@ -145,6 +185,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rasterio-1.4.3-py313h782da51_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rav1e-0.6.6-h69fbcac_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.17.0-pyhd8ed1ab_0.conda @@ -155,7 +196,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/snappy-1.2.1-h98b9ce2_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.47.2-hd7222ec_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.48.0-hd7222ec_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/svt-av1-2.3.0-hf24288c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.5.0-pyhc1e730c_0.conda @@ -250,7 +291,7 @@ packages: - pytest>=7.0 ; extra == 'test' - trustme ; extra == 'test' - truststore>=0.9.1 ; python_full_version >= '3.10' and extra == 'test' - - uvloop>=0.21 ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and platform_system != 'Windows' and extra == 'test' + - uvloop>=0.21 ; python_full_version < '3.14' and platform_python_implementation == 'CPython' and sys_platform != 'win32' and extra == 'test' - packaging ; extra == 'doc' - sphinx~=7.4 ; extra == 'doc' - sphinx-rtd-theme ; extra == 'doc' @@ -352,6 +393,286 @@ packages: - pkg:pypi/attrs?source=hash-mapping size: 56354 timestamp: 1734348889193 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.8.1-hfc2798a_0.conda + sha256: 5a60d196a585b25d1446fb973009e4e648e8d70beaa2793787243ede6da0fd9a + md5: 0abd67c0f7b60d50348fbb32fef50b65 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 92562 + timestamp: 1737509877079 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.8.1-hc8a0bd2_3.conda + sha256: 1f44be36e1daa17b4b081debb8aee492d13571084f38b503ad13e869fef24fe4 + md5: 8b0ce61384e5a33d2b301a64f3d22ac5 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - openssl >=3.3.1,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 39925 + timestamp: 1733991649383 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.10.6-h5505292_0.conda + sha256: 3bde135c8e74987c0f79ecd4fa17ec9cff0d658b3090168727ca1af3815ae57a + md5: 145e5b4c9702ed279d7d68aaf096f77d + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 221863 + timestamp: 1733975576886 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.0-hc8a0bd2_5.conda + sha256: 47b2813f652ce7e64ac442f771b2a5f7d4af4ad0d07ff51f6075ea80ed2e3f09 + md5: a8b6c17732d14ed49d0e9b59c43186bc + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 18068 + timestamp: 1733991869211 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.0-h54f970a_11.conda + sha256: f0667935f4e0d4c25e0e51da035640310b5ceeb8f723156734439bde8b848d7d + md5: ba41238f8e653998d7d2f42e3a8db054 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 47078 + timestamp: 1734024749727 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.9.2-h96aa502_4.conda + sha256: 22e4737c8a885995b7c1ae1d79c1f6e78d489e16ec079615980fdde067aeaf76 + md5: 495c93a4f08b17deb3c04894512330e6 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-compression >=0.3.0,<0.3.1.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 152983 + timestamp: 1734008451473 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.15.3-haba67d1_6.conda + sha256: 73722dd175af78b6cbfa033066f0933351f5382a1a737f6c6d9b8cfa84022161 + md5: d02e8f40ff69562903e70a1c6c48b009 + depends: + - __osx >=11.0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 136048 + timestamp: 1737207681224 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.11.0-h24f418c_12.conda + sha256: 96575ea1dd2a9ea94763882e40a66dcbff9c41f702bf37c9514c4c719b3c11dd + md5: c072045a6206f88015d02fcba1705ea1 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 134371 + timestamp: 1734025379525 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.7.9-hf37e03c_1.conda + sha256: 92e8ca4eefcbbdf4189584c9410382884a06ed3030e5ecaac656dab8c95e6a80 + md5: de65f5e4ab5020103fe70a0eba9432a0 + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 98731 + timestamp: 1737558731831 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.2-hc8a0bd2_0.conda + sha256: ea4f0f1e99056293c69615f581a997d65ba7e229e296e402e0d8ef750648a5b5 + md5: e7b5498ac7b7ab921a907be38f3a8080 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 49872 + timestamp: 1736536152332 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.2-hc8a0bd2_4.conda + sha256: 215086d95e8ff1d3fcb0197ada116cc9d7db1fdae7573f5e810d20fa9215b47c + md5: e70e88a357a3749b67679c0788c5b08a + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 70186 + timestamp: 1733994496998 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.29.9-ha81f72f_2.conda + sha256: ed5f1d19aad53787fdebe13db4709c97eae2092536cc55d3536eba320c4286e1 + md5: c9c034d3239bf25687ca4dd985007ecd + depends: + - __osx >=11.0 + - aws-c-auth >=0.8.1,<0.8.2.0a0 + - aws-c-cal >=0.8.1,<0.8.2.0a0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-c-http >=0.9.2,<0.9.3.0a0 + - aws-c-io >=0.15.3,<0.15.4.0a0 + - aws-c-mqtt >=0.11.0,<0.11.1.0a0 + - aws-c-s3 >=0.7.9,<0.7.10.0a0 + - aws-c-sdkutils >=0.2.2,<0.2.3.0a0 + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 235976 + timestamp: 1737565563139 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.489-h0e5014b_0.conda + sha256: d82451530ddf363d8bb31a8a7391bb9699f745e940ace91d78c0e6170deef03c + md5: 156cfb45a1bb8cffc81e59047bb34f51 + depends: + - __osx >=11.0 + - aws-c-common >=0.10.6,<0.10.7.0a0 + - aws-c-event-stream >=0.5.0,<0.5.1.0a0 + - aws-checksums >=0.2.2,<0.2.3.0a0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2874126 + timestamp: 1737577023623 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.14.0-hd50102c_0.conda + sha256: f5b91329ed59ffc0be8747784c6e4cc7e56250c54032883a83bc11808ef6a87e + md5: f093a11dcf3cdcca010b20a818fcc6dc + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 294299 + timestamp: 1728054014060 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.10.0-hc602bab_0.conda + sha256: bde446b916fff5150606f8ed3e6058ffc55a3aa72381e46f1ab346590b1ae40a + md5: d7b71593a937459f2d4b67e1a4727dc2 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 166907 + timestamp: 1728486882502 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.13.0-h7585a09_1.conda + sha256: 08d52d130addc0fb55d5ba10d9fa483e39be25d69bac7f4c676c2c3069207590 + md5: 704238ef05d46144dae2e6b5853df8bc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 438636 + timestamp: 1728578216193 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.8.0-h9ca1f76_1.conda + sha256: 77ab04e8fe5636a2de9c718f72a43645f7502cd208868c8a91ffba385547d585 + md5: 7a187cd7b1445afc80253bb186a607cc + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - libcxx >=17 + - libxml2 >=2.12.7,<3.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 121278 + timestamp: 1728563418777 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.12.0-hcdd55da_1.conda + sha256: f48523f8aa0b5b80f45a92f0556b388dd96f44ac2dc2f44a01d08c1822eec97d + md5: c49fbc5233fcbaa86391162ff1adef38 + depends: + - __osx >=11.0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-common-cpp >=12.8.0,<12.8.1.0a0 + - libcxx >=17 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 196032 + timestamp: 1728729672889 - pypi: https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl name: beautifulsoup4 version: 4.12.3 @@ -792,6 +1113,19 @@ packages: purls: [] size: 113739 timestamp: 1726603324989 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda + sha256: fd56ed8a1dab72ab90d8a8929b6f916a6d9220ca297ff077f8f04c5ed3408e20 + md5: 57a511a5905caa37540eb914dfcbf1fb + depends: + - __osx >=11.0 + - libcxx >=17 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 82090 + timestamp: 1726600145480 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda sha256: 843b3f364ff844137e37d5c0a181f11f6d51adcedd216f019d074e5aa5d7e09c md5: 95fa1486c77505330c20f7202492b913 @@ -800,6 +1134,20 @@ packages: purls: [] size: 71613 timestamp: 1712692611426 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/glog-0.7.1-heb240a5_0.conda + sha256: 9fc77de416953aa959039db72bc41bfa4600ae3ff84acad04a7d0c1ab9552602 + md5: fef68d0a95aa5b84b5c1a4f6f3bf40e1 + depends: + - __osx >=11.0 + - gflags >=2.2.2,<2.3.0a0 + - libcxx >=16 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 112215 + timestamp: 1718284365403 - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_1.conda sha256: 843ddad410c370672a8250470697027618f104153612439076d4d7b91eeb7b5c md5: 825927dc7b0f287ef8d4d0011bb113b1 @@ -1203,6 +1551,22 @@ packages: purls: [] size: 215721 timestamp: 1657977558796 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20240722.0-cxx17_h07bc746_4.conda + sha256: 05fa5e5e908962b9c5aba95f962e2ca81d9599c4715aebe5e4ddb72b309d1770 + md5: c2d95bd7aa8d564a9bd7eca5e571a5b3 + depends: + - __osx >=11.0 + - libcxx >=18 + constrains: + - libabseil-static =20240722.0=cxx17* + - abseil-cpp =20240722.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 1178260 + timestamp: 1736008642885 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarchive-3.7.7-h3b16cec_3.conda sha256: cbce64423e72bcd3576b5cfe0e4edd255900100f72467d5b4ea1d77449ac1ce9 md5: 1c2eda2163510220b9f9d56a85c8da9d @@ -1222,6 +1586,80 @@ packages: purls: [] size: 772780 timestamp: 1734021109752 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-19.0.0-h819e3af_8_cpu.conda + build_number: 8 + sha256: 825afabd1c998dfddce9600584c492296a15219d441c6e3029e6c6228200d695 + md5: fbe0ce0ef6d386ab832ee5cca2ab3048 + depends: + - __osx >=11.0 + - aws-crt-cpp >=0.29.9,<0.29.10.0a0 + - aws-sdk-cpp >=1.11.489,<1.11.490.0a0 + - azure-core-cpp >=1.14.0,<1.14.1.0a0 + - azure-identity-cpp >=1.10.0,<1.10.1.0a0 + - azure-storage-blobs-cpp >=12.13.0,<12.13.1.0a0 + - azure-storage-files-datalake-cpp >=12.12.0,<12.12.1.0a0 + - bzip2 >=1.0.8,<2.0a0 + - glog >=0.7.1,<0.8.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libbrotlidec >=1.1.0,<1.2.0a0 + - libbrotlienc >=1.1.0,<1.2.0a0 + - libcxx >=18 + - libgoogle-cloud >=2.34.0,<2.35.0a0 + - libgoogle-cloud-storage >=2.34.0,<2.35.0a0 + - libopentelemetry-cpp >=1.18.0,<1.19.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libutf8proc >=2.10.0,<2.11.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - orc >=2.0.3,<2.0.4.0a0 + - re2 + - snappy >=1.2.1,<1.3.0a0 + - zstd >=1.5.6,<1.6.0a0 + constrains: + - arrow-cpp <0.0a0 + - apache-arrow-proc =*=cpu + - parquet-cpp <0.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 5573619 + timestamp: 1737806044972 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-19.0.0-hf07054f_8_cpu.conda + build_number: 8 + sha256: 66ce35077dae435cd34644d53159af14afd62452eeec8f63cd55adb11e7f2780 + md5: 68cd272eccf7b4fcb0a3bab95e89e71e + depends: + - __osx >=11.0 + - libarrow 19.0.0 h819e3af_8_cpu + - libcxx >=18 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 500365 + timestamp: 1737806169385 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-19.0.0-hf07054f_8_cpu.conda + build_number: 8 + sha256: 6934ce0503472f002695d45ae12a8f2948e10e7a0b7430330a4d0d83f3e5ca27 + md5: 1a941d1ddc16b532790781a4becdc881 + depends: + - __osx >=11.0 + - libarrow 19.0.0 h819e3af_8_cpu + - libarrow-acero 19.0.0 hf07054f_8_cpu + - libcxx >=18 + - libparquet 19.0.0 h636d7b7_8_cpu + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 501001 + timestamp: 1737807214184 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libavif16-1.1.1-h45b7238_2.conda sha256: c671365e8c822d29b53f20c4573fdbc70f18b50ff9a4b5b2b6b3c8f7ad2ac2a9 md5: 7571064a60bc193ff5c25f36ed23394a @@ -1300,6 +1738,18 @@ packages: purls: [] size: 16628 timestamp: 1734433061517 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 + sha256: 58477b67cc719060b5b069ba57161e20ba69b8695d154a719cb4b60caf577929 + md5: 32bd82a6a625ea6ce090a81c3d34edeb + depends: + - libcxx >=11.1.0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 18765 + timestamp: 1633683992603 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.11.1-h73640d1_0.conda sha256: f47c35938144c23278987c7d12096f6a42d7c850ffc277222b032073412383b6 md5: 46d7524cabfdd199bffe63f8f19a552b @@ -1366,6 +1816,18 @@ packages: purls: [] size: 107458 timestamp: 1702146414478 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libevent-2.1.12-h2757513_1.conda + sha256: 8c136d7586259bb5c0d2b913aaadc5b9737787ae4f40e3ad1beaf96c80b919b7 + md5: 1a109764bff3bdc7bdd84088347d71dc + depends: + - openssl >=3.1.1,<4.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 368167 + timestamp: 1685726248899 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.4-h286801f_0.conda sha256: e42ab5ace927ee7c84e3f0f7d813671e1cf3529f5f06ee5899606630498c2745 md5: 38d2656dd914feb0cab8c629370768bf @@ -1386,9 +1848,28 @@ packages: purls: [] size: 39020 timestamp: 1636488587153 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-core-3.10.1-h9ef0d2d_0.conda - sha256: f474eb92547eaa49c131a269f0c451f8dff821dc942435c99100d0e35ca7e478 - md5: 47088d85185ab3ac3eddad4666cded69 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-arrow-parquet-3.10.1-h5717a32_2.conda + sha256: a600dee6db7dd551b31acfeeca459ff152b6f999bf82cce591da0b903bb4260e + md5: e6cf0c6777acae05ddc3169a9823dac0 + depends: + - __osx >=11.0 + - libarrow >=19.0.0,<19.1.0a0 + - libarrow-dataset >=19.0.0,<19.1.0a0 + - libcxx >=18 + - libgdal-core 3.10.1 h9ef0d2d_2 + - libkml >=1.3.0,<1.4.0a0 + - liblzma >=5.6.3,<6.0a0 + - libparquet >=19.0.0,<19.1.0a0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 729525 + timestamp: 1737612885568 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-core-3.10.1-h9ef0d2d_2.conda + sha256: 891e4fc19846b99e5c2232c4e04c72d5eb55cd9702e70416283adf65e0598048 + md5: f0ea5524380b2c76156589e6aa0998a9 depends: - __osx >=11.0 - blosc >=1.21.6,<2.0a0 @@ -1409,7 +1890,7 @@ packages: - liblzma >=5.6.3,<6.0a0 - libpng >=1.6.45,<1.7.0a0 - libspatialite >=5.1.0,<5.2.0a0 - - libsqlite >=3.47.2,<4.0a0 + - libsqlite >=3.48.0,<4.0a0 - libtiff >=4.7.0,<4.8.0a0 - libwebp-base >=1.5.0,<2.0a0 - libxml2 >=2.13.5,<3.0a0 @@ -1422,10 +1903,13 @@ packages: - zstd >=1.5.6,<1.6.0a0 constrains: - libgdal 3.10.1.* + arch: arm64 + platform: osx license: MIT + license_family: MIT purls: [] - size: 8499780 - timestamp: 1736809609724 + size: 8493126 + timestamp: 1737610665986 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-5.0.0-13_2_0_hd922786_3.conda sha256: 44e541b4821c96b28b27fef5630883a60ce4fee91fd9c79f25a199f8f73f337b md5: 4a55d9e169114b2b90d3ec4604cd7bbf @@ -1448,6 +1932,69 @@ packages: purls: [] size: 997381 timestamp: 1707330687590 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.34.0-hdbe95d5_0.conda + sha256: 919d8cbcd47d5bd2244c55b2bb87e2bd2eed8215996aab8435cb7123ffd9d20e + md5: 69826544e7978fcaa6bc8c1962d96ad6 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libcxx >=18 + - libgrpc >=1.67.1,<1.68.0a0 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - openssl >=3.4.0,<4.0a0 + constrains: + - libgoogle-cloud 2.34.0 *_0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 878217 + timestamp: 1737284441192 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.34.0-h7081f7f_0.conda + sha256: 79f6b93fb330728530036b2b38764e9d42e0eedd3ae7e549ac7eae49acd1e52b + md5: f09cb03f9cf847f1dc41b4c1f65c97c2 + depends: + - __osx >=11.0 + - libabseil + - libcrc32c >=1.1.2,<1.2.0a0 + - libcurl + - libcxx >=18 + - libgoogle-cloud 2.34.0 hdbe95d5_0 + - libzlib >=1.3.1,<2.0a0 + - openssl + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 529202 + timestamp: 1737285376801 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.67.1-h0a426d6_1.conda + sha256: 630edf63981818ff590367cb95fddbed0f5a390464d0952c90ec81de899e84a6 + md5: 8a3cba079d6ac985e7d73c76a678fbb4 + depends: + - __osx >=11.0 + - c-ares >=1.34.4,<2.0a0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libre2-11 >=2024.7.2 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.4.0,<4.0a0 + - re2 + constrains: + - grpc-cpp =1.67.1 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 5311706 + timestamp: 1735585137716 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libheif-1.19.5-gpl_h297b2c4_100.conda sha256: f340e8e51519bcf885da9dd12602f19f76f3206347701accb28034dd0112b1a1 md5: 5e457131dd237050dbfe6b141592f3ea @@ -1559,6 +2106,55 @@ packages: purls: [] size: 4165774 timestamp: 1730772154295 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.18.0-h0c05b2d_1.conda + sha256: c6bcbd53d62a9e0d8c667e560db0ca2ecb7679277cbb3c23457aabe74fcb8cba + md5: 19c46cc18825f3924251c39ec1b0d983 + depends: + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcurl >=8.11.1,<9.0a0 + - libgrpc >=1.67.1,<1.68.0a0 + - libopentelemetry-cpp-headers 1.18.0 hce30654_1 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.18.0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 529588 + timestamp: 1735643889612 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.18.0-hce30654_1.conda + sha256: 82e5f5ba64debbaab3c601b265dfc0cdb4d2880feba9bada5fd2e67b9f91ada5 + md5: e965dad955841507549fdacd8f7f94c0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 320565 + timestamp: 1735643673319 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-19.0.0-h636d7b7_8_cpu.conda + build_number: 8 + sha256: da04e6bd7ed2ca64aadf0ad12d9752e8423e85c37e0db80e27c7ff334fcbd2b6 + md5: c1ff2e71a289fb76146591c9d3f9de0a + depends: + - __osx >=11.0 + - libarrow 19.0.0 h819e3af_8_cpu + - libcxx >=18 + - libthrift >=0.21.0,<0.21.1.0a0 + - openssl >=3.4.0,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 893482 + timestamp: 1737807155720 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.45-h3783ad8_0.conda sha256: ddcc81c049b32fb5eb3ac1f9a6d3a589c08325c8ec6f89eb912208b19330d68c md5: d554c806d065b1763cb9e1cb1d25741d @@ -1569,6 +2165,39 @@ packages: purls: [] size: 263151 timestamp: 1736339184358 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-5.28.3-h3bd63a1_1.conda + sha256: f58a16b13ad53346903c833e266f83c3d770a43a432659b98710aed85ca885e7 + md5: bdbfea4cf45ae36652c6bbcc2e7ebe91 + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 2271580 + timestamp: 1735576361997 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2024.07.02-h07bc746_2.conda + sha256: 112a73ad483353751d4c5d63648c69a4d6fcebf5e1b698a860a3f5124fc3db96 + md5: 6b1e3624d3488016ca4f1ca0c412efaa + depends: + - __osx >=11.0 + - libabseil * cxx17* + - libabseil >=20240722.0,<20240723.0a0 + - libcxx >=18 + constrains: + - re2 2024.07.02.* + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 167155 + timestamp: 1735541067807 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librttopo-1.1.0-ha2cf0f4_17.conda sha256: 9ff3162d035a1d9022f6145755a70d0c0ce6c9152792402bc42294354c871a17 md5: ba729f000ea379b76ed2190119d21e13 @@ -1612,16 +2241,18 @@ packages: purls: [] size: 2943606 timestamp: 1734001158789 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.47.2-h3f77e49_0.conda - sha256: f192f3c8973de9ec4c214990715f13b781965247a5cedf9162e7f9e699cfc3c4 - md5: 122d6f29470f1a991e85608e77e56a8a +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.48.0-h3f77e49_1.conda + sha256: 17c06940cc2a13fd6a17effabd6881b1477db38b2cd3ee2571092d293d3fdd75 + md5: 4c55169502ecddf8077973a987d08f08 depends: - __osx >=11.0 - libzlib >=1.3.1,<2.0a0 + arch: arm64 + platform: osx license: Unlicense purls: [] - size: 850553 - timestamp: 1733762057506 + size: 852831 + timestamp: 1737564996616 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h9cc3647_0.conda sha256: f7047c6ed44bcaeb04432e8c74da87591940d091b0a3940c0d884b7faa8062e9 md5: ddc7194676c285513706e5fc64f214d7 @@ -1633,6 +2264,22 @@ packages: purls: [] size: 279028 timestamp: 1732349599461 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.21.0-h64651cc_0.conda + sha256: 7a6c7d5f58cbbc2ccd6493b4b821639fdb0701b9b04c737a949e8cb6adf1c9ad + md5: 7ce2bd2f650f8c31ad7ba4c7bfea61b7 + depends: + - __osx >=11.0 + - libcxx >=17 + - libevent >=2.1.12,<2.1.13.0a0 + - libzlib >=1.3.1,<2.0a0 + - openssl >=3.3.2,<4.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 324342 + timestamp: 1727206096912 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.0-h551f018_3.conda sha256: 91417846157e04992801438a496b151df89604b2e7c6775d6f701fcd0cbed5ae md5: a5d084a957563e614ec0c0196d890654 @@ -1650,6 +2297,18 @@ packages: purls: [] size: 370600 timestamp: 1734398863052 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.10.0-hda25de7_0.conda + sha256: aca3ef31d3dff5cefd3790742a5ee6548f1cf0201d0e8cee08b01da503484eb6 + md5: 5f741aed1d8d393586a5fdcaaa87f45c + depends: + - __osx >=11.0 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 83628 + timestamp: 1737244450097 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.5.0-h2471fea_0.conda sha256: f8bdb876b4bc8cb5df47c28af29188de8911c3fea4b799a33743500149de3f4a md5: 569466afeb84f90d5bb88c11cc23d746 @@ -1993,6 +2652,19 @@ packages: purls: [] size: 1265008 timestamp: 1731521053408 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.11.3-h00cdb27_1.conda + sha256: 3f4e6a4fa074bb297855f8111ab974dab6d9f98b7d4317d4dd46f8687ee2363b + md5: d2dee849c806430eee64d3acc98ce090 + depends: + - __osx >=11.0 + - libcxx >=16 + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 123250 + timestamp: 1723652704997 - pypi: https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl name: nodeenv version: 1.9.1 @@ -2043,6 +2715,25 @@ packages: purls: [] size: 2936415 timestamp: 1736086108693 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.0.3-h0ff2369_2.conda + sha256: cca330695f3bdb8c0e46350c29cd4af3345865544e36f1d7c9ba9190ad22f5f4 + md5: 24b1897c0d24afbb70704ba998793b78 + depends: + - __osx >=11.0 + - libcxx >=18 + - libprotobuf >=5.28.3,<5.28.4.0a0 + - libzlib >=1.3.1,<2.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - snappy >=1.2.1,<1.3.0a0 + - tzdata + - zstd >=1.5.6,<1.6.0a0 + arch: arm64 + platform: osx + license: Apache-2.0 + license_family: Apache + purls: [] + size: 438520 + timestamp: 1735630624140 - pypi: https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl name: overrides version: 7.7.0 @@ -2188,6 +2879,22 @@ packages: requires_dist: - twisted ; extra == 'twisted' requires_python: '>=3.8' +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda + sha256: 851a77ae1a8e90db9b9f3c4466abea7afb52713c3d98ceb0d37ba6ff27df2eff + md5: 7172339b49c94275ba42fec3eaeda34f + depends: + - __osx >=11.0 + - libcurl >=8.10.1,<9.0a0 + - libcxx >=18 + - libzlib >=1.3.1,<2.0a0 + - zlib + arch: arm64 + platform: osx + license: MIT + license_family: MIT + purls: [] + size: 173220 + timestamp: 1730769371051 - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.48-pyha770c72_1.conda sha256: 79fb7d1eeb490d4cc1b79f781bb59fe302ae38cf0a30907ecde75a7d399796cc md5: 368d4aa48358439e07a97ae237491785 @@ -2488,6 +3195,18 @@ packages: purls: [] size: 1526706 timestamp: 1694329743011 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2024.07.02-h6589ca4_2.conda + sha256: 4d3799c05f8f662922a0acd129d119774760a3281b883603678e128d1cb307fb + md5: 7a8b4ad8c58a3408ca89d78788c78178 + depends: + - libre2-11 2024.07.02 h07bc746_2 + arch: arm64 + platform: osx + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 26861 + timestamp: 1735541088455 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 md5: 8cbb776a2f641b943d413b3e19df71f4 @@ -2682,19 +3401,21 @@ packages: version: '2.6' sha256: e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9 requires_python: '>=3.8' -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.47.2-hd7222ec_0.conda - sha256: 7b7e81b1cfce888d8591c8e4a6df0a1854c291dcd2a623a371f806130bb01048 - md5: fcde11e05577e05f3b69b046822b7529 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.48.0-hd7222ec_1.conda + sha256: 6c1609abe16ed39dd099eb7e32e2f3228105ab81bdd8da65700d46ee0984013e + md5: 802cc94c9fa238cb3f802d430a528bd5 depends: - __osx >=11.0 - - libsqlite 3.47.2 h3f77e49_0 + - libsqlite 3.48.0 h3f77e49_1 - libzlib >=1.3.1,<2.0a0 - ncurses >=6.5,<7.0a0 - readline >=8.2,<9.0a0 + arch: arm64 + platform: osx license: Unlicense purls: [] - size: 853604 - timestamp: 1733762084934 + size: 858007 + timestamp: 1737565018178 - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda sha256: 570da295d421661af487f1595045760526964f41471021056e993e73089e9c41 md5: b1b505328da7a6b246787df4b5a49fbc diff --git a/pixi.toml b/pixi.toml index 39fb1d5..5a225e6 100644 --- a/pixi.toml +++ b/pixi.toml @@ -17,6 +17,7 @@ xarray = ">=2025.1.1,<2026" rioxarray = ">=0.17.0,<0.18" matplotlib = ">=3.10.0,<4" ipykernel = ">=6.29.5,<7" +libgdal-arrow-parquet = ">=3.10.1,<4" [pypi-dependencies] jupyter-book = "==2.0.0a1"