A ninja python package that unifies the Google Earth Engine ecosystem.

Overview

ee_extra

A Python package that unifies the Google Earth Engine ecosystem.

EarthEngine.jl | rgee | rgee+ | eemont

PyPI conda-forge License Documentation Status Tests Awesome Spectral Indices GEE STAC Scale and Offset ee-appshot Black isort


GitHub: https://github.com/r-earthengine/ee_extra

Documentation: https://ee-extra.readthedocs.io

PyPI: https://pypi.python.org/pypi/ee_extra

Conda-forge: https://anaconda.org/conda-forge/ee_extra


Overview

Google Earth Engine (GEE) is a cloud-based service for geospatial processing of vector and raster data. The Earth Engine platform has a JavaScript and a Python API with different methods to process geospatial objects. Google Earth Engine also provides a HUGE PETABYTE-SCALE CATALOG of raster and vector data that users can process online.

There are a lot of fantastic third-party GEE packages and projects around GitHub. However, most of them are coded in JavaScript or Python, and they are not straightforward to translate to R, Julia, or other programming languages. The main goal of eeExtra is to guarantee a smooth import of these projects in other programming languages by standardizing different methods and enabling the use of JavaScript modules outside the Code Editor.

ee_extra_diagram

Some of the eeExtra features are listed here:

  • Automatic scaling and offsetting.
  • Spectral Indices computation (using Awesome Spectral Indices).
  • Clouds and shadows masking.
  • STAC related functions.

And the most important feature:

  • Enabling the usage of JavaScript modules outside the Code Editor.

How does it work?

eeExtra is a Python package, just like any other, but it is a ninja that serves as a methods provider for different environments: R, Julia and Python itself. eeExtra accomplish this by being the powerhouse of some amazing packages such as rgee, rgee+, and eemont.

Public JavaScript module can also be used outside the Code Editor in these packages through eeExtra. For this, eeExtra implements a rigorous JavaScript translation module that allows users to install, require and use JavaScript modules as if they were on the Code Editor!

You may be wondering "Why is it a ninja package?", well, that's a valid question, the whole point of eeExtra resides in the fact that nobody has to use eeExtra itself, but rather use one of the packages that are powered by eeExtra! :)

Installation

Install the latest version from PyPI:

pip install ee_extra

Install soft ee_extra dependencies:

pip install jsbeautifier regex

Upgrade eeExtra by running:

pip install -U ee_extra

Install the latest version from conda-forge:

conda install -c conda-forge ee_extra

Install the latest dev version from GitHub by running:

pip install git+https://github.com/r-earthengine/ee_extra

Features

Let's see some of the awesome features of eeExtra and how to use them from the powered packages in python and R!

Scale and Offset

Most datasets in the data catalog are scaled and in order to get their real values, we have to scale (and sometimes offset) them!

Python (eemont) R (rgee+) Julia (EarthEngine.jl)
import ee, eemont
ee.Initialize()
db = 'COPERNICUS/S2_SR'
S2 = ee.ImageCollection(db)
S2.scaleAndOffset()
library(rgee)
library(rgeeExtra)
ee_Initialize()
db <- 'COPERNICUS/S2_SR'
S2 <- ee$ImageCollection(db)
ee_extra_scaleAndOffset(S2)
using PyCall
using EarthEngine

Initialize()

ee_extra = pyimport("ee_extra")
ee_core = ee_extra.STAC.core
db = "COPERNICUS/S2_SR"
S2 = ee.ImageCollection(db)
ee_core.scaleAndOffset(S2)

Spectral Indices

Do you know the Awesome Spectral Indices? Well, you can compute them automatically with eeExtra!

Python (eemont) R (rgee+) Julia (EarthEngine.jl)
import ee, eemont
ee.Initialize()
db = 'COPERNICUS/S2_SR'
S2 = ee.ImageCollection(db)
S2 = S2.scaleAndOffset()
S2.spectralIndices("EVI")
library(rgee)
library(rgeeExtra)
ee_Initialize()
db <- 'COPERNICUS/S2_SR'
S2 <- ee$ImageCollection(db)
S2 <- ee_extra_scaleAndOffset(S2)
ee_extra_spIndices(S2, "EVI")
using PyCall
using EarthEngine

Initialize()

ee_extra = pyimport("ee_extra")
ee_core = ee_extra.STAC.core
ee_sp = ee_extra.Spectral.core
db = "COPERNICUS/S2_SR"
S2 = ee.ImageCollection(db)
S2 = ee_core.scaleAndOffset(S2)
ee_sp.spectralIndices(S2, "EVI")

STAC features

Access STAC properties easily!

Python (eemont) R (rgee+) Julia (EarthEngine.jl)
import ee, eemont
ee.Initialize()
db = 'COPERNICUS/S2_SR'
S2 = ee.ImageCollection(db)
S2.getSTAC()
library(rgee)
library(rgeeExtra)
ee_Initialize()
db <- 'COPERNICUS/S2_SR'
S2 <- ee$ImageCollection(db)
ee_extra_getSTAC()
  
using PyCall
using EarthEngine

Initialize()

ee_extra = pyimport("ee_extra")
ee_core = ee_extra.STAC.core
db = "COPERNICUS/S2_SR"
S2 = ee.ImageCollection(db)
ee_core.getSTAC(S2)

JavaScript Modules

This is perhaps the most important feature in eeExtra! What if you could use a JavaScript module (originally just useful for the Code Editor) in python or R? Well, wait no more for it!

  • JS Code Editor
var mod = require('users/sofiaermida/landsat_smw_lst:modules/Landsat_LST.js')

var geom = ee.Geometry.Rectangle(-8.91, 40.0, -8.3, 40.4)
var LST = mod.collection("L8", "2018-05-15", "2018-05-31", geom, true)

print(LST)
  • Python eemont
import ee, eemont

ee.Initialize()
module = 'users/sofiaermida/landsat_smw_lst:modules/Landsat_LST.js'
ee.install(module)
mod = ee.require(module)

geom = ee.Geometry.Rectangle(-8.91, 40.0, -8.3, 40.4)
LST = mod.collection("L8", "2018-05-15", "2018-05-31", geom, True)
print(LST)
  • R rgeeExtra
library(rgee)
library(rgeeExtra)

ee_Initialize()

lsmod <- 'users/sofiaermida/landsat_smw_lst:modules/Landsat_LST.js'
mod <- module(lsmod)

geom <- ee$Geometry$Rectangle(-8.91, 40.0, -8.3, 40.4)
LST <- mod$collection("L8", "2018-05-15", "2018-05-31", geom, TRUE)
print(LST)
  • Julia EarthEngine.jl
using PyCall
using EarthEngine

Initialize()

ee_extra = pyimport("ee_extra")
landsat_module = "users/sofiaermida/landsat_smw_lst:modules/Landsat_LST.js"
ee_extra.install(landsat_module)
lsmodule = ee_extra.require(landsat_module)

geom = Rectangle(-8.91, 40.0, -8.3, 40.4)
LST = lsmodule.collection("L8", "2018-05-15", "2018-05-31", geom, true)
print(LST)
Comments
  • Moving `matchHistogram` and `panSharpen` from `eemont` to `ee_extra`

    Moving `matchHistogram` and `panSharpen` from `eemont` to `ee_extra`

    Hi, @aazuspan!

    @csaybar and I are giving ee_extra the final touch and we want to know if you would accept to move the amazing matchHist and panSharpen resources from eemont to this repo and make them available for the whole ecosystem.

    Please let me know if you accept! :)

    And if you want, I can move them myself (and also re-arrange the resources in eemont by using ee_extra), just let me know!

    Cheers!

    Dave

    enhancement 
    opened by davemlz 10
  • add drop argument to spectralIndices

    add drop argument to spectralIndices

    Hi @davemlz, please :pray: can you add a drop=False argument to ee_extra.Spectral.core.spectralIndices?

    library(rgee)
    library(rgeeExtra)
    
    ee_Initialize()
    
    S2 <- ee$ImageCollection('COPERNICUS/S2_SR')$first()
    names(ee_ImageCollection_spectralIndex(S2, 'kernel'))
    

    I got:

    [1] "B1" "B2" "B3" "B4" "B5" "B6" "B7" "B8" "B8A" "B9"
    [11] "B11" "B12" "AOT" "WVP" "SCL" "TCI_R" "TCI_G" "TCI_B" "QA10" "QA20" [21] "QA60" "kEVI" "kNDVI" "kRVI" "kVARI"

    I would like: [1] "kEVI" "kNDVI" "kRVI" "kVARI"

    enhancement 
    opened by csaybar 6
  • Add Landsat 8/9 tasseled cap coefficients

    Add Landsat 8/9 tasseled cap coefficients

    Tasseled cap coefficients for Landsat 8/9 TOA and SR data were recently published by Zhai et al. We already have Landsat 8 coefficients from Baig et al, so I'll need to do some reading to see which to include...

    enhancement 
    opened by aazuspan 4
  • closest bug in ee_extra

    closest bug in ee_extra

    import ee, eemont, ee_extra
    ee.Initialize()
    S2 = ee.ImageCollection('MODIS/006/MCD12Q1').closest('2020-10-15')
    S2.getInfo()
    
    ee_extra.ImageCollection.core.closest(
        ee.ImageCollection('MODIS/006/MCD12Q1'), '2020-10-15'
    ).getInfo()
    

    Traceback (most recent call last): File "", line 1, in File "/home/csaybar/.local/lib/python3.8/site-packages/ee/collection.py", line 127, in getInfo return super(Collection, self).getInfo() File "/home/csaybar/.local/lib/python3.8/site-packages/ee/computedobject.py", line 98, in getInfo return data.computeValue(self) File "/home/csaybar/.local/lib/python3.8/site-packages/ee/data.py", line 674, in computeValue return _execute_cloud_call( File "/home/csaybar/.local/lib/python3.8/site-packages/ee/data.py", line 336, in _execute_cloud_call raise _translate_cloud_exception(e) ee.ee_exception.EEException: Element.get: Parameter 'object' is required.

    opened by csaybar 4
  • Tasseled Cap Transformations

    Tasseled Cap Transformations

    • Fix #5 by adding tasseledCap function to Spectral module for calculating brightness, greenness, and wetness from Sentinel-2, MODIS, and Landsat 4-8 images and image collections
    • Add utility function for matching platforms to tasseled cap coefficients
    • Update tests and docs to include tasseledCap

    Let me know if any changes are needed :)

    opened by aazuspan 4
  • Tasseled Cap Transformations

    Tasseled Cap Transformations

    See the original feature request on eemont.

    This would add an ee_extra.Transformations module with a tasseledCap function to calculate tasseled cap brightness, wetness, and greenness bands from an input ee.Image from the MODIS, Landsat 5/7/8, or Sentinel-2 platforms.

    A couple design questions:

    • Should the tasseled cap bands be added to the original image (like spectralIndices) or returned as a new ee.Image?
    • How strict should the platform matching be? For example, published Landsat 8 coefficients were generated for at-sensor reflectance and technically aren't accurate for TOA or Surface Reflectance (see the warning on Hexagon Geospatial). Should that be strictly enforced or just mentioned in the docs?

    Feel free to assign me, thanks!

    enhancement 
    opened by aazuspan 4
  • Landsat_LST.js some problems

    Landsat_LST.js some problems

    @davemlz

    x = """
    var landsatALL = (landsatSR.combine(landsatTOA.select(tir), true));
    """
    
    x = fix_identation(x)
    x = normalize_fn_style(x)
    x = variable_definition(x)
    x = logical_operators_boolean_null_comments(x)
    x = multiline_comments(x)
    x = multiline_method_chain(x)
    x = function_definition(x)
    x = dictionary_keys(x) 
    x = dictionary_object_access(x)
    x = keyword_arguments_object(x) # ERROR HERE!
    x = if_statement(x)
    x = array_isArray(x)
    x = for_loop(x) # ERROR HERE!
    x = extra_work(x)
    
    with open("/home/csaybar/Desktop/test3.py", 'w') as f:
        f.write(x)
    

    Got:

    landsatALL = (landsatSR.combine(landsatTOA.select(tir),True)
    

    Expected:

    landsatALL = (landsatSR.combine(landsatTOA.select(tir), True))
    
    opened by csaybar 4
  • Broken docs

    Broken docs

    Hey folks, it looks like all of the Sphinx autosummaries are failing to build, so the latest API reference is empty. Trying to build locally gives a lot of No module named 'ee' warnings.

    I've fixed this in a few of my projects by adding autodoc_mock_imports = ["ee"] to docs/conf.py, and that seems to work here, but there's probably a better solution since I think that's just hiding the problem. Any Sphinx pros know how to tackle this the right way?

    bug documentation 
    opened by aazuspan 3
  • test_06.js fail

    test_06.js fail

    JS file :

      var levelsDic = ee.Dictionary({
            'level0': {'zoom': 0, 'scale': 157000},
            'level1': {'zoom': 1, 'scale': 78000},
            'level2': {'zoom': 2, 'scale': 39000},
            'level3': {'zoom': 3, 'scale': 20000},
            'level4': {'zoom': 4, 'scale': 10000},
            'level5': {'zoom': 5, 'scale': 5000},
            'level6': {'zoom': 6, 'scale': 2000},
            'level7': {'zoom': 7, 'scale': 1000},
            'level8': {'zoom': 8, 'scale': 611},
            'level9': {'zoom': 9, 'scale': 306},
            'level10': {'zoom': 10, 'scale': 153},
            'level11': {'zoom': 11, 'scale': 76},
            'level12': {'zoom': 12, 'scale': 38},
            'level13': {'zoom': 13, 'scale': 19},
            'level14': {'zoom': 14, 'scale': 10},
            'level15': {'zoom': 15, 'scale': 5},
      });
    

    GOT:

    import ee
    import math
    from collections import UserDict
    
    exports = UserDict()
    
    levelsDic = ee.Dictionary({
    'level0:{zoom': 0,'scale': 157000},
          'level1': {'zoom': 1,'scale': 78000},
          'level2': {'zoom': 2,'scale': 39000},
          'level3': {'zoom': 3,'scale': 20000},
          'level4': {'zoom': 4,'scale': 10000},
          'level5': {'zoom': 5,'scale': 5000},
          'level6': {'zoom': 6,'scale': 2000},
          'level7': {'zoom': 7,'scale': 1000},
          'level8': {'zoom': 8,'scale': 611},
          'level9': {'zoom': 9,'scale': 306},
          'level10': {'zoom': 10,'scale': 153},
          'level11': {'zoom': 11,'scale': 76},
          'level12': {'zoom': 12,'scale': 38},
          'level13': {'zoom': 13,'scale': 19},
          'level14': {'zoom': 14,'scale': 10},
          'level15': {'zoom': 15,'scale': 5},
    })
    

    EXPECTED:

    import ee
    import math
    from collections import UserDict
    
    exports = UserDict()
    
    levelsDic = ee.Dictionary({
          'level0': {'zoom': 0,'scale': 157000},
          'level1': {'zoom': 1,'scale': 78000},
          'level2': {'zoom': 2,'scale': 39000},
          'level3': {'zoom': 3,'scale': 20000},
          'level4': {'zoom': 4,'scale': 10000},
          'level5': {'zoom': 5,'scale': 5000},
          'level6': {'zoom': 6,'scale': 2000},
          'level7': {'zoom': 7,'scale': 1000},
          'level8': {'zoom': 8,'scale': 611},
          'level9': {'zoom': 9,'scale': 306},
          'level10': {'zoom': 10,'scale': 153},
          'level11': {'zoom': 11,'scale': 76},
          'level12': {'zoom': 12,'scale': 38},
          'level13': {'zoom': 13,'scale': 19},
          'level14': {'zoom': 14,'scale': 10},
          'level15': {'zoom': 15,'scale': 5},
    })
    
    bug 
    opened by csaybar 3
  • Landsat 8/9 tasseled cap coefficients

    Landsat 8/9 tasseled cap coefficients

    This PR would close #42 by adding tasseled cap coefficients for Landsat 8 and 9, TOA and SR, from Zhai et al. 2022. To keep things consistent across the platforms, the L8 TOA coefficients replace the existing coefficients from Baig et al.

    Zhai et al. provided 5- and 6-band coefficients (with and without the blue band) and I chose to include the 5-band to minimize atmospheric effects, as recommended in their conclusions.

    Aside from adding the coefficients, I just did a little bit of clean up, shortening the redundant docstring and passing the platform name rather than entire platform dict to _get_tc_coefficients.

    enhancement 
    opened by aazuspan 2
  • Migrate `matchHistogram` from `eemont`

    Migrate `matchHistogram` from `eemont`

    Hi @csaybar and @davemlz, here's the first eemont feature migrated over!

    • Implement part of #28 by adding the ee_extra.Spectral.matchHistogram function
    • Fix a bug in the original matchHistogram implementation that caused band order and image bounds to change on matched images
    • Make bands arg optional to simplify matching bands within collections
    enhancement 
    opened by aazuspan 2
  • Metrics

    Metrics

    Hi, Earth Engine community! Welcome to the list of metrics of ee_extra. Here you can find the metrics that are included, planned or in progress for ee_extra. Please feel free to pin one of the admins to add, edit or report a new metric in this list: @davemlz, @csaybar, @aazuspan @KMarkert. Note: This Issue will remain open.

    | Metric | Status | Assigned | PR |:----------:|:-------------:|:------:|:-----:| | MSE | In Progress | @aazuspan | #33 | | RMSE | In Progress | @aazuspan | #33 | | RASE | In Progress | @aazuspan | #33 | | ERGAS | In Progress | @aazuspan | #33 | | DIV | In Progress | @aazuspan | #33 | | bias | In Progress | @aazuspan | #33 | | CC | In Progress | @aazuspan | #33 | | CML | In Progress | @aazuspan | #33 | | CMC | In Progress | @aazuspan | #33 | | UIQI | In Progress | @aazuspan | #33 | | IoU | In Progress | @csaybar | | | Dice | In Progress | @csaybar | |

    enhancement help wanted 
    opened by davemlz 1
  • Javascript install through `ee.install` raised `HTTP Error 404` and `ee.require` takes a long loading time

    Javascript install through `ee.install` raised `HTTP Error 404` and `ee.require` takes a long loading time

    Hi, all. I encountered some issues when installing javascript module using ee.install. It raised HTTP Error 404: Not Found.

    Downloading 'users/marcyinfeng/Algorithms:/mcd19_prior'...
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\Users\WSBARATA01\miniconda3\envs\gee\lib\site-packages\eemont\extra.py", line 80, in install
        return ee_install(module, update, quiet)
      File "C:\Users\WSBARATA01\miniconda3\envs\gee\lib\site-packages\ee_extra\JavaScript\install.py", line 200, in install
        return _install_dependencies(x=deps, update=update, installed=[])
      File "C:\Users\WSBARATA01\miniconda3\envs\gee\lib\site-packages\ee_extra\JavaScript\install.py", line 188, in _install_dependencies
        _install(dep, update, quiet)
      File "C:\Users\WSBARATA01\miniconda3\envs\gee\lib\site-packages\ee_extra\JavaScript\install.py", line 158, in _install
        with urllib.request.urlopen(_convert_path_to_ee_sources(x)) as url:
      File "C:\Users\WSBARATA01\miniconda3\envs\gee\lib\urllib\request.py", line 222, in urlopen
        return opener.open(url, data, timeout)
      File "C:\Users\WSBARATA01\miniconda3\envs\gee\lib\urllib\request.py", line 531, in open
        response = meth(req, response)
      File "C:\Users\WSBARATA01\miniconda3\envs\gee\lib\urllib\request.py", line 640, in http_response
        response = self.parent.error(
      File "C:\Users\WSBARATA01\miniconda3\envs\gee\lib\urllib\request.py", line 569, in error
        return self._call_chain(*args)
      File "C:\Users\WSBARATA01\miniconda3\envs\gee\lib\urllib\request.py", line 502, in _call_chain
        result = func(*args)
      File "C:\Users\WSBARATA01\miniconda3\envs\gee\lib\urllib\request.py", line 649, in http_error_default
        raise HTTPError(req.full_url, code, msg, hdrs, fp)
    urllib.error.HTTPError: HTTP Error 404: Not Found
    

    It seems caused by the colon replacement which is insufficient for other cases. I found some javascript modules which have unusual path such as: users/marcyinfeng/Algorithms:/mcd19_prior and users/marcyinfeng/Algorithms/:/S2_view_angle

    def _convert_path_to_ee_sources(path: str) -> str:
        """Get the remote module path from the 'ee-sources' GCS bucket.
    
        Args:
            path: str
    
        Returns:
            An ee-sources module url.
        """
        if path.startswith("http"):
            eempath = path
        else:
            bpath = path.replace(":", "/") # <- insufficient replacement
            eempath = f"https://storage.googleapis.com/ee-sources/{bpath}"
        return eempath
    

    I try to normalize the path using pathlib as follows:

    def _convert_path_to_ee_sources(path: str) -> str:
        """Get the remote module path from the 'ee-sources' GCS bucket.
    
        Args:
            path: str
    
        Returns:
            An ee-sources module url.
        """
        if path.startswith("http"):
            eempath = path
        else:
            bpath = str(pathlib.Path(path.replace(":", "/"))).replace("\\", "/") # <- fix my issue, but only for Windows case
            eempath = f"https://storage.googleapis.com/ee-sources/{bpath}"
        return eempath
    

    All dependencies were installed successfully:

    The module 'users/marcyinfeng/utils:SIAC' is already installed!
    Checking dependencies for users/marcyinfeng/utils:SIAC...
    The module 'users/marcyinfeng/Algorithms:S2_MT_Cloud' is already installed!
    Checking dependencies for users/marcyinfeng/Algorithms:S2_MT_Cloud...
    The module 'users/marcyinfeng/Algorithms:NN_cloud' is already installed!
    Checking dependencies for users/marcyinfeng/Algorithms:NN_cloud...
    The module 'users/marcyinfeng/Algorithms:/mcd19_prior' is already installed!
    Checking dependencies for users/marcyinfeng/Algorithms:/mcd19_prior...
    The module 'users/marcyinfeng/Algorithms:/get_aot' is already installed!
    Checking dependencies for users/marcyinfeng/Algorithms:/get_aot...
    The module 'users/marcyinfeng/Algorithms/:/S2_view_angle' is already installed!
    Checking dependencies for users/marcyinfeng/Algorithms/:/S2_view_angle...
    The module 'users/marcyinfeng/Algorithms/:/landsat_view_angles' is already installed!
    Checking dependencies for users/marcyinfeng/Algorithms/:/landsat_view_angles...
    The module 'users/marcyinfeng/Algorithms/:/NN_prosail' is already installed!
    Checking dependencies for users/marcyinfeng/Algorithms/:/NN_prosail...
    The module 'users/marcyinfeng/Algorithms/:/get_xps' is already installed!
    Checking dependencies for users/marcyinfeng/Algorithms/:/get_xps...
    The module 'users/marcyinfeng/utils/:/load_NN' is already installed!
    Checking dependencies for users/marcyinfeng/utils/:/load_NN...
    The module 'users/gena/packages:palettes' is already installed!
    Checking dependencies for users/gena/packages:palettes...
    The module 'users/marcyinfeng/Algorithms/:/simu_ref' is already installed!
    Checking dependencies for users/marcyinfeng/Algorithms/:/simu_ref...
    The module 'users/marcyinfeng/Algorithms:mcd19_prior' is already installed!
    Checking dependencies for users/marcyinfeng/Algorithms:mcd19_prior...
    The module 'users/gena/packages:text' is already installed!
    Checking dependencies for users/gena/packages:text...
    All dependencies were successfully installed!
    

    But it takes a long time when loading the module using ee.require. Is it depend on how many other dependent modules?

    Please, fixed this issue if possible. Thank you in advance.

    Best regards, Suhendra

    opened by suhendra0812 8
  • Javascript modules to integrate/test in ee_extra

    Javascript modules to integrate/test in ee_extra

    Hi all! :)

    These are the main javascript modules we are considering adding to ee_extra algorithms subpackage. If you know about other JS modules we must considerate please write it here :)

    Ping: @KMarkert @giswqs @aazuspan @davemlz @jdbcode

    help wanted 
    opened by csaybar 1
A python package that extends Google Earth Engine.

A python package that extends Google Earth Engine GitHub: https://github.com/davemlz/eemont Documentation: https://eemont.readthedocs.io/ PyPI: https:

David Montero Loaiza 307 Jan 1, 2023
Simple CLI for Google Earth Engine Uploads

geeup: Simple CLI for Earth Engine Uploads with Selenium Support This tool came of the simple need to handle batch uploads of both image assets to col

Samapriya Roy 79 Nov 26, 2022
Get Landsat surface reflectance time-series from google earth engine

geextract Google Earth Engine data extraction tool. Quickly obtain Landsat multispectral time-series for exploratory analysis and algorithm testing On

Loïc Dutrieux 50 Dec 15, 2022
Enable geospatial data mining through Google Earth Engine in Grasshopper 3D, via its most recent Hops component.

AALU_Geo Mining This repository is produced for a masterclass at the Architectural Association Landscape Urbanism programme. Requirements Rhinoceros (

null 4 Nov 16, 2022
A Python interface between Earth Engine and xarray

eexarray A Python interface between Earth Engine and xarray Description eexarray was built to make processing gridded, mesoscale time series data quic

Aaron Zuspan 159 Dec 23, 2022
Python package for earth-observing satellite data processing

Satpy The Satpy package is a python library for reading and manipulating meteorological remote sensing data and writing it to various image and data f

PyTroll 882 Dec 27, 2022
ESMAC diags - Earth System Model Aerosol-Cloud Diagnostics Package

Earth System Model Aerosol-Cloud Diagnostics Package This Earth System Model (ES

Pacific Northwest National Laboratory 1 Jan 4, 2022
A toolbox for processing earth observation data with Python.

eo-box eobox is a Python package with a small collection of tools for working with Remote Sensing / Earth Observation data. Package Overview So far, t

null 13 Jan 6, 2022
A simple python script that, given a location and a date, uses the Nasa Earth API to show a photo taken by the Landsat 8 satellite. The script must be executed on the command-line.

What does it do? Given a location and a date, it uses the Nasa Earth API to show a photo taken by the Landsat 8 satellite. The script must be executed

Caio 42 Nov 26, 2022
Open Data Cube analyses continental scale Earth Observation data through time

Open Data Cube Core Overview The Open Data Cube Core provides an integrated gridded data analysis environment for decades of analysis ready earth obse

Open Data Cube 410 Dec 13, 2022
Digital Earth Australia notebooks and tools repository

Repository for Digital Earth Australia Jupyter Notebooks: tools and workflows for geospatial analysis with Open Data Cube and xarray

Geoscience Australia 335 Dec 24, 2022
Calculate & view the trajectory and live position of any earth-orbiting satellite

satellite-visualization A cross-platform application to calculate & view the trajectory and live position of any earth-orbiting satellite in 3D. This

Space Technology and Astronomy Cell - Open Source Society 3 Jan 8, 2022
A package to fetch sentinel 2 Satellite data from Google.

Sentinel 2 Data Fetcher Installation Create a Virtual Environment and activate it. python3 -m venv venv . venv/bin/activate Install the Package via pi

null 1 Nov 18, 2021
Google maps for Jupyter notebooks

gmaps gmaps is a plugin for including interactive Google maps in the IPython Notebook. Let's plot a heatmap of taxi pickups in San Francisco: import g

Pascal Bugnion 747 Dec 19, 2022
Replace MSFS2020's bing map to google map

English verison here 中文 免责声明 本教程提到的方法仅用于研究和学习用途。我不对使用、拓展该教程及方法所造成的任何法律责任和损失负责。 背景 微软模拟飞行2020的地景使用了Bing的卫星地图,然而卫星地图比较老旧,很多地区都是几年前的图设置直接是没有的。这种现象在全球不同地区

hesicong 272 Dec 24, 2022
Google Maps keeps old satellite imagery around for a while – this tool collects what's available for a user-specified region in the form of a GIF.

google-maps-at-88-mph The folks maintaining Google Maps regularly update the satellite imagery it serves its users, but outdated versions of the image

Noah Doersing 111 Sep 27, 2022
Location field and widget for Django. It supports Google Maps, OpenStreetMap and Mapbox

django-location-field Let users pick locations using a map widget and store its latitude and longitude. Stable version: django-location-field==2.1.0 D

Caio Ariede 481 Dec 29, 2022
Implemented a Google Maps prototype that provides the shortest route in terms of distance

Implemented a Google Maps prototype that provides the shortest route in terms of distance, the fastest route, the route with the fewest turns, and a scenic route that avoids roads when provided a source and destination. The algorithms used were DFS, BFS, A*, and Iterative Depth First Search.

null 1 Dec 26, 2021
PySAL: Python Spatial Analysis Library Meta-Package

Python Spatial Analysis Library PySAL, the Python spatial analysis library, is an open source cross-platform library for geospatial data science with

Python Spatial Analysis Library 1.1k Dec 18, 2022