We welcome you to the 3ie tutorial on applications of remote sensing for impact evaluation. Our hope is that equipped with the theoretical considerations and the practical hands-on code, you will be in a better position to decide which application of remote sensing is suitable for your work and what can be done to calculate the same. Moreover, we believe that laden with this geospatial literacy of earth observation, you can generate evidence faster in a cost-effective manner and over a large area. With extensive on-ground surveys limited by the COVID-19 pandemic and socio-political scenarios, remote sensing can help you to scale your work effectively.
This tutorial uses Python and Jupyter Notebooks. Python is a general purpose programming language that is used extensively in the field of machine learning and data analytics. Jupyter Notebooks are executable notebooks which allow us to document and run our code simultaneoulsy using Markdown. To reduce the access barrier, we are sharing this tutorial as a Google Colab Notebook, so that users can run the code and access the tutorial without downloading any software if they desire to do so.
We provide a general guidance on usage of these software. However, we believe that prior experience of basic programming will be helpful.
The tutorial is divided into four modules. We recommend Module 1 for the audience who are not familiar with the concepts of earth observation using remote sensing. It may include commissioners of evaluation, as well as leadership staff who want to be informed consumers of earth observation services. The module introduces the core concepts, opportunities, and challenges associate with remote sensing. The Modules 2, 3, and 4 are geared more towards an audience who have fundamental familiarity with Python and want to use it for doing earth observation. The only prerequisite for Module 2, 3, and 4 is familiarity with basics of coding, in particular Python, although we believe that those who have worked on languages such as R or Javascript may also find it easy to follow the tutorial.
Hands-on exercises are provided throughout the tutorial to provide readers with ample opportunities for practicing what they are learning. Additional Resources are provided at the end of the tutorial for those who would like to delve deeper into the field of remote sensing and its use for causal inference.
Please note that this tutorial is geared towards an audience which is primarily interested in measuring agriculture and water outcomes using Remote Sensing. Further applications of remote sensing such as population density estimation, urban sprawl measurement, object detection, land cover estimation, district/block level economic activity estimation, measurement of pollution indicators, species and biodiversity classification, city-wide solar power generation estimation, waterlogging estimation post flooding etc are some of the current applications of remote sensing which are not part of the scope of current tutorial, but could be developed if useful.
After completing this tutorial successfully, a learner will be able to do the following:
For instance, one may be interested in measuring the impact of an intervention on developing sustainable agriculture or checking deforestation. In this case counting the number of trees may not always yield into measurable and accurate outcomes, however measuring the greenery as shown by a vegetation around the intervention unit may give us valuable information. Such an information can be easily quanitified alongside other covariates of interest into an econometric model to investigate the causal effects of that intervention.
The term remote sensing is made up of two words: remote and sensing. Remote means being far away from the unit of observation (field, building, person) and sensing means using digital sensors to measure the data across time and space. Thus, remote sensing is the science of collecting measurements on units without coming in touch with them. Satellite Imagery is one form of remotely sensed data. For this tutorial, we will focus on satellite imagery only.
Source: NASA’s Goddard Space Flight Center. Remotely Sensing Our Planet. 2017. URL: https://svs.gsfc.nasa.gov/30892
The sensors on satellites can be classified into two main categories: Passive and Active
Passive Sensors: Passive Sensors record the energy that is naturally reflected from the surface of earth. For example, reflection of sunlight in a desert region will be different from the reflection of sunlight from a water body. Passive Sensors capture this differentiated energy reflection.
Active Sensors: Active Sensors provide their own energy source for differentiated energy reflection. For example, RADARs send out electromagnetic waves via the instrument on board a system and then captures the reflection.
The Electromagnetic (EM) Spectrum is the range of all types of EM radiations that exist around us. As humans, our eyes are only sensitive to the visible portion of EM spectrum, which we call as Visible Spectrum. However, there are other waves in the EM Spectrum that are of special use to remote sensing especially Infrared Waves (IR Waves) and Visible Light.
Although most of the satellites use EM for their operations, some satellites have started using RADAR for earth observation. The major advantages of RADAR based systems are their ability to generate an image when there are clouds, so this is particularly helpful for regions with distinct wet and dry season or areas which receive rainfall for whole year, like tropical rainforests. For this tutorial, we will focus on EM-based imagery only.
SOURCE: Imperial Encyclopedia Traveller, Marc Miller, July 2019
The fundamental technology that is behind the remote sensing is differentiated reflection of EM waves by different objects. The sun's energy which is composed of full EM Spectrum is reflected differently by different objects on the planet. For example, healthy plants that are lush green will reflect the sun's energy in a different way as compared to the plants that are dull and are under stress. The sensors which are on board these satellites capture these differentiated amounts of reflections and use it to construct the satellite imagery as we see. These data help us to identify the changes happening on the planet remotely.
SOURCE: Linking Student Performance in Massachusetts Elementary Schools with the "Greenness'' of School Surroundings Using Remote Sensing, PubMed, DOI
Evidence-based decision-making is becoming more and more common in policy, but the cost of generating evidence continues to increase. Add to this fact that some of the regions of the world, where development interventions are most needed may not always be accessible due to natural and social causes. Keeping these issues in mind, remote sensing promises to be an alternative that can be readily used in a cost-effective manner to assist in measuring the impact of development interventions in LMICs. Doing remote sensing is not a replacement for traditional surveys. It is actually a complement to make traditional data collection better and especially useful when any other means of surveying is not possible.
There are multiple benefits and applications of using remote sensing data for impact evaluation purposes.
In contrast to ground-based data, remote sensing data allows us to capture larger areas at a relatively lower cost. For example, remote sensing was used to do earthquake damage assessment in Italy as highlighted here.
Remote Sensing allows us to ask more relevant questions where we see a geographic element plays an important role. For example, it may allow us to measure spillover effect, as shown in this study which measured spatial spillover effects of a reclaimed mining subsided lake in China.
The sampling bias is lower as data can be collected for harder to reach areas impacted by geographic or political constraints. Thus, we can have a more credible identification strategy. For example, this study does drought evaluation in the North East Region of Thailand.
Remote sensing data can be used to calculate various indices such as vegetation indices or water indices, or pollutants indices to capture the effects of a treatment in an area remotely. For example, it has been used for detection and monitoring of marine pollution.
Deep Learning (making computers learn on the basis of huge amounts of data) based Computer Vision (making computers see and interpret images like humans do) methods allow us to do efficient program targeting to know where to put in our resources and who are the people who would benefit most from the interventions. For example, deep learning and remote sensing were used to locate the poor in Nigeria.
Note that Deep Learning may not always be need for doing an analysis that requires satellite imagery. For example making a land-usage map using satellite imagery may not always require one to perform deep learning computations. For motivated learners who are interested in knowing what is possible, we recommend going to this resource
It is also worth mentioning that the advanced technologies such as getting high resolution commerical imagery and performing deep learning based computer vision algorithms may have cost and human resources implications which may not always be readily available with organizations based in LMICs.
#### Ground Truthing We may always be not sure if what remote sensing shows us is actually true, because it is "remotely sensed". For example, if benefits from a development programme are directed to the households with a straw roof, then we need to ensure that houses below the straw roof are actually mud houses, and have not been masked by straw roofing for getting the benefits. However, if we need to measure impact remotely and there is no chance we can go ground truthing, it will be better to apply remote sensing to measure at least what's possible.
### Cost Implications for High Resolution Data Because many of the freely available satellite data do not have the granularity that can be used to make the inferences on, let's say smaller plots in LMICs or object detection, remote sensing can have cost and administrative implications. It is worth noting that geospatial analysis is a broad endeavour encompasses many different things. The mapping part and conversion of imagery to numbers within particular user-defined boundaries may be feasible within a few weeks, but extra time may be required for other, more involved work - e.g., spatial statistics.
#### Crop Type and Plot Boundaries (Lack of Vector Datasets) For doing a plot/small area level analysis, one may need to have a clear idea of what the plot boundaries are then turn them into vector formats. Deep Learning methods allow us to do so with reasonable accuracy, and it is expected that it will be better in the long run.
Note that at this point, it would be important to differentiate between raster and vector datasets. The satellite images you get from Google Earth Engine (GEE) are multi-spectral raster datasets. The more you zoom in, the more pixelated an image becomes. You may wish to restrict your retrieval of those images only for your area of interest. This is where vector dataset comes into picture. Geographical vector data can come in various file formats, but the most commonly used is Shapefiles format developed by ESRI. It is easy to find administrative shapefiles from respective government body or private places, but sometimes the administrative shapefile may not match intervention area. For example, if your area of interest is a village, but the shapefiles you have are only at the district level, you may need to create your own shapefile. This may result into additional costs (person time and software). This will help you to aggregate your data. For example, what is the average Normalized Difference Vegetation Index (NDVI) for the year 2020 in the village X of Benin? To answer those questions, you require shapefiles for your intervention areas.
#### Cloud Cover It may so happen that you may not get a satellite image at all because of dense cloud cover in particular months. For example, it is almost impossible to retrieve satellite images during the months of July, August, and September during the Monsoon Season in India. The phenomenon is true for other parts of the world too, where there is a distinct wet season (Kenya, for example). However, this disadvantage is solved by RADAR-based satellites which use RADAR waves for imagery that penetrate clouds.
#### Temporal Compatibility Satellite sensors age over time and are replaced periodically. Thus, the same digital number does not necessarily mean the same level of light intensity across years and satellites. This is an issue especially with the nighttime light data.
#### Lack of geographic dependence When our research question is not expected to be affected by a geographical variation, remote sensing is not a wise thing to do. For example, measuring the effect of training on staff's performance in different offices located in a country may not be affected by where the offices are located.
#### Doing Remote Sensing ONLY We are proponents of using ground truthing always before taking the decisions on the basis of purely remote analysis. Doing so can be a socially, politically, and economically costly affair that can have far and wide repercussions.
#### Measuring variables that cannot be measured from above With all the merits of Remote Sensing, it may not help us with measuring let's say height of a building or how many houses are located in an apartment building very accurately (although, LiDAR remote sensing may help with that). Moreover, variables such as gender, social capital, political participation etc cannot be measured by remote sensing.
Remote Sensing offers a lot of possibility for measurement of developmental outcomes at a relatively lower cost and at a faster speed. However, ethical considerations are needed to be kept in mind so that no damage is done to the privacy and security of the people while doing remote sensing. This section has been adapted from Ethical Considerations When Using Geospatial Technologies For Evidence Generation and we recommend they should be considered before the application of remote sensing for geospatial analytics.
Remotely sensed data can be used to augment the traditional methods of impact evaluation to generate evidence faster, at a relatively lower cost, and for a larger area. The publicly available data along with tools such as Google Earth Engine have lowered the barriers to access of using remote sensing data for impact evaluation. The subsequent chapters will allow you to download and use spatial data for your work using Google Earth Engine and Python.
Satellite images can have different resolutions depending upon which satellite the images are coming from. Keeping in mind the uses of satellite imagery for a particular use-cases, we may need to have some or other image depending upon the resolution and purpose of the work. Written below are the three types of resolutions we can classify the satellite images into.
Spatial Resolution refers to the size of one pixel on ground. In simple words, objects placed at a distance higher than the spatial resolution of a satellite can be discerned by the satellite. The spatial resolution for SENTINEL is 10 meters. This means that the satellite's sensor would not be able to differentiate between objects less than 10 m apart. For some of the commercial remote sensing products from MAXAR, the spatial resolution is 15 cm.
SOURCE: Maxar Blog
It is important to keep in mind that the higher resolution images may be required to perform some of the analyses that require granularity, for example cattle monitoring via remote sensing requires a very high resolution image. In those cases, it is worthwhile investing in buying higher resolution satellite imagery from commerical providers.
You can also check out this blog that shows how different resolution images look.
SOURCE: Medium Blog
Temporal Resolution or revisit time is the time it takes for a satellite to image the same area again. The temporal resolution for SENTINEL 2 is 5 days on equator and for LANDSAT 8, it's 16 days on equator. The revisit time is lower on higher latitudes, which means that an area is frequented more often by a satellite for areas closer to poles.
Spectral resolution refers to the number of bands (range of frequencies in an electromagnetic spectrum used for satellite imagery) that there are in a satellite imagery. Because satellite images contain multiple wavelengths images, we are able to compute relevant indices for specific purposes. We will cover more about multispectral images when we learn computing indices using Google Earth Engine. The spectral resolution of LANDSAT 8 is 9 bands, while that of SENTINEL 2 is 13 bands.
Source: Timothy A Warner, M Duane Nellis, and Giles M Foody. Remote sensing scale and data selection issues. The SAGE handbook of remote sensing, 2:568, 2009
There is an inherent tradeoff between spatial, spectral and temporal resolutions. Typically, the higher the spatial resolution, the lower the spectral and the temporal resolution and the higher the temporal resolution, the lower the spatial and spectral resolutions.
There are two fundamental technologies we will be using for extracting, processing, analyzing, and exporting satellite spatial data (aka satellite images).
The reader is assumed to have a basic familiarity with Python. In case the reader wants to have a refresher training before starting, one can refer to this link for a quick reference.
We will be using Jupyter Notebooks for working with satellite data and analysis. To install Jupyter Notebook, one needs to install Anaconda Distribution. For more information please refer to this link. Alternatively, one may use Google Colab to run the same on cloud and share it with others on the team
Jupyter Notebooks run by connecting to virtual machines (VM) that have maximum lifetimes that can be as much as 12 hours. Notebooks will also disconnect from VMs when left idle for too long. Maximum VM lifetime and idle timeout behavior may vary over time, or based on your usage. This is necessary for Colab to be able to offer computational resources for free.
Google Earth Engine is a cloud based platform for planetary-scale geospatial analysis which allows to process a variety of geographical data at scale and handle large geographical datasets.
The main benefit of using Google Earth Engine is the savings in computational resources needed to do large scale analysis. In addition to this, it is free to use for non-commerical use, i.e. free for educational and research purposes.
GEE contains petabytes of ready-to-use satellite data. The platform can be accessed via two methods.
We will use the second method for our work.
It is important to register on Google Earth Engine before using the platform. To register at Google Earth Engine, users are requested to refer to this link.
Users can also explore features of Google Earth Engine, including browsing case studies and data catalog available.
Before proceeding, users are requested to install the following packages
pip install earthengine-apipip install geemapAs a first step, we will teach how to download and visualize map from Google Earth Engine. Before using GEE, you need to authenticate your account. In order to do so, follow these steps.
In this part of the module, we will learn how to import the necessary packages, authenticate, initialize, and render your first map using Google Earth Engine. We will visualize Addis Ababa, Ethiopia. Before you begin this step, please ensure you have registered for Google Earth Engine. That will allow you to authenticate your session and use GEE. Run the code below when you are running this notebook for each session.
#@title
#press SHIFT + ENTER to execute the command
# you need to run it only once per session
#this installs earth-engine api and geemap
!pip install earthengine-api
!pip install geemap
Requirement already satisfied: earthengine-api in /usr/local/lib/python3.7/dist-packages (0.1.300)
Requirement already satisfied: httplib2shim in /usr/local/lib/python3.7/dist-packages (from earthengine-api) (0.0.3)
Requirement already satisfied: httplib2<1dev,>=0.9.2 in /usr/local/lib/python3.7/dist-packages (from earthengine-api) (0.17.4)
Requirement already satisfied: google-api-python-client<2,>=1.12.1 in /usr/local/lib/python3.7/dist-packages (from earthengine-api) (1.12.10)
Requirement already satisfied: google-cloud-storage in /usr/local/lib/python3.7/dist-packages (from earthengine-api) (1.18.1)
Requirement already satisfied: future in /usr/local/lib/python3.7/dist-packages (from earthengine-api) (0.16.0)
Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from earthengine-api) (1.15.0)
Requirement already satisfied: google-auth-httplib2>=0.0.3 in /usr/local/lib/python3.7/dist-packages (from earthengine-api) (0.0.4)
Requirement already satisfied: google-auth>=1.4.1 in /usr/local/lib/python3.7/dist-packages (from earthengine-api) (1.35.0)
Requirement already satisfied: google-api-core<3dev,>=1.21.0 in /usr/local/lib/python3.7/dist-packages (from google-api-python-client<2,>=1.12.1->earthengine-api) (1.26.3)
Requirement already satisfied: uritemplate<4dev,>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from google-api-python-client<2,>=1.12.1->earthengine-api) (3.0.1)
Requirement already satisfied: requests<3.0.0dev,>=2.18.0 in /usr/local/lib/python3.7/dist-packages (from google-api-core<3dev,>=1.21.0->google-api-python-client<2,>=1.12.1->earthengine-api) (2.23.0)
Requirement already satisfied: googleapis-common-protos<2.0dev,>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from google-api-core<3dev,>=1.21.0->google-api-python-client<2,>=1.12.1->earthengine-api) (1.55.0)
Requirement already satisfied: packaging>=14.3 in /usr/local/lib/python3.7/dist-packages (from google-api-core<3dev,>=1.21.0->google-api-python-client<2,>=1.12.1->earthengine-api) (21.3)
Requirement already satisfied: setuptools>=40.3.0 in /usr/local/lib/python3.7/dist-packages (from google-api-core<3dev,>=1.21.0->google-api-python-client<2,>=1.12.1->earthengine-api) (57.4.0)
Requirement already satisfied: pytz in /usr/local/lib/python3.7/dist-packages (from google-api-core<3dev,>=1.21.0->google-api-python-client<2,>=1.12.1->earthengine-api) (2018.9)
Requirement already satisfied: protobuf>=3.12.0 in /usr/local/lib/python3.7/dist-packages (from google-api-core<3dev,>=1.21.0->google-api-python-client<2,>=1.12.1->earthengine-api) (3.17.3)
Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth>=1.4.1->earthengine-api) (4.2.4)
Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth>=1.4.1->earthengine-api) (0.2.8)
Requirement already satisfied: rsa<5,>=3.1.4 in /usr/local/lib/python3.7/dist-packages (from google-auth>=1.4.1->earthengine-api) (4.8)
Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from packaging>=14.3->google-api-core<3dev,>=1.21.0->google-api-python-client<2,>=1.12.1->earthengine-api) (3.0.7)
Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.7/dist-packages (from pyasn1-modules>=0.2.1->google-auth>=1.4.1->earthengine-api) (0.4.8)
Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests<3.0.0dev,>=2.18.0->google-api-core<3dev,>=1.21.0->google-api-python-client<2,>=1.12.1->earthengine-api) (2.10)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests<3.0.0dev,>=2.18.0->google-api-core<3dev,>=1.21.0->google-api-python-client<2,>=1.12.1->earthengine-api) (1.24.3)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests<3.0.0dev,>=2.18.0->google-api-core<3dev,>=1.21.0->google-api-python-client<2,>=1.12.1->earthengine-api) (2021.10.8)
Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests<3.0.0dev,>=2.18.0->google-api-core<3dev,>=1.21.0->google-api-python-client<2,>=1.12.1->earthengine-api) (3.0.4)
Requirement already satisfied: google-cloud-core<2.0dev,>=1.0.0 in /usr/local/lib/python3.7/dist-packages (from google-cloud-storage->earthengine-api) (1.0.3)
Requirement already satisfied: google-resumable-media<0.5.0dev,>=0.3.1 in /usr/local/lib/python3.7/dist-packages (from google-cloud-storage->earthengine-api) (0.4.1)
Collecting geemap
Downloading geemap-0.11.5-py2.py3-none-any.whl (1.9 MB)
|████████████████████████████████| 1.9 MB 5.2 MB/s
Requirement already satisfied: plotly in /usr/local/lib/python3.7/dist-packages (from geemap) (5.5.0)
Collecting pycrs
Downloading PyCRS-1.0.2.tar.gz (36 kB)
Requirement already satisfied: palettable in /usr/local/lib/python3.7/dist-packages (from geemap) (3.3.0)
Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from geemap) (1.21.5)
Collecting mss
Downloading mss-6.1.0-py3-none-any.whl (76 kB)
|████████████████████████████████| 76 kB 5.7 MB/s
Collecting owslib
Downloading OWSLib-0.25.0-py2.py3-none-any.whl (216 kB)
|████████████████████████████████| 216 kB 48.4 MB/s
Collecting sankee
Downloading sankee-0.0.7.tar.gz (29 kB)
Collecting ipyevents
Downloading ipyevents-2.0.1-py2.py3-none-any.whl (130 kB)
|████████████████████████████████| 130 kB 46.6 MB/s
Collecting bqplot
Downloading bqplot-0.12.33-py2.py3-none-any.whl (1.2 MB)
|████████████████████████████████| 1.2 MB 39.9 MB/s
Collecting colour
Downloading colour-0.1.5-py2.py3-none-any.whl (23 kB)
Requirement already satisfied: matplotlib in /usr/local/lib/python3.7/dist-packages (from geemap) (3.2.2)
Requirement already satisfied: click in /usr/local/lib/python3.7/dist-packages (from geemap) (7.1.2)
Collecting ipyleaflet>=0.14.0
Downloading ipyleaflet-0.15.0-py2.py3-none-any.whl (3.3 MB)
|████████████████████████████████| 3.3 MB 41.0 MB/s
Collecting ipytree
Downloading ipytree-0.2.1-py2.py3-none-any.whl (1.3 MB)
|████████████████████████████████| 1.3 MB 26.8 MB/s
Requirement already satisfied: earthengine-api>=0.1.230 in /usr/local/lib/python3.7/dist-packages (from geemap) (0.1.300)
Requirement already satisfied: googledrivedownloader in /usr/local/lib/python3.7/dist-packages (from geemap) (0.4)
Collecting here-map-widget-for-jupyter>=1.1.1
Downloading here_map_widget_for_jupyter-1.1.3-py2.py3-none-any.whl (5.4 MB)
|████████████████████████████████| 5.4 MB 50.4 MB/s
Collecting folium>=0.11.0
Downloading folium-0.12.1.post1-py2.py3-none-any.whl (95 kB)
|████████████████████████████████| 95 kB 3.8 MB/s
Collecting geojson
Downloading geojson-2.5.0-py2.py3-none-any.whl (14 kB)
Collecting ee-extra>=0.0.10
Downloading ee_extra-0.0.10.tar.gz (176 kB)
|████████████████████████████████| 176 kB 69.9 MB/s
Collecting pyshp>=2.1.3
Downloading pyshp-2.2.0-py3-none-any.whl (44 kB)
|████████████████████████████████| 44 kB 2.6 MB/s
Collecting geeadd>=0.5.1
Downloading geeadd-0.5.5-py3-none-any.whl (30 kB)
Collecting whiteboxgui>=0.6.0
Downloading whiteboxgui-0.7.0-py2.py3-none-any.whl (99 kB)
|████████████████████████████████| 99 kB 9.4 MB/s
Requirement already satisfied: pillow in /usr/local/lib/python3.7/dist-packages (from geemap) (7.1.2)
Collecting voila
Downloading voila-0.3.2-py3-none-any.whl (1.7 MB)
|████████████████████████████████| 1.7 MB 58.2 MB/s
Collecting jupyterlab>=3
Downloading jupyterlab-3.2.9-py3-none-any.whl (8.5 MB)
|████████████████████████████████| 8.5 MB 45.1 MB/s
Collecting ipynb-py-convert
Downloading ipynb-py-convert-0.4.6.tar.gz (3.9 kB)
Collecting xyzservices
Downloading xyzservices-2022.2.0-py3-none-any.whl (35 kB)
Collecting ipyfilechooser>=0.6.0
Downloading ipyfilechooser-0.6.0-py3-none-any.whl (11 kB)
Requirement already satisfied: pandas in /usr/local/lib/python3.7/dist-packages (from geemap) (1.3.5)
Collecting ffmpeg-python
Downloading ffmpeg_python-0.2.0-py3-none-any.whl (25 kB)
Collecting geocoder
Downloading geocoder-1.38.1-py2.py3-none-any.whl (98 kB)
|████████████████████████████████| 98 kB 8.2 MB/s
Collecting python-box
Downloading python_box-5.4.1-py3-none-any.whl (21 kB)
Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from earthengine-api>=0.1.230->geemap) (1.15.0)
Requirement already satisfied: google-api-python-client<2,>=1.12.1 in /usr/local/lib/python3.7/dist-packages (from earthengine-api>=0.1.230->geemap) (1.12.10)
Requirement already satisfied: google-auth-httplib2>=0.0.3 in /usr/local/lib/python3.7/dist-packages (from earthengine-api>=0.1.230->geemap) (0.0.4)
Requirement already satisfied: google-auth>=1.4.1 in /usr/local/lib/python3.7/dist-packages (from earthengine-api>=0.1.230->geemap) (1.35.0)
Requirement already satisfied: google-cloud-storage in /usr/local/lib/python3.7/dist-packages (from earthengine-api>=0.1.230->geemap) (1.18.1)
Requirement already satisfied: future in /usr/local/lib/python3.7/dist-packages (from earthengine-api>=0.1.230->geemap) (0.16.0)
Requirement already satisfied: httplib2shim in /usr/local/lib/python3.7/dist-packages (from earthengine-api>=0.1.230->geemap) (0.0.3)
Requirement already satisfied: httplib2<1dev,>=0.9.2 in /usr/local/lib/python3.7/dist-packages (from earthengine-api>=0.1.230->geemap) (0.17.4)
Requirement already satisfied: branca>=0.3.0 in /usr/local/lib/python3.7/dist-packages (from folium>=0.11.0->geemap) (0.4.2)
Requirement already satisfied: jinja2>=2.9 in /usr/local/lib/python3.7/dist-packages (from folium>=0.11.0->geemap) (2.11.3)
Requirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from folium>=0.11.0->geemap) (2.23.0)
Collecting logzero>=1.5.0
Downloading logzero-1.7.0-py2.py3-none-any.whl (16 kB)
Collecting beautifulsoup4>=4.9.0
Downloading beautifulsoup4-4.10.0-py3-none-any.whl (97 kB)
|████████████████████████████████| 97 kB 5.7 MB/s
Collecting soupsieve>1.2
Downloading soupsieve-2.3.1-py3-none-any.whl (37 kB)
Requirement already satisfied: google-api-core<3dev,>=1.21.0 in /usr/local/lib/python3.7/dist-packages (from google-api-python-client<2,>=1.12.1->earthengine-api>=0.1.230->geemap) (1.26.3)
Requirement already satisfied: uritemplate<4dev,>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from google-api-python-client<2,>=1.12.1->earthengine-api>=0.1.230->geemap) (3.0.1)
Requirement already satisfied: googleapis-common-protos<2.0dev,>=1.6.0 in /usr/local/lib/python3.7/dist-packages (from google-api-core<3dev,>=1.21.0->google-api-python-client<2,>=1.12.1->earthengine-api>=0.1.230->geemap) (1.55.0)
Requirement already satisfied: pytz in /usr/local/lib/python3.7/dist-packages (from google-api-core<3dev,>=1.21.0->google-api-python-client<2,>=1.12.1->earthengine-api>=0.1.230->geemap) (2018.9)
Requirement already satisfied: setuptools>=40.3.0 in /usr/local/lib/python3.7/dist-packages (from google-api-core<3dev,>=1.21.0->google-api-python-client<2,>=1.12.1->earthengine-api>=0.1.230->geemap) (57.4.0)
Requirement already satisfied: packaging>=14.3 in /usr/local/lib/python3.7/dist-packages (from google-api-core<3dev,>=1.21.0->google-api-python-client<2,>=1.12.1->earthengine-api>=0.1.230->geemap) (21.3)
Requirement already satisfied: protobuf>=3.12.0 in /usr/local/lib/python3.7/dist-packages (from google-api-core<3dev,>=1.21.0->google-api-python-client<2,>=1.12.1->earthengine-api>=0.1.230->geemap) (3.17.3)
Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.7/dist-packages (from google-auth>=1.4.1->earthengine-api>=0.1.230->geemap) (0.2.8)
Requirement already satisfied: rsa<5,>=3.1.4 in /usr/local/lib/python3.7/dist-packages (from google-auth>=1.4.1->earthengine-api>=0.1.230->geemap) (4.8)
Requirement already satisfied: cachetools<5.0,>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from google-auth>=1.4.1->earthengine-api>=0.1.230->geemap) (4.2.4)
Requirement already satisfied: ipywidgets<8,>=7.6.0 in /usr/local/lib/python3.7/dist-packages (from here-map-widget-for-jupyter>=1.1.1->geemap) (7.6.5)
Collecting traittypes<3,>=0.2.1
Downloading traittypes-0.2.1-py2.py3-none-any.whl (8.6 kB)
Requirement already satisfied: jupyterlab-widgets>=1.0.0 in /usr/local/lib/python3.7/dist-packages (from ipywidgets<8,>=7.6.0->here-map-widget-for-jupyter>=1.1.1->geemap) (1.0.2)
Requirement already satisfied: ipykernel>=4.5.1 in /usr/local/lib/python3.7/dist-packages (from ipywidgets<8,>=7.6.0->here-map-widget-for-jupyter>=1.1.1->geemap) (4.10.1)
Requirement already satisfied: ipython>=4.0.0 in /usr/local/lib/python3.7/dist-packages (from ipywidgets<8,>=7.6.0->here-map-widget-for-jupyter>=1.1.1->geemap) (5.5.0)
Requirement already satisfied: traitlets>=4.3.1 in /usr/local/lib/python3.7/dist-packages (from ipywidgets<8,>=7.6.0->here-map-widget-for-jupyter>=1.1.1->geemap) (5.1.1)
Requirement already satisfied: ipython-genutils~=0.2.0 in /usr/local/lib/python3.7/dist-packages (from ipywidgets<8,>=7.6.0->here-map-widget-for-jupyter>=1.1.1->geemap) (0.2.0)
Requirement already satisfied: widgetsnbextension~=3.5.0 in /usr/local/lib/python3.7/dist-packages (from ipywidgets<8,>=7.6.0->here-map-widget-for-jupyter>=1.1.1->geemap) (3.5.2)
Requirement already satisfied: nbformat>=4.2.0 in /usr/local/lib/python3.7/dist-packages (from ipywidgets<8,>=7.6.0->here-map-widget-for-jupyter>=1.1.1->geemap) (5.1.3)
Requirement already satisfied: jupyter-client in /usr/local/lib/python3.7/dist-packages (from ipykernel>=4.5.1->ipywidgets<8,>=7.6.0->here-map-widget-for-jupyter>=1.1.1->geemap) (5.3.5)
Requirement already satisfied: tornado>=4.0 in /usr/local/lib/python3.7/dist-packages (from ipykernel>=4.5.1->ipywidgets<8,>=7.6.0->here-map-widget-for-jupyter>=1.1.1->geemap) (5.1.1)
Requirement already satisfied: pickleshare in /usr/local/lib/python3.7/dist-packages (from ipython>=4.0.0->ipywidgets<8,>=7.6.0->here-map-widget-for-jupyter>=1.1.1->geemap) (0.7.5)
Requirement already satisfied: simplegeneric>0.8 in /usr/local/lib/python3.7/dist-packages (from ipython>=4.0.0->ipywidgets<8,>=7.6.0->here-map-widget-for-jupyter>=1.1.1->geemap) (0.8.1)
Requirement already satisfied: decorator in /usr/local/lib/python3.7/dist-packages (from ipython>=4.0.0->ipywidgets<8,>=7.6.0->here-map-widget-for-jupyter>=1.1.1->geemap) (4.4.2)
Requirement already satisfied: pygments in /usr/local/lib/python3.7/dist-packages (from ipython>=4.0.0->ipywidgets<8,>=7.6.0->here-map-widget-for-jupyter>=1.1.1->geemap) (2.6.1)
Requirement already satisfied: prompt-toolkit<2.0.0,>=1.0.4 in /usr/local/lib/python3.7/dist-packages (from ipython>=4.0.0->ipywidgets<8,>=7.6.0->here-map-widget-for-jupyter>=1.1.1->geemap) (1.0.18)
Requirement already satisfied: pexpect in /usr/local/lib/python3.7/dist-packages (from ipython>=4.0.0->ipywidgets<8,>=7.6.0->here-map-widget-for-jupyter>=1.1.1->geemap) (4.8.0)
Requirement already satisfied: MarkupSafe>=0.23 in /usr/local/lib/python3.7/dist-packages (from jinja2>=2.9->folium>=0.11.0->geemap) (2.0.1)
Collecting tornado>=4.0
Downloading tornado-6.1-cp37-cp37m-manylinux2010_x86_64.whl (428 kB)
|████████████████████████████████| 428 kB 68.1 MB/s
Collecting jupyterlab-server~=2.3
Downloading jupyterlab_server-2.10.3-py3-none-any.whl (61 kB)
|████████████████████████████████| 61 kB 7.4 MB/s
Requirement already satisfied: jupyter-core in /usr/local/lib/python3.7/dist-packages (from jupyterlab>=3->geemap) (4.9.2)
Collecting jupyter-server~=1.4
Downloading jupyter_server-1.13.5-py3-none-any.whl (397 kB)
|████████████████████████████████| 397 kB 56.2 MB/s
Collecting nbclassic~=0.2
Downloading nbclassic-0.3.5-py3-none-any.whl (25 kB)
Requirement already satisfied: prometheus-client in /usr/local/lib/python3.7/dist-packages (from jupyter-server~=1.4->jupyterlab>=3->geemap) (0.13.1)
Requirement already satisfied: terminado>=0.8.3 in /usr/local/lib/python3.7/dist-packages (from jupyter-server~=1.4->jupyterlab>=3->geemap) (0.13.1)
Requirement already satisfied: nbconvert in /usr/local/lib/python3.7/dist-packages (from jupyter-server~=1.4->jupyterlab>=3->geemap) (5.6.1)
Collecting websocket-client
Downloading websocket_client-1.3.1-py3-none-any.whl (54 kB)
|████████████████████████████████| 54 kB 2.7 MB/s
Requirement already satisfied: pyzmq>=17 in /usr/local/lib/python3.7/dist-packages (from jupyter-server~=1.4->jupyterlab>=3->geemap) (22.3.0)
Collecting anyio<4,>=3.1.0
Downloading anyio-3.5.0-py3-none-any.whl (79 kB)
|████████████████████████████████| 79 kB 7.8 MB/s
Requirement already satisfied: argon2-cffi in /usr/local/lib/python3.7/dist-packages (from jupyter-server~=1.4->jupyterlab>=3->geemap) (21.3.0)
Collecting jupyter-client
Downloading jupyter_client-7.1.2-py3-none-any.whl (130 kB)
|████████████████████████████████| 130 kB 56.2 MB/s
Requirement already satisfied: Send2Trash in /usr/local/lib/python3.7/dist-packages (from jupyter-server~=1.4->jupyterlab>=3->geemap) (1.8.0)
Requirement already satisfied: typing-extensions in /usr/local/lib/python3.7/dist-packages (from anyio<4,>=3.1.0->jupyter-server~=1.4->jupyterlab>=3->geemap) (3.10.0.2)
Collecting sniffio>=1.1
Downloading sniffio-1.2.0-py3-none-any.whl (10 kB)
Requirement already satisfied: idna>=2.8 in /usr/local/lib/python3.7/dist-packages (from anyio<4,>=3.1.0->jupyter-server~=1.4->jupyterlab>=3->geemap) (2.10)
Requirement already satisfied: nest-asyncio>=1.5 in /usr/local/lib/python3.7/dist-packages (from jupyter-client->ipykernel>=4.5.1->ipywidgets<8,>=7.6.0->here-map-widget-for-jupyter>=1.1.1->geemap) (1.5.4)
Requirement already satisfied: entrypoints in /usr/local/lib/python3.7/dist-packages (from jupyter-client->ipykernel>=4.5.1->ipywidgets<8,>=7.6.0->here-map-widget-for-jupyter>=1.1.1->geemap) (0.4)
Requirement already satisfied: python-dateutil>=2.1 in /usr/local/lib/python3.7/dist-packages (from jupyter-client->ipykernel>=4.5.1->ipywidgets<8,>=7.6.0->here-map-widget-for-jupyter>=1.1.1->geemap) (2.8.2)
Requirement already satisfied: jsonschema>=3.0.1 in /usr/local/lib/python3.7/dist-packages (from jupyterlab-server~=2.3->jupyterlab>=3->geemap) (4.3.3)
Collecting json5
Downloading json5-0.9.6-py2.py3-none-any.whl (18 kB)
Requirement already satisfied: babel in /usr/local/lib/python3.7/dist-packages (from jupyterlab-server~=2.3->jupyterlab>=3->geemap) (2.9.1)
Requirement already satisfied: attrs>=17.4.0 in /usr/local/lib/python3.7/dist-packages (from jsonschema>=3.0.1->jupyterlab-server~=2.3->jupyterlab>=3->geemap) (21.4.0)
Requirement already satisfied: importlib-metadata in /usr/local/lib/python3.7/dist-packages (from jsonschema>=3.0.1->jupyterlab-server~=2.3->jupyterlab>=3->geemap) (4.11.1)
Requirement already satisfied: importlib-resources>=1.4.0 in /usr/local/lib/python3.7/dist-packages (from jsonschema>=3.0.1->jupyterlab-server~=2.3->jupyterlab>=3->geemap) (5.4.0)
Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /usr/local/lib/python3.7/dist-packages (from jsonschema>=3.0.1->jupyterlab-server~=2.3->jupyterlab>=3->geemap) (0.18.1)
Requirement already satisfied: zipp>=3.1.0 in /usr/local/lib/python3.7/dist-packages (from importlib-resources>=1.4.0->jsonschema>=3.0.1->jupyterlab-server~=2.3->jupyterlab>=3->geemap) (3.7.0)
Requirement already satisfied: notebook<7 in /usr/local/lib/python3.7/dist-packages (from nbclassic~=0.2->jupyterlab>=3->geemap) (5.3.1)
Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from packaging>=14.3->google-api-core<3dev,>=1.21.0->google-api-python-client<2,>=1.12.1->earthengine-api>=0.1.230->geemap) (3.0.7)
Requirement already satisfied: wcwidth in /usr/local/lib/python3.7/dist-packages (from prompt-toolkit<2.0.0,>=1.0.4->ipython>=4.0.0->ipywidgets<8,>=7.6.0->here-map-widget-for-jupyter>=1.1.1->geemap) (0.2.5)
Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /usr/local/lib/python3.7/dist-packages (from pyasn1-modules>=0.2.1->google-auth>=1.4.1->earthengine-api>=0.1.230->geemap) (0.4.8)
Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests->folium>=0.11.0->geemap) (3.0.4)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->folium>=0.11.0->geemap) (2021.10.8)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->folium>=0.11.0->geemap) (1.24.3)
Requirement already satisfied: ptyprocess in /usr/local/lib/python3.7/dist-packages (from terminado>=0.8.3->jupyter-server~=1.4->jupyterlab>=3->geemap) (0.7.0)
Collecting whitebox
Downloading whitebox-2.1.2-py2.py3-none-any.whl (75 kB)
|████████████████████████████████| 75 kB 4.4 MB/s
Requirement already satisfied: argon2-cffi-bindings in /usr/local/lib/python3.7/dist-packages (from argon2-cffi->jupyter-server~=1.4->jupyterlab>=3->geemap) (21.2.0)
Requirement already satisfied: cffi>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from argon2-cffi-bindings->argon2-cffi->jupyter-server~=1.4->jupyterlab>=3->geemap) (1.15.0)
Requirement already satisfied: pycparser in /usr/local/lib/python3.7/dist-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->jupyter-server~=1.4->jupyterlab>=3->geemap) (2.21)
Collecting ratelim
Downloading ratelim-0.1.6-py2.py3-none-any.whl (4.0 kB)
Requirement already satisfied: google-cloud-core<2.0dev,>=1.0.0 in /usr/local/lib/python3.7/dist-packages (from google-cloud-storage->earthengine-api>=0.1.230->geemap) (1.0.3)
Requirement already satisfied: google-resumable-media<0.5.0dev,>=0.3.1 in /usr/local/lib/python3.7/dist-packages (from google-cloud-storage->earthengine-api>=0.1.230->geemap) (0.4.1)
Requirement already satisfied: cycler>=0.10 in /usr/local/lib/python3.7/dist-packages (from matplotlib->geemap) (0.11.0)
Requirement already satisfied: kiwisolver>=1.0.1 in /usr/local/lib/python3.7/dist-packages (from matplotlib->geemap) (1.3.2)
Requirement already satisfied: testpath in /usr/local/lib/python3.7/dist-packages (from nbconvert->jupyter-server~=1.4->jupyterlab>=3->geemap) (0.6.0)
Requirement already satisfied: mistune<2,>=0.8.1 in /usr/local/lib/python3.7/dist-packages (from nbconvert->jupyter-server~=1.4->jupyterlab>=3->geemap) (0.8.4)
Requirement already satisfied: bleach in /usr/local/lib/python3.7/dist-packages (from nbconvert->jupyter-server~=1.4->jupyterlab>=3->geemap) (4.1.0)
Requirement already satisfied: pandocfilters>=1.4.1 in /usr/local/lib/python3.7/dist-packages (from nbconvert->jupyter-server~=1.4->jupyterlab>=3->geemap) (1.5.0)
Requirement already satisfied: defusedxml in /usr/local/lib/python3.7/dist-packages (from nbconvert->jupyter-server~=1.4->jupyterlab>=3->geemap) (0.7.1)
Requirement already satisfied: webencodings in /usr/local/lib/python3.7/dist-packages (from bleach->nbconvert->jupyter-server~=1.4->jupyterlab>=3->geemap) (0.5.1)
Requirement already satisfied: pyyaml in /usr/local/lib/python3.7/dist-packages (from owslib->geemap) (3.13)
Collecting pyproj>=2
Downloading pyproj-3.2.1-cp37-cp37m-manylinux2010_x86_64.whl (6.3 MB)
|████████████████████████████████| 6.3 MB 40.9 MB/s
Requirement already satisfied: tenacity>=6.2.0 in /usr/local/lib/python3.7/dist-packages (from plotly->geemap) (8.0.1)
Collecting nbconvert
Downloading nbconvert-6.4.2-py3-none-any.whl (558 kB)
|████████████████████████████████| 558 kB 71.3 MB/s
Collecting websockets>=9.0
Downloading websockets-10.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (111 kB)
|████████████████████████████████| 111 kB 70.7 MB/s
Requirement already satisfied: nbclient<0.6,>=0.4.0 in /usr/local/lib/python3.7/dist-packages (from voila->geemap) (0.5.11)
Requirement already satisfied: jupyterlab-pygments in /usr/local/lib/python3.7/dist-packages (from nbconvert->jupyter-server~=1.4->jupyterlab>=3->geemap) (0.1.2)
Building wheels for collected packages: ee-extra, ipynb-py-convert, pycrs, sankee
Building wheel for ee-extra (setup.py) ... done
Created wheel for ee-extra: filename=ee_extra-0.0.10-py3-none-any.whl size=186748 sha256=60d932e06c0705e187381517f9cb630d92c505954caa7511a1c7e646b01ee205
Stored in directory: /root/.cache/pip/wheels/17/e0/8f/c3553eed58285eb5fec73002519406ef543a949fee1c96c3c8
Building wheel for ipynb-py-convert (setup.py) ... done
Created wheel for ipynb-py-convert: filename=ipynb_py_convert-0.4.6-py3-none-any.whl size=4640 sha256=3d76b7e0935c7607b0f64be2ff76539344d1fb73b8029830c98a13be6d5084de
Stored in directory: /root/.cache/pip/wheels/af/31/a9/761b134adbbca3c92d491eff3bad785c0a0c0079695d6f0504
Building wheel for pycrs (setup.py) ... done
Created wheel for pycrs: filename=PyCRS-1.0.2-py3-none-any.whl size=32704 sha256=6b8a33a30b79e2517816f0bf201d0f7096b6d16993558c9942c1275ca35be6b1
Stored in directory: /root/.cache/pip/wheels/3e/ce/32/1ec0aba6b9770681a423e82f0274c57d09ad2c20c2864901f9
Building wheel for sankee (setup.py) ... done
Created wheel for sankee: filename=sankee-0.0.7-py3-none-any.whl size=27639 sha256=c688d4c4c33eefd31d2787b4ab08a8f264ae47c630087333ce9cbf913ac66821
Stored in directory: /root/.cache/pip/wheels/13/28/83/5726f82a8cb0baf76169d99ee0595c420afedb9020e22bbd4b
Successfully built ee-extra ipynb-py-convert pycrs sankee
Installing collected packages: tornado, jupyter-client, nbconvert, sniffio, websocket-client, anyio, soupsieve, jupyter-server, json5, xyzservices, whitebox, websockets, traittypes, ratelim, pyproj, nbclassic, logzero, jupyterlab-server, ipytree, ipyfilechooser, beautifulsoup4, whiteboxgui, voila, sankee, python-box, pyshp, pycrs, owslib, mss, jupyterlab, ipynb-py-convert, ipyleaflet, ipyevents, here-map-widget-for-jupyter, geojson, geocoder, geeadd, folium, ffmpeg-python, ee-extra, colour, bqplot, geemap
Attempting uninstall: tornado
Found existing installation: tornado 5.1.1
Uninstalling tornado-5.1.1:
Successfully uninstalled tornado-5.1.1
Attempting uninstall: jupyter-client
Found existing installation: jupyter-client 5.3.5
Uninstalling jupyter-client-5.3.5:
Successfully uninstalled jupyter-client-5.3.5
Attempting uninstall: nbconvert
Found existing installation: nbconvert 5.6.1
Uninstalling nbconvert-5.6.1:
Successfully uninstalled nbconvert-5.6.1
Attempting uninstall: beautifulsoup4
Found existing installation: beautifulsoup4 4.6.3
Uninstalling beautifulsoup4-4.6.3:
Successfully uninstalled beautifulsoup4-4.6.3
Attempting uninstall: folium
Found existing installation: folium 0.8.3
Uninstalling folium-0.8.3:
Successfully uninstalled folium-0.8.3
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
google-colab 1.0.0 requires tornado~=5.1.0; python_version >= "3.0", but you have tornado 6.1 which is incompatible.
datascience 0.10.6 requires folium==0.2.1, but you have folium 0.12.1.post1 which is incompatible.
Successfully installed anyio-3.5.0 beautifulsoup4-4.10.0 bqplot-0.12.33 colour-0.1.5 ee-extra-0.0.10 ffmpeg-python-0.2.0 folium-0.12.1.post1 geeadd-0.5.5 geemap-0.11.5 geocoder-1.38.1 geojson-2.5.0 here-map-widget-for-jupyter-1.1.3 ipyevents-2.0.1 ipyfilechooser-0.6.0 ipyleaflet-0.15.0 ipynb-py-convert-0.4.6 ipytree-0.2.1 json5-0.9.6 jupyter-client-7.1.2 jupyter-server-1.13.5 jupyterlab-3.2.9 jupyterlab-server-2.10.3 logzero-1.7.0 mss-6.1.0 nbclassic-0.3.5 nbconvert-6.4.2 owslib-0.25.0 pycrs-1.0.2 pyproj-3.2.1 pyshp-2.2.0 python-box-5.4.1 ratelim-0.1.6 sankee-0.0.7 sniffio-1.2.0 soupsieve-2.3.1 tornado-6.1 traittypes-0.2.1 voila-0.3.2 websocket-client-1.3.1 websockets-10.2 whitebox-2.1.2 whiteboxgui-0.7.0 xyzservices-2022.2.0
#importing the libraries ee (earth-engine) and gm (geemap)
import ee
# we use gm so that we don't have to type geemap every time we use a function in geemap
import geemap as gm
#Press ENTER once you have entered your authentication code
# the code to authenticate the session
ee.Authenticate()
To authorize access needed by Earth Engine, open the following URL in a web browser and follow the instructions. If the web browser does not start automatically, please manually browse the URL below.
https://accounts.google.com/o/oauth2/auth?client_id=517222506229-vsmmajv00ul0bs7p89v5m89qs8eb9359.apps.googleusercontent.com&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fearthengine+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fdevstorage.full_control&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&code_challenge=636Ioco4RVecmNZ31z0sqiZRWsZCydzZKywgwsRj16Y&code_challenge_method=S256
The authorization workflow will generate a code, which you should paste in the box below.
Enter verification code: 4/1AX4XfWh1Cj1xKgJpO8-0FZ60ZW4e2n127GY3zsaFmIrFDykK7fpW7Le99ZY
Successfully saved authorization token.
# initialize the sesion
ee.Initialize()
Tip: To find the zoom level and coordinates, it is recommended to look at the address bar and copy the link to see them. For example, https://www.google.com/maps/place/Nagpur,+Maharashtra/@21.1612315,79.0024702,12z/ in this link we see coordinates after the '@' sign and zoom before 'z'. Zoom level is not absolute and depending upon the screen size, different users may need to have different zoom level for their need.
# set our initial coordinates to Addis Ababa in Ethiopia
# latitude and longitude
center_lat = 9.0061525
center_long = 38.765783
zoomlevel = 12
# this makes the map
my_first_map = gm.Map(center = [center_lat, center_long], zoom = zoomlevel) #gm denotes geemap
# to display the map we run the following commands
# addLayerControl adds UI control on the map output so that user can interactr with the layers and other information
my_first_map.addLayerControl()
# shows the output
my_first_map
Congratulations on your first map generation using Google Earth Engine and Python. You can explore the panel on the left hand side. In the coming tutorials, we will learn how to select a particular area of interest using custom shape files.
There are a couple of reasons why you may not get the desired output. This will help you troubleshoot the probable problems.
# Exercise 1
# Create a map with its center in Khartoum
# Hint: You may need to use Google Maps for finding the lat-long and appropriate zoom level.
# Begin writing your code HERE
In this part of the tutorial, you will learn how to find and import the satellite images, draw or select a particular area of interest, import custom shape files, select the time period for which you want the image, and selecting the bands from the satellite images. This will be a long tutorial, so take a small break, grab a cup of coffee, and let's go!
The best way to find a satellite image of interest is to go to Google Earth Engine Catalog and search for the required dataset. A user can go this link to search for the satellite imagery. One needs to enter the name of the satellite in the search bar and they will be shown the relevant results. What we need for our purpose is the unique ID associated with each satellite imagery that one can find in the description after clicking the relevant areas. The visuals below explain the whole process step by step.
Sentinel-2 MSI: MultiSpectral Instrument, Level-1C panel and you will come across the following screen. We need the highlighted ID (in red) for our information.