Skip to content

Instantly share code, notes, and snippets.

@giswqs
Last active July 14, 2020 21:53
Show Gist options
  • Save giswqs/1480145eea8f585af74797ec514587bc to your computer and use it in GitHub Desktop.
Save giswqs/1480145eea8f585af74797ec514587bc to your computer and use it in GitHub Desktop.
terrain_visualization.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": "<table class=\"ee-notebook-buttons\" align=\"left\">\n <td><a target=\"_blank\" href=\"https://github.com/giswqs/earthengine-py-notebooks/tree/master/Visualization/terrain_visualization.ipynb\"><img width=32px src=\"https://www.tensorflow.org/images/GitHub-Mark-32px.png\" /> View source on GitHub</a></td>\n <td><a target=\"_blank\" href=\"https://nbviewer.jupyter.org/github/giswqs/earthengine-py-notebooks/blob/master/Visualization/terrain_visualization.ipynb\"><img width=26px src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Jupyter_logo.svg/883px-Jupyter_logo.svg.png\" />Notebook Viewer</a></td>\n <td><a target=\"_blank\" href=\"https://colab.research.google.com/github/giswqs/earthengine-py-notebooks/blob/master/Visualization/terrain_visualization.ipynb\"><img src=\"https://www.tensorflow.org/images/colab_logo_32px.png\" /> Run in Google Colab</a></td>\n</table>"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Install Earth Engine API and geemap\nInstall the [Earth Engine Python API](https://developers.google.com/earth-engine/python_install) and [geemap](https://github.com/giswqs/geemap). The **geemap** Python package is built upon the [ipyleaflet](https://github.com/jupyter-widgets/ipyleaflet) and [folium](https://github.com/python-visualization/folium) packages and implements several methods for interacting with Earth Engine data layers, such as `Map.addLayer()`, `Map.setCenter()`, and `Map.centerObject()`.\nThe following script checks if the geemap package has been installed. If not, it will install geemap, which automatically installs its [dependencies](https://github.com/giswqs/geemap#dependencies), including earthengine-api, folium, and ipyleaflet.\n\n**Important note**: A key difference between folium and ipyleaflet is that ipyleaflet is built upon ipywidgets and allows bidirectional communication between the front-end and the backend enabling the use of the map to capture user input, while folium is meant for displaying static data only ([source](https://blog.jupyter.org/interactive-gis-in-jupyter-with-ipyleaflet-52f9657fa7a)). Note that [Google Colab](https://colab.research.google.com/) currently does not support ipyleaflet ([source](https://github.com/googlecolab/colabtools/issues/60#issuecomment-596225619)). Therefore, if you are using geemap with Google Colab, you should use [`import geemap.eefolium`](https://github.com/giswqs/geemap/blob/master/geemap/eefolium.py). If you are using geemap with [binder](https://mybinder.org/) or a local Jupyter notebook server, you can use [`import geemap`](https://github.com/giswqs/geemap/blob/master/geemap/geemap.py), which provides more functionalities for capturing user input (e.g., mouse-clicking and moving)."
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# Installs geemap package\nimport subprocess\n\ntry:\n import geemap\nexcept ImportError:\n print('geemap package not installed. Installing ...')\n subprocess.check_call([\"python\", '-m', 'pip', 'install', 'geemap'])\n\n# Checks whether this notebook is running on Google Colab\ntry:\n import google.colab\n import geemap.eefolium as geemap\nexcept:\n import geemap\n\n# Authenticates and initializes Earth Engine\nimport ee\n\ntry:\n ee.Initialize()\nexcept Exception as e:\n ee.Authenticate()\n ee.Initialize() ",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Create an interactive map \nThe default basemap is `Google Maps`. [Additional basemaps](https://github.com/giswqs/geemap/blob/master/geemap/basemaps.py) can be added using the `Map.add_basemap()` function. "
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "Map = geemap.Map(center=[40,-100], zoom=4)\nMap",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Add Earth Engine Python script "
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# Add Earth Engine dataset\n# Use an elevation dataset and terrain functions to create\n# a custom visualization of topography.\n\n# Load a global elevation image.\nelev = ee.Image('USGS/GMTED2010')\n\n# Zoom to an area of interest.\nMap.setCenter(-121.069, 50.709, 6)\n\n# Add the elevation to the map.\nMap.addLayer(elev, {}, 'elev')\n\n# Use the terrain algorithms to compute a hillshade with 8-bit values.\nshade = ee.Terrain.hillshade(elev)\nMap.addLayer(shade, {}, 'hillshade', False)\n\n# Create a \"sea\" variable to be used for cartographic purposes\nsea = elev.lte(5)\nMap.addLayer(sea.mask(sea), {'palette':'000022'}, 'sea', False)\n\n# Create a custom elevation palette from hex strings.\nelevationPalette = ['006600', '002200', 'fff700', 'ab7634', 'c4d0ff', 'ffffff']\n# Use these visualization parameters, customized by location.\nvisParams = {'min': 1, 'max': 3000, 'palette': elevationPalette}\n\n# Create a mosaic of the sea and the elevation data\nvisualized = ee.ImageCollection([\n # Mask the elevation to get only land\n elev.mask(sea.Not()).visualize(**visParams),\n # Use the sea mask directly to display sea.\n sea.mask(sea).visualize(**{'palette':'000022'})\n]).mosaic()\n\n# Note that the visualization image doesn't require visualization parameters.\nMap.addLayer(visualized, {}, 'elev palette', False)\n\n# Convert the visualized elevation to HSV, first converting to [0, 1] data.\nhsv = visualized.divide(255).rgbToHsv()\n# Select only the hue and saturation bands.\nhs = hsv.select(0, 1)\n# Convert the hillshade to [0, 1] data, as expected by the HSV algorithm.\nv = shade.divide(255)\n# Create a visualization image by converting back to RGB from HSV.\n# Note the cast to byte in order to export the image correctly.\nrgb = hs.addBands(v).hsvToRgb().multiply(255).byte()\nMap.addLayer(rgb, {}, 'styled')\n\n",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Display Earth Engine data layers "
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "gsw = ee.Image('JRC/GSW1_1/GlobalSurfaceWater')",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "occurrence = gsw.select('occurrence')",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "vis_occurrence = {\n 'min':0,\n 'max':100,\n 'palette': ['red', 'blue']\n}",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "Map.addLayer(occurrence, vis_occurrence, 'Occurrence')",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "Map.addLayerControl() # This line is not needed for ipyleaflet-based Map.\nMap",
"execution_count": null,
"outputs": []
}
],
"metadata": {
"anaconda-cloud": {},
"hide_input": false,
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"language_info": {
"name": "python",
"version": "3.8.2",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"toc": {
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": true,
"base_numbering": 1,
"title_cell": "Table of Contents",
"title_sidebar": "Table of Contents",
"toc_cell": false,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"window_display": false,
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"library": "var_list.py",
"delete_cmd_prefix": "del ",
"delete_cmd_postfix": "",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"library": "var_list.r",
"delete_cmd_prefix": "rm(",
"delete_cmd_postfix": ") ",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
]
},
"gist": {
"id": "1480145eea8f585af74797ec514587bc",
"data": {
"description": "terrain_visualization.ipynb",
"public": true
}
},
"_draft": {
"nbviewer_url": "https://gist.github.com/1480145eea8f585af74797ec514587bc"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment