Skip to content

Instantly share code, notes, and snippets.

@scottyhq
Created August 2, 2022 18:51
Show Gist options
  • Save scottyhq/fd70d40e494db5c54a796555f6e46e38 to your computer and use it in GitHub Desktop.
Save scottyhq/fd70d40e494db5c54a796555f6e46e38 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "2cdf7952-db66-4d9e-81f9-b5c292f89074",
"metadata": {},
"source": [
"# Troubleshooting vertical shift grids with rasterio\n",
"\n",
"https://github.com/rasterio/rasterio/issues/2433"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "1ba60ccd-5aca-4695-bfbf-32cb59e07788",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Candidate operations found: 1\n",
"-------------------------------------\n",
"Operation No. 1:\n",
"\n",
"unknown id, Inverse of WGS 84 to EGM96 height (1) + WGS 84 to WGS 84 (G1150), 3 m, World., at least one grid missing\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_nga_egm96_15.tif +multiplier=1\n",
" +step +proj=unitconvert +xy_in=rad +xy_out=deg\n",
" +step +proj=axisswap +order=2,1\n",
"\n",
"Grid us_nga_egm96_15.tif needed but not found on the system. Can be obtained at https://cdn.proj.org/us_nga_egm96_15.tif\n"
]
}
],
"source": [
"!projinfo -s EPSG:9707 -t EPSG:7661 -o PROJ --hide-ballpark --spatial-test intersects"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "721a389b-7bcb-4d6b-a264-23b19425ab8e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"GDAL 3.5.1, released 2022/06/30\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"PROJ: pj_open_lib(proj.db): call fopen(/srv/conda/envs/notebook/share/proj/proj.db) - succeeded\n",
"HTTP: Fetch(https://opentopography.s3.sdsc.edu/raster/SRTM_GL1/SRTM_GL1_srtm/N39W109.tif)\n",
"HTTP: libcurl/7.83.1 OpenSSL/1.1.1q zlib/1.2.12 libssh2/1.10.0 nghttp2/1.47.0\n",
"GDAL: GDALOpen(/vsimem/http_1/N39W109.tif, this=0x55b9123a6930) succeeds as GTiff.\n",
"GDAL: GDALOpen(https://opentopography.s3.sdsc.edu/raster/SRTM_GL1/SRTM_GL1_srtm/N39W109.tif, this=0x55b9123a6930) succeeds as HTTP.\n",
"GDAL: GDALOpen(epsg7661_gdal351_srtm.tif, this=0x55b911f8a4e0) succeeds as GTiff.\n",
"GDAL: GDALClose(epsg7661_gdal351_srtm.tif, this=0x55b911f8a4e0)\n",
"GDAL: Using GTiff driver\n",
"GDAL: GDALOpen(epsg7661_gdal351_srtm.tif, this=0x55b911f8a4e0) succeeds as GTiff.\n",
"GDAL: GDALDefaultOverviews::OverviewScan()\n",
"GDAL: GDALClose(epsg7661_gdal351_srtm.tif, this=0x55b911f8a4e0)\n",
"PROJ: pj_open_lib(proj.ini): call fopen(/srv/conda/envs/notebook/share/proj/proj.ini) - succeeded\n",
"GDAL: Computing area of interest: -109, 38.9999, -108, 40.0001\n",
"OGRCT: Wrap source at -108.5.\n",
"PROJ: pj_open_lib(us_nga_egm96_15.tif): call fopen(/srv/conda/envs/notebook/share/proj/us_nga_egm96_15.tif) - failed\n",
"PROJ: pj_open_lib(egm96_15.gtx): call fopen(/srv/conda/envs/notebook/share/proj/egm96_15.gtx) - failed\n",
"PROJ: Using https://cdn.proj.org/us_nga_egm96_15.tif\n",
"PROJ: pj_open_lib(us_nga_egm96_15.tif): call fopen(/srv/conda/envs/notebook/share/proj/us_nga_egm96_15.tif) - failed\n",
"PROJ: pj_open_lib(egm96_15.gtx): call fopen(/srv/conda/envs/notebook/share/proj/egm96_15.gtx) - failed\n",
"PROJ: Using https://cdn.proj.org/us_nga_egm96_15.tif\n",
"GDAL: QuietDelete(epsg7661_gdal351_srtm.tif) invoking Delete()\n",
"GDAL: GDALOpen(epsg7661_gdal351_srtm.tif, this=0x55b911f8a4e0) succeeds as GTiff.\n",
"GDAL: GDALDefaultOverviews::OverviewScan()\n",
"GDAL: GDALClose(epsg7661_gdal351_srtm.tif, this=0x55b911f8a4e0)\n",
"GDAL: GDALDriver::Create(GTiff,epsg7661_gdal351_srtm.tif,3601,3601,1,Float32,(nil))\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating output file that is 3601P x 3601L.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARP: Copying metadata from first source to destination dataset\n",
"GTiff: ScanDirectories()\n",
"GTiff: Opened 1801x1801 overview.\n",
"GTiff: Opened 901x901 overview.\n",
"GTiff: Opened 451x451 overview.\n",
"WARP: srcNoData=-32768.000000 dstNoData=-32768.000000\n",
"WARP: calling GDALSetRasterNoDataValue() for band#0\n",
"GDALWARP: Defining SKIP_NOSOURCE=YES\n",
"GDAL: GDAL_CACHEMAX = 1582 MB\n",
"GDAL: GDALWarpKernel()::GWKNearestFloat() Src=0,0,3601x1800 Dst=0,0,3601x1800\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Processing https://opentopography.s3.sdsc.edu/raster/SRTM_GL1/SRTM_GL1_srtm/N39W109.tif [1/1] : 0Using internal nodata values (e.g. -32768) for image https://opentopography.s3.sdsc.edu/raster/SRTM_GL1/SRTM_GL1_srtm/N39W109.tif.\n",
"Copying nodata values from source https://opentopography.s3.sdsc.edu/raster/SRTM_GL1/SRTM_GL1_srtm/N39W109.tif to destination epsg7661_gdal351_srtm.tif.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"GDAL: GDALWarpKernel()::GWKNearestFloat() Src=0,1800,3601x1801 Dst=0,1800,3601x1801\n",
"GDAL: Flushing dirty blocks: 0...10...20...30...40...50...60...70...80...90...100 - done.\n",
"GDAL: GDALClose(epsg7661_gdal351_srtm.tif, this=0x55b911f8a4e0)\n",
"GDAL: GDALClose(https://opentopography.s3.sdsc.edu/raster/SRTM_GL1/SRTM_GL1_srtm/N39W109.tif, this=0x55b9123a6930)\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"...10...20...30...40...50...60...70...80...90...100 - done.\n"
]
}
],
"source": [
"%%bash\n",
"gdalinfo --version\n",
"\n",
"INPUT='https://opentopography.s3.sdsc.edu/raster/SRTM_GL1/SRTM_GL1_srtm/N39W109.tif'\n",
"OUTPUT='epsg7661_gdal351_srtm.tif'\n",
"CPL_DEBUG=ON \\\n",
"PROJ_DEBUG=2 \\\n",
"GDAL_DISABLE_READDIR_ON_OPEN='EMPTY_DIR' gdalwarp -overwrite -ot Float32 -s_srs EPSG:9707 -t_srs EPSG:7661 $INPUT $OUTPUT"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "2dd928d6-142c-40d4-ab6d-d39a6d9cdc42",
"metadata": {},
"outputs": [],
"source": [
"import rasterio #1.3, gdal=3.5.1, proj=9.0.1\n",
"from rasterio.warp import calculate_default_transform, reproject, Resampling\n",
"import numpy as np\n",
"import logging\n",
"import os\n",
"\n",
"# Necessary to expose PROJ-level logs\n",
"os.environ[\"PROJ_DEBUG\"] = \"2\"\n",
"# Hmm with rasterio 1.3 no longer see PROJ logs? (PROJ: Using https://cdn.proj.org/us_nga_egm08_25.tif)\n",
"\n",
"logging.basicConfig(level=logging.DEBUG,\n",
" handlers=[#logging.StreamHandler(),\n",
" logging.FileHandler('rasterio.log')], \n",
" )\n",
"url = 'https://opentopography.s3.sdsc.edu/raster/SRTM_GL1/SRTM_GL1_srtm/N39W109.tif'\n",
"\n",
"# Efficiently read the entire COG \n",
"ENV = rasterio.Env(GDAL_DISABLE_READDIR_ON_OPEN='EMPTY_DIR',\n",
" AWS_NO_SIGN_REQUEST='YES',\n",
" GDAL_MAX_RAW_BLOCK_CACHE_SIZE=240_000_000, \n",
" GDAL_SWATH_SIZE=240_000_000,\n",
" CPL_DEBUG=True,\n",
" )\n",
"\n",
"with rasterio.open('epsg7661_gdal351_srtm.tif') as src:\n",
" gdal_array = src.read(1)\n",
"\n",
"residuals = []\n",
" \n",
"warp_mem_limits = [128, 64, 32, 16] # in MB\n",
"\n",
"\n",
"for WARPLIMIT in warp_mem_limits:\n",
" with ENV:\n",
" with rasterio.open(url) as src: \n",
" src_data = src.read()\n",
"\n",
" # original metadata unaware of vertical reference\n",
" src_crs3D = rasterio.crs.CRS.from_epsg('9707')\n",
" dst_crs = rasterio.crs.CRS.from_epsg('7661') \n",
" transform, width, height = calculate_default_transform(src_crs3D, \n",
" dst_crs, \n",
" src.width, \n",
" src.height, \n",
" *src.bounds)\n",
" kwargs = src.meta.copy()\n",
" kwargs.update({\n",
" 'crs': dst_crs,\n",
" 'transform': transform,\n",
" 'width': width,\n",
" 'height': height,\n",
" 'dtype': np.float32,\n",
" })\n",
"\n",
" with rasterio.open('epsg7661_rio13_srtm.tif', 'w', **kwargs) as dst:\n",
" dst_data = np.zeros((1,width,height))\n",
" reproject(source=src_data,\n",
" destination=dst_data,\n",
" src_transform=src.transform,\n",
" src_crs=src_crs3D,\n",
" dst_transform=transform,\n",
" dst_crs=dst_crs,\n",
" resampling=Resampling.nearest,\n",
" apply_vertical_shift=True,\n",
" warp_mem_limit=WARPLIMIT,\n",
" )\n",
" \n",
" RMSE = np.sqrt(np.mean((gdal_array - dst_data)**2))\n",
" residuals.append(RMSE)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "82b9094a-2480-4d09-9650-e44cbf5e09ff",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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yqhRo7j33nvzZWuuuSaVlZUMHTq0iD2TWs+RB0mSpA42fvx4tt566wbBYfjw4cyYMcPgoJJieJAkSeogCxYs4PTTT2evvfbi7bffBrLTlH77299y2223sfrqqxe5h1LbOG1JkiSpA7z22msccsghTJw4MV+25pprMmbMGIYNG1bEnklLzpEHSZKkArvzzjsZOHBgg+Cwxx57MH36dIODSprhQZIkqUAWLlzImWeeyZ577tlgmtI555zD7bffzhprrFHkHkrt47QlSZKkAnj99dc55JBDmDBhQr7s61//Otdeey277bZb8TomFZAjD5IkSe101113MXDgwAbBoaysjBkzZhgc1K0YHiRJkpbQwoULOeussxg+fDhvvfUWABHB2WefzR133OE0JXU7TluSJElaAm+88QaHHHII99xzT75sjTXW4Nprr2X33XcvYs+kjuPIgyRJUhvV1tYycODABsFh9913Z8aMGQYHdWuGB0mSpFZauHAhZ599Nt/5znd48803gew0pbPOOovx48fz9a9/vcg9lDqW05YkSZJa4c033+TQQw+ltrY2X7b66qtz7bXXUlZWVsSeSZ3HkQdJkqQW3HPPPQwcOLBBcNhtt92YMWOGwUE9iuFBkiSpGQsXLuScc85hjz324I033gCy05TOPPNM7rzzTtZcc80i91DqXE5bkiRJasKbb77JYYcdxl133ZUvW2211bjmmmv4zne+U8SeScVjeJAkSWpkwoQJjBo1Kj/aADBs2DCuvfZavvGNbxSxZ1JxOW1JkiQpZ9GiRfz2t7+lrKyswTSl008/nbvuusvgoB7PkQdJkiTgrbfe4rDDDuPOO+/Ml6222mpcffXVDB8+vIg9k7oOw4MkSerxJk6cyKhRo3j99dfzZUOHDmXMmDGONkj1OG1JkiT1WIsWLeJ3v/sdu+++e4Pg8Ktf/Yra2lqDg9SIIw+SJKlHevvttznssMMYP358vmzVVVfl6quvZs899yxiz6Suy/AgSZJ6nHvvvZeKigpee+21fNkuu+zCmDFjWGuttYrYM6lrc9qSJEnqMRYtWsQf/vAHdttttwbB4Ze//CV33323wUFqgSMPkiSpR3j77bc54ogjuP322/Nlq6yyCldffTV77bVXEXsmlQ7DgyRJ6vbuu+8+KioqePXVV/NlQ4YMobKykrXXXruIPZNKi9OWJElS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t/fvAg+mlD5touqTwAHAXe09pyRJ7TVnzhxGjRrF/fffny9ba621qKqqYsiQIUXsmSR1Xe0ODwAppZeBl1uo80ghziVJUnvddtttHH744bz77pczVPfaay+uuuoqVl111SL2TJK6NsdjJUk9xoIFC/jlL3/J3nvvnQ8OvXv35g9/+APjxo0zOEhSC9o18hARQ5fkuJTSpPacV5KktnrllVcYNWoU9913X75srbXWYsyYMeyyyy5F7JkklY72TluaQHZZ1rbq3c7zSpLUarfffjuHH34477zzTr5szz335KqrrmK11VYrYs8kqbQU4p6HBcCdwPsFaEuSpIJZsGABZ511Fr///e/zZb169eK3v/0tP//5z11NSZLaqL3h4UVgPWB3ss8+GO2UJElSV/Dqq68yatQo7r333nzZN77xDcaMGcPQoUs061aSerx2feWSUtoA+A5wC1AO3BMRT0XEaRHhXWeSpKK44447GDhwYIPgMHz4cKZPn25wkKR2aPd4bUqpNqWUAdYCfkb2Hog/A69ERFVE7NHec0iS1BoLFizg9NNP57vf/W7+/oa6aUq33XYbq6++epF7KEmlrSDPeQBIKb0L/BX4a0TsAhwPHAQcHBEvAgellB4t1PkkSarvtddeY9SoUUya9OXs2TXXXJMxY8YwbNiwIvZMkrqPDrlTLKV0b0rpcLL3QrxK9r6IdTriXJIk3XnnnQwcOLBBcPjOd77DjBkzDA6SVEAFDw8RsXREHBYRE4H7gbWB+4CnC30uSVLPtnDhQs4880z23HNP3n77bSA7Tek3v/mN05QkqQMUbNpSRGwJ/C9wKLAS8A5wHtkVmJ4p1HkkSQJ4/fXXOeSQQ5gwYUK+7Otf/zpjxoxh1113LVq/JKk7a+8TppcDRgHHAdvmiu8GRgM3pJTmt697kiR91V133cWhhx7KW2+9lS8rKyvjmmuuYY011ihizySpe2vvtKU3gIvJTk36A7BBSuk7KaVqg4MkqdAWLlzIWWedxfDhw/PBISI4++yzueOOOwwOktTB2jttaTlgPvASMBQYGhEtHZNSSt69JklqkzfeeINDDjmEe+65J1+2xhprcO2117L77rsXsWeS1HMU4p6HPsCObaifCnBOSVIPUltby6GHHsqbb76ZL9t999255ppr+PrXv17EnklSz9Le8LBeQXohSVITFi5cyG9/+1vOPvtsUsp+9xQRnHXWWZx++un07t27yD2UpJ6lXeEhpfRSoToiSVJ9b7zxBoceeih33313vmz11Vfn2muvpaysrIg9k6Seq0MeErc4EbFaZ59TklRa7rnnHrbeeusGwWG33XZjxowZBgdJKqJOCw8R0T8ifg/M6qxzSpJKy8KFCznnnHPYY489eOONN4DsNKUzzzyTO++8kzXXXLPIPZSknq0gD4mLiHWAbciuvPRwSunNevv6AqcCPyH78LhPC3FOSVL38uabb3LYYYdx11135ctWX311rrnmGvbYY48i9kySVKfdIw8RcQHZ0YQa4EZgdkR8P7dvV+AZ4LfAMsDfgPXbe05JUvcyYcIEBg4c2CA4DBs2jOnTpxscJKkLaVd4iIgjgR/kfnwKeJrs0q0X5PbdDnyD7IPkNkwpnZpSeqvJxiRJPU7dakplZWUNpimdccYZ3HXXXXzjG98ocg8lSfW1d9rSUcAXwG4ppQcAImIocCdwKfAKsG9K6fF2nkeS1M289dZbHHbYYdx55535stVWW42rr76a4cOHF7FnkqTmtHfa0pbADXXBASClNIns9KUAjjE4SJIamzhxIgMHDmwQHIYOHcqMGTMMDpLUhbU3PPQHnm+i/Lnc9oEm9kmSeqhFixbxu9/9jt13353XX38dyE5T+tWvfkVtba3TlCSpi2vvtKVeZFdYamw+QEppXjvblyR1E2+//TaHHXYY48ePz5etuuqqXH311ey5555F7JkkqbUKsVRrKkAbkqRubNKkSYwaNYrXXnstX7bLLrswZswY1lprrSL2TJLUFoV4SNyvI2Jh/RdwJkDj8txrQQHOKUkqAYsWLeIPf/gDu+22W4Pg8H//93/cfffdBgdJKjGFGHmIDq4vSSpBb7/9NkcccQS33357vmyVVVbh6quvZq+99ipizyRJS6pd4SGlVIiRC0lSN3PfffdRUVHBq6++mi/beeedGTNmDGuvvXYReyZJag8//EuSCmbRokX8v//3/9h1110bBIdf/OIX3HPPPQYHSSpxhZi2JEkS77zzDkcccQS33XZbvmyVVVbhyiuvZO+99y5izyRJhWJ4kCS12/33308mk2kw2jB48GAqKyv55je/WcSeSZIKyWlLkqQltmjRIv70pz8xbNiwBsHhZz/7GRMmTDA4SFI348iDJGmJvPvuuxx55JGMGzcuX7byyitz5ZVXss8++xSxZ5KkjmJ4kCS12eTJk8lkMrzyyiv5sp122omqqipHGySpG3PakiSp1RYtWsSf//xnhg4d2iA4/PSnP2XixIkGB0nq5hx5kCTlzZw5k9raWubOnUu/fv0oKytjwIABQHaa0lFHHcV///vffP2VVlqJK664gn333bdYXZYkdSLDgySJ2tpazjnnHCZNmvSVfUOHDuXggw/mz3/+M3PmzMmX77jjjlRVVfGtb32rM7sqSSoiw4Mk9XCXXnopxx9/PIsWLWpy/6RJk74SKk477TT+8Ic/0KdPn87ooiSpizA8SFIPVltbu9jg0Njyyy/PNddcw4gRIzq4Z5KkrsgbpiWpBzvnnHNaHRwABgwYYHCQpB7M8CBJPdTMmTObvMdhcR566CFmzpzZQT2SJHV1hgdJ6qFqa2s79ThJUukzPEhSD/TOO+8scQiYO3dugXsjSSoV3jAtST3EBx98wI033khVVRV33XUXCxYsWKJ2+vXrV+CeSZJKRUmOPETE2hFxWUS8FhGfR8TsiDg/IlbqzHYi4tKISLnXhkv2biSp43z88cdce+217LfffqyxxhocffTR3H777UscHADKysoK2ENJUikpuZGHiNgAmAysDtwEPA1sD5wC7BURQ1JK73Z0OxGxL3AM8DGwfLvelCQV0Lx587j11luprKxk3LhxzJs3r8l6O+20E2+99RazZs1qddvDhg3LP3FaktTzlFx4AC4i+4H/5JTShXWFEXEucCrwO+CEjmwnIlYDRgNVwNeBYUv0TiSpQD7//HPGjx9PVVUVN910Ex9//HGT9bbZZhsymQwjR45knXXWoba2luHDh7dqudZevXpxxhlnFLrrkqQSEimlYveh1SJifWAWMBvYIKW0qN6+FYDXgQBWTyl90lHtRMQNwE7AAGAs2fCwUUrp+Xa+v6mDBg0aNHXq1PY0I6mHmD9/PnfffTdVVVVcf/31fPjhh03W22KLLaioqCCTybDhhl+dYdnSE6YhGxxGjx7NMcccU7D+S5KKZ5tttmHatGnTUkrbtOW4Uht52D23HV//Az9ASumjiLgfGA7sCCxuGZElbicijgL2Bw5IKb0bEUv4ViSp7RYuXMikSZOoqqpi7NixvPPOO03W23jjjclkMmQymRanGR177LGsu+66/OY3v2HixIlf2T9s2DDOOOMM73WQ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dVZZZRUOOuggMpkMw4YNo3fv3p3cS0mSVCiGB0ltMmvWrHxgePzxx5us079/fw444AAymQxlZWX06dOnk3spSZI6guFBUotefvllqqurqaysZOrUqU3WWW655dhvv/3IZDLsueeeLL300p3cS0mS1NEMD5Ka9Prrr1NTU0NVVRWTJ09usk7fvn3ZZ599qKioYO+992bZZZft5F5KkqTOZHiQlPf2228zduxYqqqqmDhxIimlr9Tp06cPe+21F5lMhhEjRrDCCisUoaeSJKkYDA9SD/f+++9z4403UllZSW1tLQsXLvxKnd69e7PHHnuQyWTYf//9WWmllYrQU0mSVGyGB6kH+uijj7j55puprKzkjjvuYP78+V+pExHsuuuuZDIZDjzwQFZbbbUi9FSSJHUlhgeph/j0008ZN24cVVVVjBs3js8++6zJekOGDCGTyXDwwQez5pprdnIvJUlSV2Z4kLqxzz//nNtvv52qqipuvvlmPvnkkybrbbvttlRUVFBeXs63vvWtTu6lJEkqFYYHqZuZP38+d911F1VVVdxwww3MnTu3yXpbbrklFRUVjBw5kg022KCTeylJkkqR4UHqBhYuXMjEiROprKzk+uuv5913322y3qabbkomkyGTybDZZpt1ci8lSVKpMzxIJWrRokVMnjyZyspKrrvuOt58880m662//vr5wLDlllsSEZ3cU0mS1F0YHqQSklLikUceoaqqiurqal555ZUm633zm99k5MiRZDIZtt12WwODJEkqCMOD1MWllHj00UepqqqiqqqKF198scl6a6yxRj4w7LTTTvTq1auTeypJkro7w4PUQWbOnEltbS1z586lX79+lJWVMWDAgFYf/+STT1JVVUVlZSXPPvtsk3VWWWUVDj74YDKZDEOHDqV3796F6r4kSdJXGB6kAqutreWcc85h0qRJX9k3dOhQzjzzTMrKypo89vnnn8+PMDz++ONN1unfvz8HHHAAFRUV7L777vTp06eg/ZckSWqO4UEqoEsvvZTjjz+eRYsWNbl/0qRJDB8+nNGjR3PMMccA8NJLL1FdXU1VVRVTp05t8rjllluO/fbbj0wmw5577snSSy/dYe9BkiSpOYYHqUBqa2sXGxzqLFq0iOOOO46pU6cyffp0HnjggSbr9e3bl//5n/8hk8mw9957s+yyy3ZEtyVJklrN8CAV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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"image/png": {
"height": 261,
"width": 391
},
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"%config InlineBackend.figure_format = 'retina'\n",
"\n",
"plt.plot(warp_mem_limits, residuals, 'ko-')\n",
"plt.xlabel('Warp Mem Limit (Mb)')\n",
"plt.ylabel('RMSE (m)');"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "8a0b0178-fe6c-4b0b-b80b-1779a31023d6",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"DEBUG:rasterio.env:Entering env context: <rasterio.env.Env object at 0x7f5d8db3f250>\n",
"DEBUG:rasterio.env:Starting outermost env\n",
"DEBUG:rasterio.env:No GDAL environment exists\n",
"DEBUG:rasterio.env:New GDAL environment <rasterio._env.GDALEnv object at 0x7f5d8db3f280> created\n",
"DEBUG:rasterio._filepath:Installing FilePath filesystem handler plugin...\n",
"DEBUG:rasterio._env:GDAL_DATA found in environment.\n",
"DEBUG:rasterio._env:PROJ_LIB found in environment.\n",
"DEBUG:rasterio._env:Started GDALEnv: self=<rasterio._env.GDALEnv object at 0x7f5d8db3f280>.\n",
"DEBUG:rasterio.env:Entered env context: <rasterio.env.Env object at 0x7f5d8db3f250>\n",
"DEBUG:rasterio._base:Sharing flag: 0\n",
"DEBUG:rasterio._base:Nodata success: 1, Nodata value: -32768.000000\n",
"DEBUG:rasterio._base:Dataset <open DatasetReader name='epsg7661_gdal351_srtm.tif' mode='r'> is started.\n",
"DEBUG:rasterio.env:Exiting env context: <rasterio.env.Env object at 0x7f5d8db3f250>\n",
"DEBUG:rasterio.env:Cleared existing <rasterio._env.GDALEnv object at 0x7f5d8db3f280> options\n",
"DEBUG:rasterio._env:Stopped GDALEnv <rasterio._env.GDALEnv object at 0x7f5d8db3f280>.\n",
"DEBUG:rasterio.env:Exiting outermost env\n",
"DEBUG:rasterio.env:Exited env context: <rasterio.env.Env object at 0x7f5d8db3f250>\n",
"DEBUG:rasterio._io:Output nodata value read from file: -32768.0\n",
"DEBUG:rasterio._io:Output nodata values: [-32768.0]\n",
"DEBUG:rasterio._io:all_valid: False\n",
"DEBUG:rasterio._io:mask_flags: ([<MaskFlags.nodata: 8>],)\n",
"DEBUG:rasterio._io:Jump straight to _read()\n",
"DEBUG:rasterio._io:Window: None\n",
"DEBUG:rasterio._io:IO window xoff=0.0 yoff=0.0 width=3601.0 height=3601.0\n",
"DEBUG:rasterio.env:Entering env context: <rasterio.env.Env object at 0x7f5e08c1c160>\n",
"DEBUG:rasterio.env:Starting outermost env\n",
"DEBUG:rasterio.env:No GDAL environment exists\n",
"DEBUG:rasterio.env:New GDAL environment <rasterio._env.GDALEnv object at 0x7f5d8db3ceb0> created\n",
"DEBUG:rasterio._env:GDAL_DATA found in environment.\n",
"DEBUG:rasterio._env:PROJ_LIB found in environment.\n",
"DEBUG:rasterio._env:Started GDALEnv: self=<rasterio._env.GDALEnv object at 0x7f5d8db3ceb0>.\n",
"DEBUG:rasterio.env:Entered env context: <rasterio.env.Env object at 0x7f5e08c1c160>\n",
"DEBUG:rasterio.env:Got a copy of environment <rasterio._env.GDALEnv object at 0x7f5d8db3ceb0> options\n",
"DEBUG:rasterio.env:Entering env context: <rasterio.env.Env object at 0x7f5d8db3ce80>\n",
"DEBUG:rasterio.env:Got a copy of environment <rasterio._env.GDALEnv object at 0x7f5d8db3ceb0> options\n",
"DEBUG:rasterio.env:Entered env context: <rasterio.env.Env object at 0x7f5d8db3ce80>\n",
"DEBUG:rasterio._base:Sharing flag: 0\n",
"DEBUG:rasterio._env:CPLE_None in HTTP: libcurl/7.83.1 OpenSSL/1.1.1q zlib/1.2.12 libssh2/1.10.0 nghttp2/1.47.0\n",
"DEBUG:rasterio._env:CPLE_None in VSICURL: GetFileSize(https://opentopography.s3.sdsc.edu/raster/SRTM_GL1/SRTM_GL1_srtm/N39W109.tif)=17280892 response_code=200\n",
"DEBUG:rasterio._env:CPLE_None in VSICURL: Downloading 0-16383 (https://opentopography.s3.sdsc.edu/raster/SRTM_GL1/SRTM_GL1_srtm/N39W109.tif)...\n",
"DEBUG:rasterio._env:CPLE_None in VSICURL: Got response_code=206\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALOpen(/vsicurl/https://opentopography.s3.sdsc.edu/raster/SRTM_GL1/SRTM_GL1_srtm/N39W109.tif, this=0x55bcd0fdc4a0) succeeds as GTiff.\n",
"DEBUG:rasterio._base:Nodata success: 1, Nodata value: -32768.000000\n",
"DEBUG:rasterio._base:Dataset <open DatasetReader name='https://opentopography.s3.sdsc.edu/raster/SRTM_GL1/SRTM_GL1_srtm/N39W109.tif' mode='r'> is started.\n",
"DEBUG:rasterio.env:Exiting env context: <rasterio.env.Env object at 0x7f5d8db3ce80>\n",
"DEBUG:rasterio.env:Cleared existing <rasterio._env.GDALEnv object at 0x7f5d8db3ceb0> options\n",
"DEBUG:rasterio._env:Stopped GDALEnv <rasterio._env.GDALEnv object at 0x7f5d8db3ceb0>.\n",
"DEBUG:rasterio.env:No GDAL environment exists\n",
"DEBUG:rasterio.env:New GDAL environment <rasterio._env.GDALEnv object at 0x7f5d8db3ceb0> created\n",
"DEBUG:rasterio._env:GDAL_DATA found in environment.\n",
"DEBUG:rasterio._env:PROJ_LIB found in environment.\n",
"DEBUG:rasterio._env:Started GDALEnv: self=<rasterio._env.GDALEnv object at 0x7f5d8db3ceb0>.\n",
"DEBUG:rasterio.env:Exited env context: <rasterio.env.Env object at 0x7f5d8db3ce80>\n",
"DEBUG:rasterio._io:Output nodata value read from file: -32768.0\n",
"DEBUG:rasterio._io:Output nodata values: [-32768.0]\n",
"DEBUG:rasterio._env:CPLE_None in GTiff: ScanDirectories()\n",
"DEBUG:rasterio._env:CPLE_None in GTiff: Opened 1801x1801 overview.\n",
"DEBUG:rasterio._env:CPLE_None in GTiff: Opened 901x901 overview.\n",
"DEBUG:rasterio._env:CPLE_None in GTiff: Opened 451x451 overview.\n",
"DEBUG:rasterio._io:all_valid: False\n",
"DEBUG:rasterio._io:mask_flags: ([<MaskFlags.nodata: 8>],)\n",
"DEBUG:rasterio._io:Jump straight to _read()\n",
"DEBUG:rasterio._io:Window: None\n",
"DEBUG:rasterio._io:IO window xoff=0.0 yoff=0.0 width=3601.0 height=3601.0\n",
"DEBUG:rasterio._env:CPLE_None in VSICURL: Downloading 5046272-17280891 (https://opentopography.s3.sdsc.edu/raster/SRTM_GL1/SRTM_GL1_srtm/N39W109.tif)...\n",
"DEBUG:rasterio._env:CPLE_None in VSICURL: Got response_code=206\n",
"DEBUG:rasterio._env:CPLE_None in VRT: No valid sources found for band in VRT file \n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALOpen(<VRTDataset rasterYSize=\"3601\" rasterXSize=\"3601\"><VRTRasterBand /><SRS>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\"]]</SRS><GeoTransform>-109.00013888888888,0.000277777777777779,0.0,40.00013888888889,0.0,-0.00027777777777777707</GeoTransform></VRTDataset>, this=0x55bcd21aedc0) succeeds as VRT.\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: Computing area of interest: -109, 38.9999, -108, 40.0001\n",
"DEBUG:rasterio._env:CPLE_None in OGRCT: Wrap source at -108.5.\n",
"DEBUG:rasterio._warp:Created exact transformer\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALClose(<VRTDataset rasterYSize=\"3601\" rasterXSize=\"3601\"><VRTRasterBand /><SRS>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\"]]</SRS><GeoTransform>-109.00013888888888,0.000277777777777779,0.0,40.00013888888889,0.0,-0.00027777777777777707</GeoTransform></VRTDataset>, this=0x55bcd21aedc0)\n",
"DEBUG:rasterio.env:Got a copy of environment <rasterio._env.GDALEnv object at 0x7f5d8db3ceb0> options\n",
"DEBUG:rasterio.env:Entering env context: <rasterio.env.Env object at 0x7f5d8db3cee0>\n",
"DEBUG:rasterio.env:Got a copy of environment <rasterio._env.GDALEnv object at 0x7f5d8db3ceb0> options\n",
"DEBUG:rasterio.env:Entered env context: <rasterio.env.Env object at 0x7f5d8db3cee0>\n",
"DEBUG:rasterio._io:Path: _UnparsedPath(path='epsg7661_rio13_srtm.tif'), mode: w, driver: GTiff\n",
"INFO:rasterio._env:GDAL signalled an error: err_no=4, msg='epsg7661_rio13_srtm.tif: No such file or directory'\n",
"DEBUG:rasterio._io:Skipped delete for overwrite, dataset does not exist: 'epsg7661_rio13_srtm.tif'\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALDriver::Create(GTiff,epsg7661_rio13_srtm.tif,3601,3601,1,Float32,(nil))\n",
"DEBUG:rasterio._base:Nodata success: 1, Nodata value: -32768.000000\n",
"DEBUG:rasterio.env:Exiting env context: <rasterio.env.Env object at 0x7f5d8db3cee0>\n",
"DEBUG:rasterio.env:Cleared existing <rasterio._env.GDALEnv object at 0x7f5d8db3ceb0> options\n",
"DEBUG:rasterio._env:Stopped GDALEnv <rasterio._env.GDALEnv object at 0x7f5d8db3ceb0>.\n",
"DEBUG:rasterio.env:No GDAL environment exists\n",
"DEBUG:rasterio.env:New GDAL environment <rasterio._env.GDALEnv object at 0x7f5d8db3ceb0> created\n",
"DEBUG:rasterio._env:GDAL_DATA found in environment.\n",
"DEBUG:rasterio._env:PROJ_LIB found in environment.\n",
"DEBUG:rasterio._env:Started GDALEnv: self=<rasterio._env.GDALEnv object at 0x7f5d8db3ceb0>.\n",
"DEBUG:rasterio.env:Exited env context: <rasterio.env.Env object at 0x7f5d8db3cee0>\n",
"DEBUG:rasterio._io:Path: _UnparsedPath(path='MEM:::DATAPOINTER=140039564554256,PIXELS=3601,LINES=3601,BANDS=1,DATATYPE=Int16'), mode: r+, driver: None\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALOpen(MEM:::DATAPOINTER=140039564554256,PIXELS=3601,LINES=3601,BANDS=1,DATATYPE=Int16, this=0x55bcd2254cd0) succeeds as MEM.\n",
"DEBUG:rasterio._base:Nodata success: 0, Nodata value: 0.000000\n",
"DEBUG:rasterio._io:Path: _UnparsedPath(path='MEM:::DATAPOINTER=140039590490128,PIXELS=3601,LINES=3601,BANDS=1,DATATYPE=Float64'), mode: r+, driver: None\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALOpen(MEM:::DATAPOINTER=140039590490128,PIXELS=3601,LINES=3601,BANDS=1,DATATYPE=Float64, this=0x55bcd0a98830) succeeds as MEM.\n",
"DEBUG:rasterio._base:Nodata success: 0, Nodata value: 0.000000\n",
"DEBUG:rasterio._warp:Created temp destination dataset.\n",
"DEBUG:rasterio._warp:Set _reproject Transformer option b'APPLY_VERTICAL_SHIFT'=b'TRUE'\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: Computing area of interest: -109, 38.9999, -108, 40.0001\n",
"DEBUG:rasterio._warp:Created approximate transformer\n",
"DEBUG:rasterio._warp:Created transformer and options.\n",
"DEBUG:rasterio._warp:Setting NUM_THREADS option: 1\n",
"DEBUG:rasterio._warp:Warp Memory Limit set: 128\n",
"DEBUG:rasterio._warp:Configured to warp src band 1 to destination band 1\n",
"DEBUG:rasterio._warp:Set transformer options\n",
"DEBUG:rasterio._warp:Chunk and warp window: 0, 0, 3601, 3601.\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALWarpKernel()::GWKRealCase() Src=0,0,3601x1800 Dst=0,0,3601x1800\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALWarpKernel()::GWKRealCase() Src=0,1800,3601x1801 Dst=0,1800,3601x1801\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALClose(Temporary destination dataset for _reproject(), this=0x55bcd0a98830)\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALClose(MEM:::DATAPOINTER=140039564554256,PIXELS=3601,LINES=3601,BANDS=1,DATATYPE=Int16, this=0x55bcd2254cd0)\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALClose(epsg7661_rio13_srtm.tif, this=0x55bcd21ae780)\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALClose(/vsicurl/https://opentopography.s3.sdsc.edu/raster/SRTM_GL1/SRTM_GL1_srtm/N39W109.tif, this=0x55bcd0fdc4a0)\n",
"DEBUG:rasterio.env:Exiting env context: <rasterio.env.Env object at 0x7f5e08c1c160>\n",
"DEBUG:rasterio.env:Cleared existing <rasterio._env.GDALEnv object at 0x7f5d8db3ceb0> options\n",
"DEBUG:rasterio._env:Stopped GDALEnv <rasterio._env.GDALEnv object at 0x7f5d8db3ceb0>.\n",
"DEBUG:rasterio.env:Exiting outermost env\n",
"DEBUG:rasterio.env:Exited env context: <rasterio.env.Env object at 0x7f5e08c1c160>\n",
"DEBUG:rasterio.env:Entering env context: <rasterio.env.Env object at 0x7f5e08c1c160>\n",
"DEBUG:rasterio.env:Starting outermost env\n",
"DEBUG:rasterio.env:No GDAL environment exists\n",
"DEBUG:rasterio.env:New GDAL environment <rasterio._env.GDALEnv object at 0x7f5d8db3cee0> created\n",
"DEBUG:rasterio._env:GDAL_DATA found in environment.\n",
"DEBUG:rasterio._env:PROJ_LIB found in environment.\n",
"DEBUG:rasterio._env:Started GDALEnv: self=<rasterio._env.GDALEnv object at 0x7f5d8db3cee0>.\n",
"DEBUG:rasterio.env:Entered env context: <rasterio.env.Env object at 0x7f5e08c1c160>\n",
"DEBUG:rasterio.env:Got a copy of environment <rasterio._env.GDALEnv object at 0x7f5d8db3cee0> options\n",
"DEBUG:rasterio.env:Entering env context: <rasterio.env.Env object at 0x7f5d8db3f280>\n",
"DEBUG:rasterio.env:Got a copy of environment <rasterio._env.GDALEnv object at 0x7f5d8db3cee0> options\n",
"DEBUG:rasterio.env:Entered env context: <rasterio.env.Env object at 0x7f5d8db3f280>\n",
"DEBUG:rasterio._base:Sharing flag: 0\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALOpen(/vsicurl/https://opentopography.s3.sdsc.edu/raster/SRTM_GL1/SRTM_GL1_srtm/N39W109.tif, this=0x55bcd0fdc4a0) succeeds as GTiff.\n",
"DEBUG:rasterio._base:Nodata success: 1, Nodata value: -32768.000000\n",
"DEBUG:rasterio._base:Dataset <open DatasetReader name='https://opentopography.s3.sdsc.edu/raster/SRTM_GL1/SRTM_GL1_srtm/N39W109.tif' mode='r'> is started.\n",
"DEBUG:rasterio.env:Exiting env context: <rasterio.env.Env object at 0x7f5d8db3f280>\n",
"DEBUG:rasterio.env:Cleared existing <rasterio._env.GDALEnv object at 0x7f5d8db3cee0> options\n",
"DEBUG:rasterio._env:Stopped GDALEnv <rasterio._env.GDALEnv object at 0x7f5d8db3cee0>.\n",
"DEBUG:rasterio.env:No GDAL environment exists\n",
"DEBUG:rasterio.env:New GDAL environment <rasterio._env.GDALEnv object at 0x7f5d8db3cee0> created\n",
"DEBUG:rasterio._env:GDAL_DATA found in environment.\n",
"DEBUG:rasterio._env:PROJ_LIB found in environment.\n",
"DEBUG:rasterio._env:Started GDALEnv: self=<rasterio._env.GDALEnv object at 0x7f5d8db3cee0>.\n",
"DEBUG:rasterio.env:Exited env context: <rasterio.env.Env object at 0x7f5d8db3f280>\n",
"DEBUG:rasterio._io:Output nodata value read from file: -32768.0\n",
"DEBUG:rasterio._io:Output nodata values: [-32768.0]\n",
"DEBUG:rasterio._env:CPLE_None in GTiff: ScanDirectories()\n",
"DEBUG:rasterio._env:CPLE_None in GTiff: Opened 1801x1801 overview.\n",
"DEBUG:rasterio._env:CPLE_None in GTiff: Opened 901x901 overview.\n",
"DEBUG:rasterio._env:CPLE_None in GTiff: Opened 451x451 overview.\n",
"DEBUG:rasterio._io:all_valid: False\n",
"DEBUG:rasterio._io:mask_flags: ([<MaskFlags.nodata: 8>],)\n",
"DEBUG:rasterio._io:Jump straight to _read()\n",
"DEBUG:rasterio._io:Window: None\n",
"DEBUG:rasterio._io:IO window xoff=0.0 yoff=0.0 width=3601.0 height=3601.0\n",
"DEBUG:rasterio._env:CPLE_None in VRT: No valid sources found for band in VRT file \n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALOpen(<VRTDataset rasterYSize=\"3601\" rasterXSize=\"3601\"><VRTRasterBand /><SRS>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\"]]</SRS><GeoTransform>-109.00013888888888,0.000277777777777779,0.0,40.00013888888889,0.0,-0.00027777777777777707</GeoTransform></VRTDataset>, this=0x55bcd21aedc0) succeeds as VRT.\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: Computing area of interest: -109, 38.9999, -108, 40.0001\n",
"DEBUG:rasterio._warp:Created exact transformer\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALClose(<VRTDataset rasterYSize=\"3601\" rasterXSize=\"3601\"><VRTRasterBand /><SRS>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\"]]</SRS><GeoTransform>-109.00013888888888,0.000277777777777779,0.0,40.00013888888889,0.0,-0.00027777777777777707</GeoTransform></VRTDataset>, this=0x55bcd21aedc0)\n",
"DEBUG:rasterio.env:Got a copy of environment <rasterio._env.GDALEnv object at 0x7f5d8db3cee0> options\n",
"DEBUG:rasterio.env:Entering env context: <rasterio.env.Env object at 0x7f5d8db3cd30>\n",
"DEBUG:rasterio.env:Got a copy of environment <rasterio._env.GDALEnv object at 0x7f5d8db3cee0> options\n",
"DEBUG:rasterio.env:Entered env context: <rasterio.env.Env object at 0x7f5d8db3cd30>\n",
"DEBUG:rasterio._io:Path: _UnparsedPath(path='epsg7661_rio13_srtm.tif'), mode: w, driver: GTiff\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALOpen(epsg7661_rio13_srtm.tif, this=0x55bcd21ae780) succeeds as GTiff.\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALClose(epsg7661_rio13_srtm.tif, this=0x55bcd21ae780)\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALOpen(epsg7661_rio13_srtm.tif, this=0x55bcd21ae780) succeeds as GTiff.\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALDefaultOverviews::OverviewScan()\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALClose(epsg7661_rio13_srtm.tif, this=0x55bcd21ae780)\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALDriver::Create(GTiff,epsg7661_rio13_srtm.tif,3601,3601,1,Float32,(nil))\n",
"DEBUG:rasterio._base:Nodata success: 1, Nodata value: -32768.000000\n",
"DEBUG:rasterio.env:Exiting env context: <rasterio.env.Env object at 0x7f5d8db3cd30>\n",
"DEBUG:rasterio.env:Cleared existing <rasterio._env.GDALEnv object at 0x7f5d8db3cee0> options\n",
"DEBUG:rasterio._env:Stopped GDALEnv <rasterio._env.GDALEnv object at 0x7f5d8db3cee0>.\n",
"DEBUG:rasterio.env:No GDAL environment exists\n",
"DEBUG:rasterio.env:New GDAL environment <rasterio._env.GDALEnv object at 0x7f5d8db3cee0> created\n",
"DEBUG:rasterio._env:GDAL_DATA found in environment.\n",
"DEBUG:rasterio._env:PROJ_LIB found in environment.\n",
"DEBUG:rasterio._env:Started GDALEnv: self=<rasterio._env.GDALEnv object at 0x7f5d8db3cee0>.\n",
"DEBUG:rasterio.env:Exited env context: <rasterio.env.Env object at 0x7f5d8db3cd30>\n",
"DEBUG:rasterio._io:Path: _UnparsedPath(path='MEM:::DATAPOINTER=94269576473808,PIXELS=3601,LINES=3601,BANDS=1,DATATYPE=Int16'), mode: r+, driver: None\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALOpen(MEM:::DATAPOINTER=94269576473808,PIXELS=3601,LINES=3601,BANDS=1,DATATYPE=Int16, this=0x55bcd2254cd0) succeeds as MEM.\n",
"DEBUG:rasterio._base:Nodata success: 0, Nodata value: 0.000000\n",
"DEBUG:rasterio._io:Path: _UnparsedPath(path='MEM:::DATAPOINTER=140039486750736,PIXELS=3601,LINES=3601,BANDS=1,DATATYPE=Float64'), mode: r+, driver: None\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALOpen(MEM:::DATAPOINTER=140039486750736,PIXELS=3601,LINES=3601,BANDS=1,DATATYPE=Float64, this=0x55bcd0a98830) succeeds as MEM.\n",
"DEBUG:rasterio._base:Nodata success: 0, Nodata value: 0.000000\n",
"DEBUG:rasterio._warp:Created temp destination dataset.\n",
"DEBUG:rasterio._warp:Set _reproject Transformer option b'APPLY_VERTICAL_SHIFT'=b'TRUE'\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: Computing area of interest: -109, 38.9999, -108, 40.0001\n",
"DEBUG:rasterio._warp:Created approximate transformer\n",
"DEBUG:rasterio._warp:Created transformer and options.\n",
"DEBUG:rasterio._warp:Setting NUM_THREADS option: 1\n",
"DEBUG:rasterio._warp:Warp Memory Limit set: 64\n",
"DEBUG:rasterio._warp:Configured to warp src band 1 to destination band 1\n",
"DEBUG:rasterio._warp:Set transformer options\n",
"DEBUG:rasterio._warp:Chunk and warp window: 0, 0, 3601, 3601.\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALWarpKernel()::GWKRealCase() Src=0,0,1800x1800 Dst=0,0,1800x1800\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALWarpKernel()::GWKRealCase() Src=1800,0,1801x1800 Dst=1800,0,1801x1800\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALWarpKernel()::GWKRealCase() Src=0,1800,1800x1801 Dst=0,1800,1800x1801\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALWarpKernel()::GWKRealCase() Src=1800,1800,1801x1801 Dst=1800,1800,1801x1801\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALClose(Temporary destination dataset for _reproject(), this=0x55bcd0a98830)\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALClose(MEM:::DATAPOINTER=94269576473808,PIXELS=3601,LINES=3601,BANDS=1,DATATYPE=Int16, this=0x55bcd2254cd0)\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALClose(epsg7661_rio13_srtm.tif, this=0x55bcd21ae780)\n",
"DEBUG:rasterio._env:CPLE_None in GDAL: GDALClose(/vsicurl/https://opentopography.s3.sdsc.edu/raster/SRTM_GL1/SRTM_GL1_srtm/N39W109.tif, this=0x55bcd0fdc4a0)\n",
"DEBUG:rasterio.env:Exiting env context: <rasterio.env.Env object at 0x7f5e08c1c160>\n",
"DEBUG:rasterio.env:Cleared existing <rasterio._env.GDALEnv object at 0x7f5d8db3cee0> options\n",
"DEBUG:rasterio._env:Stopped GDALEnv <rasterio._env.GDALEnv object at 0x7f5d8db3cee0>.\n",
"DEBUG:rasterio.env:Exiting outermost env\n",
"DEBUG:rasterio.env:Exited env context: <rasterio.env.Env object at 0x7f5e08c1c160>\n",
"DEBUG:rasterio.env:Entering env context: <rasterio.env.Env object at 0x7f5e08c1c160>\n",
"DEBUG:rasterio.env:Starting outermost env\n",
"DEBUG:rasterio.env:No GDAL environment exists\n",
"DEBUG:rasterio.env:New GDAL environment <rasterio._env.GDALEnv object at 0x7f5d8db3cd90> created\n",
"DEBUG:rasterio._env:GDAL_DATA found in environment.\n",
"DEBUG:rasterio._env:PROJ_LIB found in environment.\n",
"DEBUG:rasterio._env:Started GDALEnv: self=<rasterio._env.GDALEnv object at 0x7f5d8db3cd90>.\n",
"DEBUG:rasterio.env:Entered env context: <rasterio.env.Env object at 0x7f5e08c1c160>\n",
"DEBUG:rasterio.env:Got a copy of environment <rasterio._env.GDALEnv object at 0x7f5d8db3cd90> options\n",
"DEBUG:rasterio.env:Entering env context: <rasterio.env.Env object at 0x7f5d8db3f280>\n",
"DEBUG:rasterio.env:Got a copy of environment <rasterio._env.GDALEnv object at 0x7f5d8db3cd90> options\n",
"DEBUG:rasterio.env:Entered env context: <rasterio.env.Env object at 0x7f5d8db3f280>\n"
]
}
],
"source": [
"!head -n 220 rasterio.log"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "2633a0a5-9f1b-4684-b947-412492370906",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"GDAL 3.5.1, released 2022/06/30\n"
]
}
],
"source": [
"!gdalinfo --version"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "1d4570cb-89b8-4b8d-b1a3-0870626c01f4",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Rel. 9.0.1, June 15th, 2022\n",
"usage: proj [-bdeEfiIlmorsStTvVwW [args]] [+opt[=arg] ...] [file ...]\n"
]
}
],
"source": [
"!proj"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "33742b8b-1044-4d86-8b8b-3c6eadcb014d",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"3.11.0\n"
]
}
],
"source": [
"!geos-config --version"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "e9910b9d-2655-47aa-88ed-933b0132c366",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"rasterio info:\n",
" rasterio: 1.3.0\n",
" GDAL: 3.5.1\n",
" PROJ: 9.0.1\n",
" GEOS: 3.11.0\n",
" PROJ DATA: /srv/conda/envs/notebook/share/proj\n",
" GDAL DATA: /srv/conda/envs/notebook/share/gdal\n",
"\n",
"System:\n",
" python: 3.10.5 | packaged by conda-forge | (main, Jun 14 2022, 07:04:59) [GCC 10.3.0]\n",
"executable: /srv/conda/envs/notebook/bin/python\n",
" machine: Linux-5.4.172-90.336.amzn2.x86_64-x86_64-with-glibc2.27\n",
"\n",
"Python deps:\n",
" affine: 2.3.1\n",
" attrs: 21.4.0\n",
" certifi: 2022.06.15\n",
" click: 8.1.3\n",
" cligj: 0.7.2\n",
" cython: None\n",
" numpy: 1.22.4\n",
" snuggs: 1.4.7\n",
"click-plugins: None\n",
"setuptools: 63.1.0\n"
]
}
],
"source": [
"!rio --show-versions"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.10.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment