utils module¶
ee_initialize(token_name='EARTHENGINE_TOKEN')
¶
Authenticates Earth Engine and initialize an Earth Engine session
Parameters:
Name | Type | Description | Default |
---|---|---|---|
token_name |
str |
The token name of the github environment. Defaults to "EARTHENGINE_TOKEN". |
'EARTHENGINE_TOKEN' |
Source code in geohmt/utils.py
def ee_initialize(token_name="EARTHENGINE_TOKEN"):
"""Authenticates Earth Engine and initialize an Earth Engine session
Args:
token_name (str, optional): The token name of the github environment. Defaults to "EARTHENGINE_TOKEN".
"""
import ee
import os
if ee.data._credentials is None:
try:
ee_token = os.environ.get(token_name)
if ee_token is not None:
credential_file_path = os.path.expanduser(
"~/.config/earthengine/credentials"
)
if not os.path.exists(credential_file_path):
os.makedirs(
os.path.dirname(credential_file_path), exist_ok=True)
if ee_token.startswith("{") and ee_token.endswith("}"
): # deals with token generated by new auth method (earthengine-api>=0.1.304).
token_dict = json.loads(ee_token)
with open(credential_file_path, "w") as f:
f.write(json.dumps(token_dict))
ee.Initialize()
except Exception:
ee.Authenticate()
ee.Initialize()
ee_tile_layer(ee_object, vis_params={}, name='ee layer untitled', shown=True, opacity=1.0)
¶
Converts Earth Engine layer to ipleaflet Tilelayer.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
ee_object |
Collection|Feature|Image|MapId |
The Earth Engine object. |
required |
vis_params |
dict |
The visualization parameters. Defaults to {}. |
{} |
name |
str |
The name of the layer. Defaults to "Layer untitled". |
'ee layer untitled' |
shown |
bool |
A flag indicating whether the layer should be on by default. Defaults to True. |
True |
opacity |
float |
The layer's opacity represented as a number between 0 and 1. Defaults to 1.0. |
1.0 |
Exceptions:
Type | Description |
---|---|
AttributeError |
description |
Returns:
Type | Description |
---|---|
_type_ |
description |
Source code in geohmt/utils.py
def ee_tile_layer(
ee_object, vis_params={}, name="ee layer untitled", shown=True, opacity=1.0
):
"""Converts Earth Engine layer to ipleaflet Tilelayer.
Args:
ee_object (Collection|Feature|Image|MapId): The Earth Engine object.
vis_params (dict, optional): The visualization parameters. Defaults to {}.
name (str, optional): The name of the layer. Defaults to "Layer untitled".
shown (bool, optional): A flag indicating whether the layer should be on by default. Defaults to True.
opacity (float, optional): The layer's opacity represented as a number between 0 and 1. Defaults to 1.0.
Raises:
AttributeError: _description_
Returns:
_type_: _description_
"""
import ee
from ipyleaflet import TileLayer
image = None
if vis_params is None:
vis_params = {}
if (
not isinstance(ee_object, ee.Image)
and not isinstance(ee_object, ee.ImageCollection)
and not isinstance(ee_object, ee.FeatureCollection)
and not isinstance(ee_object, ee.Feature)
and not isinstance(ee_object, ee.Geometry)
):
err_str = "\n\nThe image argument in 'addLayer' function must be an instace of one of ee.Image, ee.Geometry, ee.Feature or ee.FeatureCollection."
raise AttributeError(err_str)
if (
isinstance(ee_object, ee.geometry.Geometry)
or isinstance(ee_object, ee.feature.Feature)
or isinstance(ee_object, ee.featurecollection.FeatureCollection)
):
features = ee.FeatureCollection(ee_object)
width = 2
if "width" in vis_params:
width = vis_params["width"]
color = "000000"
if "color" in vis_params:
color = vis_params["color"]
image_fill = features.style(**{"fillColor": color}).updateMask(
ee.Image.constant(0.5)
)
image_outline = features.style(
**{"color": color, "fillColor": "00000000", "width": width}
)
image = image_fill.blend(image_outline)
elif isinstance(ee_object, ee.image.Image):
image = ee_object
elif isinstance(ee_object, ee.imagecollection.ImageCollection):
image = ee_object.mosaic()
map_id_dict = ee.Image(image).getMapId(vis_params)
tile_layer = TileLayer(
url=map_id_dict["tile_fetcher"].url_format,
attribution="Google Earth Engine",
name=name,
opacity=opacity,
visible=shown,
)
return tile_layer
geocode(location, max_rows=10, reverse=False)
¶
Search location by address and lat/lon coordinates.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
location |
str |
Place name or address |
required |
max_rows |
int |
Maximum number of records to return. Defaults to 10. |
10 |
reverse |
bool |
Search place based on coordinates. Defaults to False. |
False |
Returns:
Type | Description |
---|---|
list |
Returns a list of locations. |
Source code in geohmt/utils.py
def geocode(location, max_rows=10, reverse=False):
"""Search location by address and lat/lon coordinates.
Args:
location (str): Place name or address
max_rows (int, optional): Maximum number of records to return. Defaults to 10.
reverse (bool, optional): Search place based on coordinates. Defaults to False.
Returns:
list: Returns a list of locations.
"""
import geocoder
if not isinstance(location, str):
print("The location must be a string.")
return None
if not reverse:
locations = []
addresses = set()
g = geocoder.arcgis(location, maxRows=max_rows)
for result in g:
address = result.address
if address not in addresses:
addresses.add(address)
locations.append(result)
if len(locations) > 0:
return locations
else:
return None
else:
try:
if "," in location:
latlon = [float(x) for x in location.split(",")]
elif " " in location:
latlon = [float(x) for x in location.split(" ")]
else:
print(
"The lat-lon coordinates should be numbers only and separated by comma or space, such as 40.2, -100.3"
)
return
g = geocoder.arcgis(latlon, method="reverse")
locations = []
addresses = set()
for result in g:
address = result.address
if address not in addresses:
addresses.add(address)
locations.append(result)
if len(locations) > 0:
return locations
else:
return None
except Exception as e:
print(e)
return None
random_string(string_length=3, seed=False)
¶
Generates a random string of fixed length.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
string_length |
int |
Fixed length. Defaults to 3. |
3 |
seed |
bool |
Weather uses seed. Defaults to False. |
False |
Returns:
Type | Description |
---|---|
_type_ |
A random string |
Source code in geohmt/utils.py
def random_string(string_length=3,seed = False):
"""Generates a random string of fixed length.
Args:
string_length (int, optional): Fixed length. Defaults to 3.
seed (bool, optional): Weather uses seed. Defaults to False.
Returns:
_type_: A random string
"""
import random
import string
if seed:
random.seed(1)
letters = string.ascii_lowercase
return "".join(random.choice(letters) for i in range(string_length))
shp_to_geojson(shp, savefile=None)
¶
Converts a shapefile to GeoJSON.
Parameters:
Name | Type | Description | Default |
---|---|---|---|
shp |
str |
The file path to the input shapefile. |
required |
savefile |
str |
the file path to the output GeoJSoN. Defaults to None. |
None |
Exceptions:
Type | Description |
---|---|
FileNotFoundError |
If the input shapefile does not exist. |
Returns:
Type | Description |
---|---|
dict |
the dictionary of the GeoJSON. |
Source code in geohmt/utils.py
def shp_to_geojson(shp,savefile=None):
"""Converts a shapefile to GeoJSON.
Args:
shp (str): The file path to the input shapefile.
savefile (str, optional): the file path to the output GeoJSoN. Defaults to None.
Raises:
FileNotFoundError: If the input shapefile does not exist.
Returns:
dict: the dictionary of the GeoJSON.
"""
import json
import shapefile
shp = os.path.abspath(shp)
if not os.path.exists(shp):
raise FileNotFoundError("Shapefile file could not be found.")
shp_obj = shapefile.Reader(shp)
geojson = shp_obj.__geo_interface__
if savefile is None:
return geojson
else:
savefile = os.path.abspath(savefile)
out_dir = os.path.dirname(savefile)
if not os.path.exists(out_dir):
os.makedirs(out_dir)
with open(savefile,"w") as f:
f.write(json.dumps(geojson))