Skip to content

Commit b96aa15

Browse files
authored
add notebook save cogs in examples directory (#307)
* add notebook save cogs in examples directory * edit to use rioxarray but no internal overviews * remove .idea and add to gitignore * change manifest for ds store to fix missing in vcs error * revert
1 parent 111cae4 commit b96aa15

File tree

1 file changed

+134
-0
lines changed

1 file changed

+134
-0
lines changed

examples/save_cogs_azure.ipynb

+134
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
{
2+
"cells": [
3+
{
4+
"cell_type": "code",
5+
"execution_count": 57,
6+
"id": "da71540d",
7+
"metadata": {},
8+
"outputs": [],
9+
"source": [
10+
"import numpy as np\n",
11+
"import xarray as xr\n",
12+
"import xrspatial\n",
13+
"from xrspatial.terrain import generate_terrain\n",
14+
"import rioxarray\n",
15+
"import datashader as ds"
16+
]
17+
},
18+
{
19+
"cell_type": "code",
20+
"execution_count": 59,
21+
"id": "dc0f0900",
22+
"metadata": {},
23+
"outputs": [
24+
{
25+
"name": "stderr",
26+
"output_type": "stream",
27+
"text": [
28+
"/Users/ls/anaconda3/envs/xrs/lib/python3.8/site-packages/ipykernel/ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
29+
" and should_run_async(code)\n"
30+
]
31+
},
32+
{
33+
"data": {
34+
"text/plain": [
35+
"('band', 'y', 'x')"
36+
]
37+
},
38+
"execution_count": 59,
39+
"metadata": {},
40+
"output_type": "execute_result"
41+
}
42+
],
43+
"source": [
44+
"# example with terrain and add 1 band\n",
45+
"cvs = ds.Canvas(x_range=(-20,20), y_range=(-20,20), plot_height=400, plot_width=800)\n",
46+
"terrain = generate_terrain(canvas=cvs)\n",
47+
"terrain = terrain.assign_coords(band = np.asarray(1, np.int64))\n",
48+
"terrain = terrain.expand_dims('band')\n",
49+
"terrain.dims"
50+
]
51+
},
52+
{
53+
"cell_type": "code",
54+
"execution_count": 60,
55+
"id": "6bfcd504",
56+
"metadata": {},
57+
"outputs": [
58+
{
59+
"name": "stderr",
60+
"output_type": "stream",
61+
"text": [
62+
"/Users/ls/anaconda3/envs/xrs/lib/python3.8/site-packages/ipykernel/ipkernel.py:287: DeprecationWarning: `should_run_async` will not call `transform_cell` automatically in the future. Please pass the result to `transformed_cell` argument and any exception that happen during thetransform in `preprocessing_exc_tuple` in IPython 7.17 and above.\n",
63+
" and should_run_async(code)\n"
64+
]
65+
}
66+
],
67+
"source": [
68+
"terrain.rio.to_raster('rioxarray_terrain.tiff')"
69+
]
70+
},
71+
{
72+
"cell_type": "code",
73+
"execution_count": 62,
74+
"id": "9baddf0f",
75+
"metadata": {},
76+
"outputs": [
77+
{
78+
"ename": "ClientAuthenticationError",
79+
"evalue": "Operation returned an invalid status 'Server failed to authenticate the request. Please refer to the information in the www-authenticate header.'",
80+
"output_type": "error",
81+
"traceback": [
82+
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
83+
"\u001b[0;31mClientAuthenticationError\u001b[0m Traceback (most recent call last)",
84+
"\u001b[0;32m<ipython-input-62-8936274aae9d>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 8\u001b[0m \"rioxarray_cog.tiff\")\n\u001b[1;32m 9\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'rioxarray_terrain.tiff'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'rb'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mimg\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mblob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupload_blob\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mimg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0mcontent_settings\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mContentSettings\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcontent_type\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'image/tiff'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0mblob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_http_headers\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcontent_settings\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcontent_settings\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
85+
"\u001b[0;32m~/anaconda3/envs/xrs/lib/python3.8/site-packages/azure/core/tracing/decorator.py\u001b[0m in \u001b[0;36mwrapper_use_tracer\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 81\u001b[0m \u001b[0mspan_impl_type\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msettings\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtracing_implementation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 82\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mspan_impl_type\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 83\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 84\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 85\u001b[0m \u001b[0;31m# Merge span is parameter is set, but only if no explicit parent are passed\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
86+
"\u001b[0;32m~/anaconda3/envs/xrs/lib/python3.8/site-packages/azure/storage/blob/_blob_client.py\u001b[0m in \u001b[0;36mupload_blob\u001b[0;34m(self, data, blob_type, length, metadata, **kwargs)\u001b[0m\n\u001b[1;32m 683\u001b[0m **kwargs)\n\u001b[1;32m 684\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mblob_type\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mBlobType\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mBlockBlob\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 685\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mupload_block_blob\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 686\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mblob_type\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mBlobType\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mPageBlob\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 687\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mupload_page_blob\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
87+
"\u001b[0;32m~/anaconda3/envs/xrs/lib/python3.8/site-packages/azure/storage/blob/_upload_helpers.py\u001b[0m in \u001b[0;36mupload_block_blob\u001b[0;34m(client, data, stream, length, overwrite, headers, validate_content, max_concurrency, blob_settings, encryption_options, **kwargs)\u001b[0m\n\u001b[1;32m 155\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mHttpResponseError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merror\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 156\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 157\u001b[0;31m \u001b[0mprocess_storage_error\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0merror\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 158\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mResourceModifiedError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mmod_error\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 159\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0moverwrite\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
88+
"\u001b[0;32m~/anaconda3/envs/xrs/lib/python3.8/site-packages/azure/storage/blob/_shared/response_handlers.py\u001b[0m in \u001b[0;36mprocess_storage_error\u001b[0;34m(storage_error)\u001b[0m\n\u001b[1;32m 87\u001b[0m \u001b[0;31m# If storage_error is one of the two then it has already been processed and serialized to the specific exception.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 88\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstorage_error\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mPartialBatchErrorException\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mClientAuthenticationError\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 89\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mstorage_error\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 90\u001b[0m \u001b[0mraise_error\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mHttpResponseError\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 91\u001b[0m \u001b[0merror_code\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstorage_error\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresponse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mheaders\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'x-ms-error-code'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
89+
"\u001b[0;32m~/anaconda3/envs/xrs/lib/python3.8/site-packages/azure/storage/blob/_upload_helpers.py\u001b[0m in \u001b[0;36mupload_block_blob\u001b[0;34m(client, data, stream, length, overwrite, headers, validate_content, max_concurrency, blob_settings, encryption_options, **kwargs)\u001b[0m\n\u001b[1;32m 92\u001b[0m \u001b[0mencryption_data\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mencrypt_blob\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mencryption_options\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'key'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 93\u001b[0m \u001b[0mheaders\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'x-ms-meta-encryptiondata'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mencryption_data\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 94\u001b[0;31m return client.upload(\n\u001b[0m\u001b[1;32m 95\u001b[0m \u001b[0mbody\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 96\u001b[0m \u001b[0mcontent_length\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0madjusted_count\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
90+
"\u001b[0;32m~/anaconda3/envs/xrs/lib/python3.8/site-packages/azure/storage/blob/_generated/operations/_block_blob_operations.py\u001b[0m in \u001b[0;36mupload\u001b[0;34m(self, content_length, body, timeout, transactional_content_md5, metadata, encryption_algorithm, tier, request_id_parameter, blob_tags_string, blob_http_headers, lease_access_conditions, cpk_info, cpk_scope_info, modified_access_conditions, **kwargs)\u001b[0m\n\u001b[1;32m 229\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 230\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstatus_code\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m201\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 231\u001b[0;31m \u001b[0mmap_error\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstatus_code\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mresponse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstatus_code\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mresponse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merror_map\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merror_map\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 232\u001b[0m \u001b[0merror\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_deserialize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_models\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mStorageError\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 233\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mHttpResponseError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresponse\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mresponse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merror\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
91+
"\u001b[0;32m~/anaconda3/envs/xrs/lib/python3.8/site-packages/azure/core/exceptions.py\u001b[0m in \u001b[0;36mmap_error\u001b[0;34m(status_code, response, error_map)\u001b[0m\n\u001b[1;32m 100\u001b[0m \u001b[0;32mreturn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 101\u001b[0m \u001b[0merror\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0merror_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresponse\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mresponse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 102\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0merror\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 103\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 104\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
92+
"\u001b[0;31mClientAuthenticationError\u001b[0m: Operation returned an invalid status 'Server failed to authenticate the request. Please refer to the information in the www-authenticate header.'"
93+
]
94+
}
95+
],
96+
"source": [
97+
"# save to azure: export access_key in environ or set new module\n",
98+
"import os\n",
99+
"from azure.storage.blob import BlobClient\n",
100+
"from azure.storage.blob import ContentSettings\n",
101+
"\n",
102+
"blob = BlobClient(\"https://xarrayspatial.blob.core.windows.net/\", \n",
103+
" \"examples-data\", \n",
104+
" \"rioxarray_cog.tiff\",\n",
105+
" credential=os.environ['AZURE_ACCESS_KEY'])\n",
106+
"with open('rioxarray_terrain.tiff', 'rb') as img:\n",
107+
" blob.upload_blob(img)\n",
108+
"content_settings = ContentSettings(content_type='image/tiff')\n",
109+
"blob.set_http_headers(content_settings=content_settings)"
110+
]
111+
}
112+
],
113+
"metadata": {
114+
"kernelspec": {
115+
"display_name": "Python 3",
116+
"language": "python",
117+
"name": "python3"
118+
},
119+
"language_info": {
120+
"codemirror_mode": {
121+
"name": "ipython",
122+
"version": 3
123+
},
124+
"file_extension": ".py",
125+
"mimetype": "text/x-python",
126+
"name": "python",
127+
"nbconvert_exporter": "python",
128+
"pygments_lexer": "ipython3",
129+
"version": "3.8.8"
130+
}
131+
},
132+
"nbformat": 4,
133+
"nbformat_minor": 5
134+
}

0 commit comments

Comments
 (0)