Skip to content

Instantly share code, notes, and snippets.

@vincentsarago
Last active January 25, 2023 15:52
Show Gist options
  • Save vincentsarago/57c6213c10e714f2b62f914c2462dc1a to your computer and use it in GitHub Desktop.
Save vincentsarago/57c6213c10e714f2b62f914c2462dc1a to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "6d77e3f8",
"metadata": {},
"source": [
"# TiTiler-PgSTAC Demo\n",
"\n",
"\n",
"For this demo I'm going to use https://github.com/developmentseed/eoAPI\n",
"\n",
"eoAPI let's you deploy a PgSTAC database + a STAC + a TiTiler-PGSTAC services\n",
"\n",
"\n",
"![](https://user-images.githubusercontent.com/10407788/129632832-fe6f7d80-4d87-463a-b0cc-305423a8489e.png)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "763e0780",
"metadata": {},
"outputs": [],
"source": [
"import json\n",
"import httpx\n",
"\n",
"from folium import Map, TileLayer, GeoJson\n",
"\n",
"from geojson_pydantic import Feature, Polygon\n",
"\n",
"\n",
"raster_endpoint = \"http://127.0.0.1:8082\"\n",
"stac_endpoint = \"http://127.0.0.1:8081\""
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "12163188",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\n",
" \"collections\": [\n",
" {\n",
" \"id\": \"noaa-emergency-response\",\n",
" \"links\": [\n",
" {\n",
" \"rel\": \"items\",\n",
" \"type\": \"application/geo+json\",\n",
" \"href\": \"http://127.0.0.1:8081/collections/noaa-emergency-response/items\"\n",
" },\n",
" {\n",
" \"rel\": \"parent\",\n",
" \"type\": \"application/json\",\n",
" \"href\": \"http://127.0.0.1:8081/\"\n",
" },\n",
" {\n",
" \"rel\": \"root\",\n",
" \"type\": \"application/json\",\n",
" \"href\": \"http://127.0.0.1:8081/\"\n",
" },\n",
" {\n",
" \"rel\": \"self\",\n",
" \"type\": \"application/json\",\n",
" \"href\": \"http://127.0.0.1:8081/collections/noaa-emergency-response\"\n",
" }\n",
" ],\n",
" \"title\": \"NOAA Emergency Response Imagery\",\n",
" \"extent\": {\n",
" \"spatial\": {\n",
" \"bbox\": [\n",
" [\n",
" -180,\n",
" -90,\n",
" 180,\n",
" 90\n",
" ]\n",
" ]\n",
" },\n",
" \"temporal\": {\n",
" \"interval\": [\n",
" [\n",
" \"2005-01-01T00:00:00Z\",\n",
" \"null\"\n",
" ]\n",
" ]\n",
" }\n",
" },\n",
" \"license\": \"public-domain\",\n",
" \"description\": \"NOAA Emergency Response Imagery hosted on AWS Public Dataset.\",\n",
" \"stac_version\": \"1.0.0\"\n",
" }\n",
" ],\n",
" \"links\": [\n",
" {\n",
" \"rel\": \"root\",\n",
" \"type\": \"application/json\",\n",
" \"href\": \"http://127.0.0.1:8081/\"\n",
" },\n",
" {\n",
" \"rel\": \"parent\",\n",
" \"type\": \"application/json\",\n",
" \"href\": \"http://127.0.0.1:8081/\"\n",
" },\n",
" {\n",
" \"rel\": \"self\",\n",
" \"type\": \"application/json\",\n",
" \"href\": \"http://127.0.0.1:8081/collections\"\n",
" }\n",
" ]\n",
"}\n"
]
}
],
"source": [
"# Before the demo I've created a collections and some items using \n",
"# https://github.com/developmentseed/eoAPI/tree/master/demo/noaa\n",
"\n",
"r = httpx.get(f\"{stac_endpoint}/collections\").json()\n",
"\n",
"print(json.dumps(r, indent=4))"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "764d5a94",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\n",
" \"limit\": 10,\n",
" \"matched\": 163,\n",
" \"returned\": 10\n",
"}\n"
]
}
],
"source": [
"r = httpx.get(f\"{stac_endpoint}/collections/noaa-emergency-response/items\").json()\n",
"\n",
"print(json.dumps(r[\"context\"], indent=4))"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "b606082a",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe srcdoc=\"&lt;!DOCTYPE html&gt;\n",
"&lt;head&gt; \n",
" &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;\n",
" \n",
" &lt;script&gt;\n",
" L_NO_TOUCH = false;\n",
" L_DISABLE_3D = false;\n",
" &lt;/script&gt;\n",
" \n",
" &lt;style&gt;html, body {width: 100%;height: 100%;margin: 0;padding: 0;}&lt;/style&gt;\n",
" &lt;style&gt;#map {position:absolute;top:0;bottom:0;right:0;left:0;}&lt;/style&gt;\n",
" &lt;script src=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.6.0/dist/leaflet.js&quot;&gt;&lt;/script&gt;\n",
" &lt;script src=&quot;https://code.jquery.com/jquery-1.12.4.min.js&quot;&gt;&lt;/script&gt;\n",
" &lt;script src=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js&quot;&gt;&lt;/script&gt;\n",
" &lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.js&quot;&gt;&lt;/script&gt;\n",
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.6.0/dist/leaflet.css&quot;/&gt;\n",
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css&quot;/&gt;\n",
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css&quot;/&gt;\n",
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css&quot;/&gt;\n",
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css&quot;/&gt;\n",
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/gh/python-visualization/folium/folium/templates/leaflet.awesome.rotate.min.css&quot;/&gt;\n",
" \n",
" &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,\n",
" initial-scale=1.0, maximum-scale=1.0, user-scalable=no&quot; /&gt;\n",
" &lt;style&gt;\n",
" #map_e221fd1cfd80f38784d275226e4223ca {\n",
" position: relative;\n",
" width: 100.0%;\n",
" height: 100.0%;\n",
" left: 0.0%;\n",
" top: 0.0%;\n",
" }\n",
" &lt;/style&gt;\n",
" \n",
"&lt;/head&gt;\n",
"&lt;body&gt; \n",
" \n",
" &lt;div class=&quot;folium-map&quot; id=&quot;map_e221fd1cfd80f38784d275226e4223ca&quot; &gt;&lt;/div&gt;\n",
" \n",
"&lt;/body&gt;\n",
"&lt;script&gt; \n",
" \n",
" var map_e221fd1cfd80f38784d275226e4223ca = L.map(\n",
" &quot;map_e221fd1cfd80f38784d275226e4223ca&quot;,\n",
" {\n",
" center: [36.162499999999994, -86.225],\n",
" crs: L.CRS.EPSG3857,\n",
" zoom: 8,\n",
" zoomControl: true,\n",
" preferCanvas: false,\n",
" }\n",
" );\n",
"\n",
" \n",
"\n",
" \n",
" \n",
" var tile_layer_ce38462837a103516ab0932339dc2246 = L.tileLayer(\n",
" &quot;https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png&quot;,\n",
" {&quot;attribution&quot;: &quot;Data by \\u0026copy; \\u003ca href=\\&quot;http://openstreetmap.org\\&quot;\\u003eOpenStreetMap\\u003c/a\\u003e, under \\u003ca href=\\&quot;http://www.openstreetmap.org/copyright\\&quot;\\u003eODbL\\u003c/a\\u003e.&quot;, &quot;detectRetina&quot;: false, &quot;maxNativeZoom&quot;: 18, &quot;maxZoom&quot;: 18, &quot;minZoom&quot;: 0, &quot;noWrap&quot;: false, &quot;opacity&quot;: 1, &quot;subdomains&quot;: &quot;abc&quot;, &quot;tms&quot;: false}\n",
" ).addTo(map_e221fd1cfd80f38784d275226e4223ca);\n",
" \n",
" \n",
" function geo_json_ee5c3b4ea4cc5f3c5f582aa46941df3d_styler(feature) {\n",
" switch(feature.id) {\n",
" default:\n",
" return {&quot;dashArray&quot;: &quot;1&quot;, &quot;fillOpacity&quot;: 0, &quot;opacity&quot;: 1, &quot;weight&quot;: 1};\n",
" }\n",
" }\n",
"\n",
" function geo_json_ee5c3b4ea4cc5f3c5f582aa46941df3d_onEachFeature(feature, layer) {\n",
" layer.on({\n",
" });\n",
" };\n",
" var geo_json_ee5c3b4ea4cc5f3c5f582aa46941df3d = L.geoJson(null, {\n",
" onEachFeature: geo_json_ee5c3b4ea4cc5f3c5f582aa46941df3d_onEachFeature,\n",
" \n",
" style: geo_json_ee5c3b4ea4cc5f3c5f582aa46941df3d_styler,\n",
" });\n",
"\n",
" function geo_json_ee5c3b4ea4cc5f3c5f582aa46941df3d_add (data) {\n",
" geo_json_ee5c3b4ea4cc5f3c5f582aa46941df3d\n",
" .addData(data)\n",
" .addTo(map_e221fd1cfd80f38784d275226e4223ca);\n",
" }\n",
" geo_json_ee5c3b4ea4cc5f3c5f582aa46941df3d_add({&quot;features&quot;: [{&quot;geometry&quot;: {&quot;coordinates&quot;: [[[-87.0251, 36.0999], [-85.4249, 36.0999], [-85.4249, 36.2251], [-87.0251, 36.2251], [-87.0251, 36.0999]]], &quot;type&quot;: &quot;Polygon&quot;}, &quot;id&quot;: &quot;0&quot;, &quot;type&quot;: &quot;Feature&quot;}], &quot;type&quot;: &quot;FeatureCollection&quot;});\n",
"\n",
" \n",
"&lt;/script&gt;\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x107c61910>"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# bounds of the noaa-eri-nashville2020.json items\n",
"bounds = (-87.0251, 36.0999, -85.4249, 36.2251)\n",
"\n",
"poly = Polygon.from_bounds(*bounds)\n",
"geojson = Feature(geometry=poly).dict(exclude_none=True)\n",
"\n",
"m = Map(\n",
" tiles=\"OpenStreetMap\",\n",
" location=((bounds[1] + bounds[3]) / 2,(bounds[0] + bounds[2]) / 2),\n",
" zoom_start=8\n",
")\n",
"\n",
"geo_json = GeoJson(\n",
" data=geojson,\n",
" style_function=lambda x: {\n",
" 'opacity': 1, 'dashArray': '1', 'fillOpacity': 0, 'weight': 1\n",
" },\n",
")\n",
"geo_json.add_to(m)\n",
"m"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "214b5060",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\n",
" \"id\": \"20200307aC0862400w361330\",\n",
" \"bbox\": [\n",
" -86.4001,\n",
" 36.1999,\n",
" -86.3749,\n",
" 36.2251\n",
" ],\n",
" \"type\": \"Feature\",\n",
" \"links\": [\n",
" {\n",
" \"rel\": \"collection\",\n",
" \"type\": \"application/json\",\n",
" \"href\": \"http://127.0.0.1:8081/collections/noaa-emergency-response\"\n",
" },\n",
" {\n",
" \"rel\": \"parent\",\n",
" \"type\": \"application/json\",\n",
" \"href\": \"http://127.0.0.1:8081/collections/noaa-emergency-response\"\n",
" },\n",
" {\n",
" \"rel\": \"root\",\n",
" \"type\": \"application/json\",\n",
" \"href\": \"http://127.0.0.1:8081/\"\n",
" },\n",
" {\n",
" \"rel\": \"self\",\n",
" \"type\": \"application/geo+json\",\n",
" \"href\": \"http://127.0.0.1:8081/collections/noaa-emergency-response/items/20200307aC0862400w361330\"\n",
" }\n",
" ],\n",
" \"assets\": {\n",
" \"cog\": {\n",
" \"href\": \"https://noaa-eri-pds.s3.us-east-1.amazonaws.com/2020_Nashville_Tornado/20200307a_RGB/20200307aC0862400w361330n.tif\",\n",
" \"type\": \"image/tiff; application=geotiff; profile=cloud-optimized\"\n",
" }\n",
" },\n",
" \"geometry\": {\n",
" \"type\": \"Polygon\",\n",
" \"coordinates\": [\n",
" [\n",
" [\n",
" -86.4001,\n",
" 36.2251\n",
" ],\n",
" [\n",
" -86.4001,\n",
" 36.1999\n",
" ],\n",
" [\n",
" -86.3749,\n",
" 36.1999\n",
" ],\n",
" [\n",
" -86.3749,\n",
" 36.2251\n",
" ],\n",
" [\n",
" -86.4001,\n",
" 36.2251\n",
" ]\n",
" ]\n",
" ]\n",
" },\n",
" \"collection\": \"noaa-emergency-response\",\n",
" \"properties\": {\n",
" \"event\": \"Nashville Tornado\",\n",
" \"datetime\": \"2020-03-11T00:00:01Z\"\n",
" },\n",
" \"stac_version\": \"1.0.0\",\n",
" \"stac_extensions\": []\n",
"}\n"
]
}
],
"source": [
"r = httpx.get(f\"{stac_endpoint}/collections/noaa-emergency-response/items\").json()\n",
"item = r[\"features\"][0]\n",
"\n",
"print(json.dumps(item, indent=4))"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "ded4afbf",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\n",
" \"cog\": {\n",
" \"bounds\": [\n",
" -86.4001,\n",
" 36.1999,\n",
" -86.3749,\n",
" 36.2251\n",
" ],\n",
" \"minzoom\": 13,\n",
" \"maxzoom\": 20,\n",
" \"band_metadata\": [\n",
" [\n",
" \"b1\",\n",
" {}\n",
" ],\n",
" [\n",
" \"b2\",\n",
" {}\n",
" ],\n",
" [\n",
" \"b3\",\n",
" {}\n",
" ]\n",
" ],\n",
" \"band_descriptions\": [\n",
" [\n",
" \"b1\",\n",
" \"\"\n",
" ],\n",
" [\n",
" \"b2\",\n",
" \"\"\n",
" ],\n",
" [\n",
" \"b3\",\n",
" \"\"\n",
" ]\n",
" ],\n",
" \"dtype\": \"uint8\",\n",
" \"nodata_type\": \"Mask\",\n",
" \"colorinterp\": [\n",
" \"red\",\n",
" \"green\",\n",
" \"blue\"\n",
" ],\n",
" \"height\": 18681,\n",
" \"driver\": \"GTiff\",\n",
" \"overviews\": [\n",
" 2,\n",
" 4,\n",
" 8,\n",
" 16,\n",
" 32,\n",
" 64,\n",
" 128\n",
" ],\n",
" \"width\": 18681,\n",
" \"count\": 3\n",
" }\n",
"}\n"
]
}
],
"source": [
"info = httpx.get(\n",
" f\"{raster_endpoint}/collections/{item['collection']}/items/{item['id']}/info\",\n",
" params={\n",
" \"assets\": \"cog\",\n",
" }\n",
").json()\n",
"\n",
"print(json.dumps(info, indent=4))"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "b689edff",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'tilejson': '2.2.0', 'version': '1.0.0', 'scheme': 'xyz', 'tiles': ['http://127.0.0.1:8082/collections/noaa-emergency-response/items/20200307aC0862400w361330/tiles/WebMercatorQuad/{z}/{x}/{y}@1x?assets=cog'], 'minzoom': 13, 'maxzoom': 20, 'bounds': [-86.4001, 36.1999, -86.3749, 36.2251], 'center': [-86.38749999999999, 36.2125, 13]}\n"
]
},
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe srcdoc=\"&lt;!DOCTYPE html&gt;\n",
"&lt;head&gt; \n",
" &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;\n",
" \n",
" &lt;script&gt;\n",
" L_NO_TOUCH = false;\n",
" L_DISABLE_3D = false;\n",
" &lt;/script&gt;\n",
" \n",
" &lt;style&gt;html, body {width: 100%;height: 100%;margin: 0;padding: 0;}&lt;/style&gt;\n",
" &lt;style&gt;#map {position:absolute;top:0;bottom:0;right:0;left:0;}&lt;/style&gt;\n",
" &lt;script src=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.6.0/dist/leaflet.js&quot;&gt;&lt;/script&gt;\n",
" &lt;script src=&quot;https://code.jquery.com/jquery-1.12.4.min.js&quot;&gt;&lt;/script&gt;\n",
" &lt;script src=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js&quot;&gt;&lt;/script&gt;\n",
" &lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.js&quot;&gt;&lt;/script&gt;\n",
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.6.0/dist/leaflet.css&quot;/&gt;\n",
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css&quot;/&gt;\n",
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css&quot;/&gt;\n",
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css&quot;/&gt;\n",
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css&quot;/&gt;\n",
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/gh/python-visualization/folium/folium/templates/leaflet.awesome.rotate.min.css&quot;/&gt;\n",
" \n",
" &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,\n",
" initial-scale=1.0, maximum-scale=1.0, user-scalable=no&quot; /&gt;\n",
" &lt;style&gt;\n",
" #map_574ca01b64b36acae301581ac7bc8de5 {\n",
" position: relative;\n",
" width: 100.0%;\n",
" height: 100.0%;\n",
" left: 0.0%;\n",
" top: 0.0%;\n",
" }\n",
" &lt;/style&gt;\n",
" \n",
"&lt;/head&gt;\n",
"&lt;body&gt; \n",
" \n",
" &lt;div class=&quot;folium-map&quot; id=&quot;map_574ca01b64b36acae301581ac7bc8de5&quot; &gt;&lt;/div&gt;\n",
" \n",
"&lt;/body&gt;\n",
"&lt;script&gt; \n",
" \n",
" var map_574ca01b64b36acae301581ac7bc8de5 = L.map(\n",
" &quot;map_574ca01b64b36acae301581ac7bc8de5&quot;,\n",
" {\n",
" center: [36.162499999999994, -86.225],\n",
" crs: L.CRS.EPSG3857,\n",
" zoom: 13,\n",
" zoomControl: true,\n",
" preferCanvas: false,\n",
" }\n",
" );\n",
"\n",
" \n",
"\n",
" \n",
" \n",
" var tile_layer_c9d7fde930c51c0b2a1f5de1436971b9 = L.tileLayer(\n",
" &quot;https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png&quot;,\n",
" {&quot;attribution&quot;: &quot;Data by \\u0026copy; \\u003ca href=\\&quot;http://openstreetmap.org\\&quot;\\u003eOpenStreetMap\\u003c/a\\u003e, under \\u003ca href=\\&quot;http://www.openstreetmap.org/copyright\\&quot;\\u003eODbL\\u003c/a\\u003e.&quot;, &quot;detectRetina&quot;: false, &quot;maxNativeZoom&quot;: 18, &quot;maxZoom&quot;: 18, &quot;minZoom&quot;: 0, &quot;noWrap&quot;: false, &quot;opacity&quot;: 1, &quot;subdomains&quot;: &quot;abc&quot;, &quot;tms&quot;: false}\n",
" ).addTo(map_574ca01b64b36acae301581ac7bc8de5);\n",
" \n",
" \n",
" var tile_layer_fb96cf84907dbd5ad062e4c418d6a1f0 = L.tileLayer(\n",
" &quot;http://127.0.0.1:8082/collections/noaa-emergency-response/items/20200307aC0862400w361330/tiles/WebMercatorQuad/{z}/{x}/{y}@1x?assets=cog&quot;,\n",
" {&quot;attribution&quot;: &quot;Maxar&quot;, &quot;detectRetina&quot;: false, &quot;maxNativeZoom&quot;: 18, &quot;maxZoom&quot;: 18, &quot;minZoom&quot;: 0, &quot;noWrap&quot;: false, &quot;opacity&quot;: 1, &quot;subdomains&quot;: &quot;abc&quot;, &quot;tms&quot;: false}\n",
" ).addTo(map_574ca01b64b36acae301581ac7bc8de5);\n",
" \n",
"&lt;/script&gt;\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x11f4708b0>"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"info = httpx.get(\n",
" f\"{raster_endpoint}/collections/{item['collection']}/items/{item['id']}/info\",\n",
" params={\n",
" \"assets\": \"cog\",\n",
" }\n",
").json()[\"cog\"]\n",
"\n",
"r = httpx.get(\n",
" f\"{raster_endpoint}/collections/{item['collection']}/items/{item['id']}/tilejson.json\",\n",
" params = (\n",
" (\"assets\", \"cog\"),\n",
" (\"minzoom\", info[\"minzoom\"]),\n",
" (\"maxzoom\", info[\"maxzoom\"]),\n",
" )\n",
").json()\n",
"print(r)\n",
"\n",
"m = Map(\n",
" location=((bounds[1] + bounds[3]) / 2,(bounds[0] + bounds[2]) / 2),\n",
" zoom_start=r[\"minzoom\"]\n",
")\n",
"\n",
"aod_layer = TileLayer(\n",
" tiles=r[\"tiles\"][0],\n",
" opacity=1,\n",
" attr=\"Maxar\"\n",
")\n",
"aod_layer.add_to(m)\n",
"m"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "ee00d9e0",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\n",
" \"searchid\": \"6d436413d0eed760acc2f6bd16ca77a5\",\n",
" \"links\": [\n",
" {\n",
" \"rel\": \"metadata\",\n",
" \"type\": \"application/json\",\n",
" \"href\": \"http://127.0.0.1:8082/mosaic/6d436413d0eed760acc2f6bd16ca77a5/info\"\n",
" },\n",
" {\n",
" \"rel\": \"tilejson\",\n",
" \"type\": \"application/json\",\n",
" \"href\": \"http://127.0.0.1:8082/mosaic/6d436413d0eed760acc2f6bd16ca77a5/tilejson.json\"\n",
" }\n",
" ]\n",
"}\n"
]
}
],
"source": [
"bounds = (-87.0251, 36.0999, -85.4249, 36.2251)\n",
"\n",
"# STAC API /search request\n",
"search_request = {\n",
" # Filter collection\n",
" \"collections\": [\"noaa-emergency-response\"],\n",
" # limit bounds of the known items (note: the bbox will also be used in the tilejson response)\n",
" \"bbox\": bounds,\n",
" \"filter-lang\": \"cql-json\",\n",
"}\n",
"\n",
"r = httpx.post(\n",
" f\"{raster_endpoint}/mosaic/register\", json=search_request,\n",
").json()\n",
"\n",
"searchid = response[\"searchid\"]\n",
"\n",
"print(json.dumps(r, indent=4))"
]
},
{
"cell_type": "code",
"execution_count": 29,
"id": "eb61ab7b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{\n",
" \"tilejson\": \"2.2.0\",\n",
" \"name\": \"6d436413d0eed760acc2f6bd16ca77a5\",\n",
" \"version\": \"1.0.0\",\n",
" \"scheme\": \"xyz\",\n",
" \"tiles\": [\n",
" \"http://127.0.0.1:8082/mosaic/6d436413d0eed760acc2f6bd16ca77a5/tiles/WebMercatorQuad/{z}/{x}/{y}@1x?assets=cog\"\n",
" ],\n",
" \"minzoom\": 13,\n",
" \"maxzoom\": 20,\n",
" \"bounds\": [\n",
" -87.0251,\n",
" 36.0999,\n",
" -85.4249,\n",
" 36.2251\n",
" ],\n",
" \"center\": [\n",
" -86.225,\n",
" 36.162499999999994,\n",
" 13\n",
" ]\n",
"}\n"
]
}
],
"source": [
"r = httpx.get(\n",
" f\"{raster_endpoint}/mosaic/{searchid}/tilejson.json?assets=cog\",\n",
" params={\n",
" \"minzoom\": 13,\n",
" \"maxzoom\": 20,\n",
" }\n",
").json()\n",
"print(json.dumps(r, indent=4))"
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "c49c2e83",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><span style=\"color:#565656\">Make this Notebook Trusted to load map: File -> Trust Notebook</span><iframe srcdoc=\"&lt;!DOCTYPE html&gt;\n",
"&lt;head&gt; \n",
" &lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;\n",
" \n",
" &lt;script&gt;\n",
" L_NO_TOUCH = false;\n",
" L_DISABLE_3D = false;\n",
" &lt;/script&gt;\n",
" \n",
" &lt;style&gt;html, body {width: 100%;height: 100%;margin: 0;padding: 0;}&lt;/style&gt;\n",
" &lt;style&gt;#map {position:absolute;top:0;bottom:0;right:0;left:0;}&lt;/style&gt;\n",
" &lt;script src=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.6.0/dist/leaflet.js&quot;&gt;&lt;/script&gt;\n",
" &lt;script src=&quot;https://code.jquery.com/jquery-1.12.4.min.js&quot;&gt;&lt;/script&gt;\n",
" &lt;script src=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js&quot;&gt;&lt;/script&gt;\n",
" &lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.js&quot;&gt;&lt;/script&gt;\n",
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/npm/leaflet@1.6.0/dist/leaflet.css&quot;/&gt;\n",
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css&quot;/&gt;\n",
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css&quot;/&gt;\n",
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css&quot;/&gt;\n",
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css&quot;/&gt;\n",
" &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdn.jsdelivr.net/gh/python-visualization/folium/folium/templates/leaflet.awesome.rotate.min.css&quot;/&gt;\n",
" \n",
" &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,\n",
" initial-scale=1.0, maximum-scale=1.0, user-scalable=no&quot; /&gt;\n",
" &lt;style&gt;\n",
" #map_1b608c413681ddc3cf6b27bbc4d133b4 {\n",
" position: relative;\n",
" width: 100.0%;\n",
" height: 100.0%;\n",
" left: 0.0%;\n",
" top: 0.0%;\n",
" }\n",
" &lt;/style&gt;\n",
" \n",
"&lt;/head&gt;\n",
"&lt;body&gt; \n",
" \n",
" &lt;div class=&quot;folium-map&quot; id=&quot;map_1b608c413681ddc3cf6b27bbc4d133b4&quot; &gt;&lt;/div&gt;\n",
" \n",
"&lt;/body&gt;\n",
"&lt;script&gt; \n",
" \n",
" var map_1b608c413681ddc3cf6b27bbc4d133b4 = L.map(\n",
" &quot;map_1b608c413681ddc3cf6b27bbc4d133b4&quot;,\n",
" {\n",
" center: [36.162499999999994, -86.225],\n",
" crs: L.CRS.EPSG3857,\n",
" zoom: 13,\n",
" zoomControl: true,\n",
" preferCanvas: false,\n",
" }\n",
" );\n",
"\n",
" \n",
"\n",
" \n",
" \n",
" var tile_layer_716c60a5f8ddac8b595eb29b5783e6ba = L.tileLayer(\n",
" &quot;https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png&quot;,\n",
" {&quot;attribution&quot;: &quot;Data by \\u0026copy; \\u003ca href=\\&quot;http://openstreetmap.org\\&quot;\\u003eOpenStreetMap\\u003c/a\\u003e, under \\u003ca href=\\&quot;http://www.openstreetmap.org/copyright\\&quot;\\u003eODbL\\u003c/a\\u003e.&quot;, &quot;detectRetina&quot;: false, &quot;maxNativeZoom&quot;: 18, &quot;maxZoom&quot;: 18, &quot;minZoom&quot;: 0, &quot;noWrap&quot;: false, &quot;opacity&quot;: 1, &quot;subdomains&quot;: &quot;abc&quot;, &quot;tms&quot;: false}\n",
" ).addTo(map_1b608c413681ddc3cf6b27bbc4d133b4);\n",
" \n",
" \n",
" function geo_json_aff5d91052367ef1efff12bc7baaf0b4_styler(feature) {\n",
" switch(feature.id) {\n",
" default:\n",
" return {&quot;dashArray&quot;: &quot;1&quot;, &quot;fillOpacity&quot;: 0, &quot;opacity&quot;: 1, &quot;weight&quot;: 1};\n",
" }\n",
" }\n",
"\n",
" function geo_json_aff5d91052367ef1efff12bc7baaf0b4_onEachFeature(feature, layer) {\n",
" layer.on({\n",
" });\n",
" };\n",
" var geo_json_aff5d91052367ef1efff12bc7baaf0b4 = L.geoJson(null, {\n",
" onEachFeature: geo_json_aff5d91052367ef1efff12bc7baaf0b4_onEachFeature,\n",
" \n",
" style: geo_json_aff5d91052367ef1efff12bc7baaf0b4_styler,\n",
" });\n",
"\n",
" function geo_json_aff5d91052367ef1efff12bc7baaf0b4_add (data) {\n",
" geo_json_aff5d91052367ef1efff12bc7baaf0b4\n",
" .addData(data)\n",
" .addTo(map_1b608c413681ddc3cf6b27bbc4d133b4);\n",
" }\n",
" geo_json_aff5d91052367ef1efff12bc7baaf0b4_add({&quot;features&quot;: [{&quot;geometry&quot;: {&quot;coordinates&quot;: [[[-87.0251, 36.0999], [-85.4249, 36.0999], [-85.4249, 36.2251], [-87.0251, 36.2251], [-87.0251, 36.0999]]], &quot;type&quot;: &quot;Polygon&quot;}, &quot;id&quot;: &quot;0&quot;, &quot;type&quot;: &quot;Feature&quot;}], &quot;type&quot;: &quot;FeatureCollection&quot;});\n",
"\n",
" \n",
" \n",
" var tile_layer_274ddc35a0b13ba07786a80846009426 = L.tileLayer(\n",
" &quot;http://127.0.0.1:8082/mosaic/6d436413d0eed760acc2f6bd16ca77a5/tiles/WebMercatorQuad/{z}/{x}/{y}@1x?assets=cog&quot;,\n",
" {&quot;attribution&quot;: &quot;esri-noaa&quot;, &quot;detectRetina&quot;: false, &quot;maxNativeZoom&quot;: 18, &quot;maxZoom&quot;: 18, &quot;minZoom&quot;: 0, &quot;noWrap&quot;: false, &quot;opacity&quot;: 1, &quot;subdomains&quot;: &quot;abc&quot;, &quot;tms&quot;: false}\n",
" ).addTo(map_1b608c413681ddc3cf6b27bbc4d133b4);\n",
" \n",
"&lt;/script&gt;\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>"
],
"text/plain": [
"<folium.folium.Map at 0x11f38c5e0>"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"bounds = r[\"bounds\"]\n",
"\n",
"m = Map(\n",
" location=(r[\"center\"][1], r[\"center\"][0]),\n",
" zoom_start=r[\"minzoom\"]\n",
")\n",
"\n",
"poly = Polygon.from_bounds(*bounds)\n",
"geojson = Feature(geometry=poly).dict(exclude_none=True)\n",
"\n",
"m = Map(\n",
" tiles=\"OpenStreetMap\",\n",
" location=((bounds[1] + bounds[3]) / 2,(bounds[0] + bounds[2]) / 2),\n",
" zoom_start=13\n",
")\n",
"\n",
"geo_json = GeoJson(\n",
" data=geojson,\n",
" style_function=lambda x: {\n",
" 'opacity': 1, 'dashArray': '1', 'fillOpacity': 0, 'weight': 1\n",
" },\n",
")\n",
"geo_json.add_to(m)\n",
"m\n",
"\n",
"aod_layer = TileLayer(\n",
" tiles=r[\"tiles\"][0],\n",
" opacity=1,\n",
" attr=\"esri-noaa\"\n",
")\n",
"aod_layer.add_to(m)\n",
"m"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "439505f7",
"metadata": {},
"outputs": [],
"source": []
}
],
"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.9.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment