Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Google map tiles #1963

Merged
merged 24 commits into from
May 25, 2024
Merged
Changes from 3 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
1178d02
Add Google map tiles
giswqs Apr 6, 2024
bd2eb91
Merge branch 'master' into gmaps
giswqs Apr 6, 2024
6a5439c
Merge branch 'master' into gmaps
giswqs Apr 8, 2024
7b49809
Remove googlemaps dependency
giswqs Apr 10, 2024
b5a2f13
Fix name and attribution
giswqs Apr 10, 2024
9c5e909
Add name variations
giswqs Apr 10, 2024
4e5f2a5
Merge branch 'master' into gmaps
giswqs Apr 10, 2024
0ad6584
Add Google map tiles to basemap list
giswqs Apr 11, 2024
e84d7f3
Merge branch 'master' into gmaps
giswqs Apr 16, 2024
ee32852
Add support for returning all map types as a dict
giswqs Apr 17, 2024
7c598e4
Use Google Roadmap by default if API Key is available
giswqs Apr 17, 2024
ad98061
Make gmap tiles available in core module
giswqs Apr 17, 2024
9ecd29d
Fix docs build error
giswqs Apr 17, 2024
a8dfafa
Remove Google Traffic and Streetview
giswqs Apr 29, 2024
88d6c86
Merge branch 'master' into gmaps
giswqs Apr 29, 2024
27ed73f
Set line wrap for docstrings
giswqs Apr 29, 2024
afa285d
Improve google_maps_api_key function
giswqs Apr 29, 2024
1238292
Merge branch 'master' into gmaps
giswqs May 7, 2024
047a0ce
Add GoogleMapsTileProvider class
giswqs May 7, 2024
9c0397e
Add backward compatibility for map alias
giswqs May 7, 2024
88e53f1
Fix add_basemap Google tiles issue
giswqs May 7, 2024
a555ac1
Reduce dependencies on hardcoded map name prefixes
naschmitz May 24, 2024
fe2689d
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] May 24, 2024
02a3639
Allow basemap as a string
giswqs May 25, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
117 changes: 116 additions & 1 deletion geemap/common.py
giswqs marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
import ee
import ipywidgets as widgets
from ipytree import Node, Tree
from typing import Union, List, Dict, Optional, Tuple
from typing import Union, List, Dict, Optional, Tuple, Any

try:
from IPython.display import display, IFrame, Javascript
Expand Down Expand Up @@ -16158,3 +16158,118 @@ def is_on_aws():
if item.endswith(".aws") or "ec2-user" in item:
on_aws = True
return on_aws


def google_map_tiles(
jdbcode marked this conversation as resolved.
Show resolved Hide resolved
giswqs marked this conversation as resolved.
Show resolved Hide resolved
map_type: str = "roadmap",
language: str = "en-Us",
region: str = "US",
api_key: Optional[str] = None,
**kwargs: Any,
):
"""
Generates Google Map tiles using the provided parameters. To get an API key and enable Map Tiles API, visit https://developers.google.com/maps/get-started#create-project

Args:
map_type (str, optional): The type of map to generate. Options are 'roadmap', 'satellite', 'terrain', 'hybrid', 'traffic', 'streetview'. Defaults to 'roadmap'.
language (str, optional): An IETF language tag that specifies the language used to display information on the tiles, such as 'zh-Cn'. Defaults to 'en-Us'.
region (str, optional): A Common Locale Data Repository region identifier (two uppercase letters) that represents the physical location of the user. Defaults to 'US'.
api_key (str, optional): The API key to use for the Google Maps API. If not provided, it will try to get it from the environment or Colab user data. Defaults to None.
**kwargs: Additional parameters to pass to the map generation. For more info, visit https://developers.google.com/maps/documentation/tile/session_tokens#optional_fields

giswqs marked this conversation as resolved.
Show resolved Hide resolved
Raises:
ValueError: If the API key is not provided and cannot be found in the environment or Colab user data.
ValueError: If the map_type is not one of the allowed types.

Example:
>>> import geemap
>>> m = geemap.Map()
>>> basemap = google_map_tiles(map_type='roadmap', language="en-Us", region="US", scale="scaleFactor2x", highDpi=True)
>>> m.add_basemap(basemap)

Returns:
TileProvider: A TileProvider object with the generated map, or None if the map could not be generated.
"""
try:
import googlemaps
except ImportError:
install_package("googlemaps")
import googlemaps

from xyzservices import TileProvider

if api_key is None:
giswqs marked this conversation as resolved.
Show resolved Hide resolved

if in_colab_shell():
from google.colab import userdata

api_key = userdata.get("MAPS_API_KEY")
else:
api_key = os.environ.get("MAPS_API_KEY")

if api_key is None:
raise ValueError(
"API key is required to access Google Maps API. To get an API key and enable Map Tiles API, visit https://developers.google.com/maps/get-started#create-project"
)

gmaps = googlemaps.Client(key=api_key)

map_type = map_type.lower()
if map_type not in [
"roadmap",
"satellite",
"terrain",
"hybrid",
"traffic",
"streetview",
]:
raise ValueError(
"mapType must be one of 'roadmap', 'satellite', 'terrain', 'hybrid', 'traffic', 'streetview'"
)

if map_type == "hybrid":
map_type = "satellite"
if "layerTypes" not in kwargs:
kwargs["layerTypes"] = ["layerRoadmap"]

if map_type == "terrain":
if "layerTypes" not in kwargs:
kwargs["layerTypes"] = ["layerRoadmap"]

if map_type == "traffic":
map_type = "roadmap"
if "layerTypes" not in kwargs:
kwargs["layerTypes"] = ["layerTraffic"]

if map_type == "streetview":
map_type = "roadmap"
if "layerTypes" not in kwargs:
kwargs["layerTypes"] = ["layerStreetview"]

kwargs["mapType"] = map_type
kwargs["language"] = language
kwargs["region"] = region

response = requests.post(
f"https://tile.googleapis.com/v1/createSession?key={api_key}",
headers={"Content-Type": "application/json"},
json=kwargs,
)

if response.status_code == 200:
res = response.json()
gmap_provider = TileProvider(
{
"url": f"https://tile.googleapis.com/v1/2dtiles/{{z}}/{{x}}/{{y}}?session={res['session']}&key={{accessToken}}",
"attribution": "© Google Maps",
giswqs marked this conversation as resolved.
Show resolved Hide resolved
"accessToken": api_key,
"name": "Google Maps",
giswqs marked this conversation as resolved.
Show resolved Hide resolved
"ext": res["imageFormat"],
"tileSize": res["tileWidth"],
}
)
else:
display(response.text)
gmap_provider = None

return gmap_provider