{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", " \n", " \n", " \n", "
View source on GitHubNotebook Viewer Run in Google Colab
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Install Earth Engine API and geemap\n", "Install 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()`.\n", "The 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)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Installs geemap package\n", "import subprocess\n", "\n", "try:\n", " import geemap\n", "except 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\n", "try:\n", " import google.colab\n", " import geemap.eefolium as emap\n", "except:\n", " import geemap as emap\n", "\n", "# Authenticates and initializes Earth Engine\n", "import ee\n", "\n", "try:\n", " ee.Initialize()\n", "except Exception as e:\n", " ee.Authenticate()\n", " ee.Initialize() " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "d27b9ed18bd64922ba5c208e64654329", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Map(center=[47.01, -99.0], controls=(ZoomControl(options=['position', 'zoom_in_text', 'zoom_in_title', 'zoom_o…" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import geemap\n", "from ipyleaflet import *\n", "from ipywidgets import *\n", "from geemap.utils import *\n", "\n", "Map = geemap.Map(center=(-100, 40), zoom=4)\n", "Map.default_style = {'cursor': 'pointer'}\n", "Map\n", "\n", "Map.setOptions('ROADMAP')\n", "# Load National Hydrography Dataset (NHD) \n", "HUC10 = ee.FeatureCollection('USGS/WBD/2017/HUC10'); # 18,487 HUC10 watersheds in the U.S.\n", "\n", "# Add HUC layer to the map\n", "Map.setCenter(-99.00, 47.01, 8);\n", "Map.addLayer(ee.Image().paint(HUC10, 0, 1), {}, 'HUC-10 Watershed') # HUC10 for the entire U.S.\n", "\n", "label = Label(\"Click on the map to select a watershed\")\n", "widget_control = WidgetControl(widget=label, position='bottomright')\n", "Map.add_control(widget_control)\n", "\n", "layer = None\n", "\n", "def handle_interaction(**kwargs):\n", " latlon = kwargs.get('coordinates')\n", " if kwargs.get('type') == 'click':\n", " Map.default_style = {'cursor': 'wait'}\n", " xy = ee.Geometry.Point(latlon[::-1])\n", " watershed = HUC10.filterBounds(xy)\n", " huc10_id = watershed.first().get('huc10').getInfo()\n", " Map.layers = Map.layers[:3]\n", " Map.addLayer(ee.Image().paint(watershed, 0, 2), {'palette': 'red'}, 'HUC ID: ' + huc10_id) \n", " \n", " NAIP_images = find_NAIP(watershed)\n", " first_image = ee.Image(NAIP_images.toList(5).get(0))\n", " Map.addLayer(first_image, {'bands': ['N', 'R', 'G']}, 'first image')\n", " count = NAIP_images.size().getInfo()\n", " for i in range(0, count):\n", " image = ee.Image(NAIP_images.toList(count).get(i))\n", " Map.addLayer(image, {'bands': ['N', 'R', 'G']}, str(i))\n", " \n", " Map.default_style = {'cursor': 'pointer'}\n", "\n", "Map.on_interaction(handle_interaction)\n", "\n", "Map" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "Map.layers" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.8.2" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": true, "title_cell": "Table of Contents", "title_sidebar": "Table of Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 4 }