cesium module¶
Cesium 3D globe widget implementation.
CesiumMap (MapWidget)
¶
Interactive 3D globe widget using Cesium.
This class provides a Python interface to Cesium for 3D globe visualization with terrain, 3D Tiles, and imagery layer support.
Examples:
>>> from anymap_ts import CesiumMap
>>> m = CesiumMap(center=[-122.4, 37.8], zoom=10)
>>> m.set_terrain() # Enable Cesium World Terrain
>>> m.add_3d_tileset(url="path/to/tileset.json")
>>> m
Source code in anymap_ts/cesium.py
class CesiumMap(MapWidget):
"""Interactive 3D globe widget using Cesium.
This class provides a Python interface to Cesium for 3D globe
visualization with terrain, 3D Tiles, and imagery layer support.
Example:
>>> from anymap_ts import CesiumMap
>>> m = CesiumMap(center=[-122.4, 37.8], zoom=10)
>>> m.set_terrain() # Enable Cesium World Terrain
>>> m.add_3d_tileset(url="path/to/tileset.json")
>>> m
"""
# ESM module for frontend
_esm = STATIC_DIR / "cesium.js"
# Cesium-specific traits
access_token = traitlets.Unicode("").tag(sync=True)
# Camera position traits
camera_height = traitlets.Float(10000000).tag(sync=True)
heading = traitlets.Float(0.0).tag(sync=True)
pitch = traitlets.Float(-90.0).tag(sync=True)
roll = traitlets.Float(0.0).tag(sync=True)
# Terrain
terrain_enabled = traitlets.Bool(False).tag(sync=True)
def __init__(
self,
center: Tuple[float, float] = (0.0, 0.0),
zoom: float = 2.0,
width: str = "100%",
height: str = "600px",
access_token: Optional[str] = None,
terrain: bool = False,
**kwargs,
):
"""Initialize a Cesium 3D globe.
Args:
center: Globe center as (longitude, latitude).
zoom: Initial zoom level (converted to camera height).
width: Widget width as CSS string.
height: Widget height as CSS string.
access_token: Cesium Ion access token (uses CESIUM_TOKEN env var if not provided).
terrain: Whether to enable terrain on initialization.
**kwargs: Additional widget arguments.
"""
# Get access token from env if not provided
if access_token is None:
access_token = get_cesium_token()
super().__init__(
center=list(center),
zoom=zoom,
width=width,
height=height,
access_token=access_token,
terrain_enabled=terrain,
**kwargs,
)
# Enable terrain if requested
if terrain:
self.set_terrain()
# -------------------------------------------------------------------------
# Basemap/Imagery Methods
# -------------------------------------------------------------------------
def add_basemap(
self,
basemap: str = "OpenStreetMap",
**kwargs,
) -> None:
"""Add a basemap imagery layer.
Args:
basemap: Name of basemap (e.g., "OpenStreetMap", "Bing").
**kwargs: Additional options.
"""
# Common basemap URLs
basemap_urls = {
"OpenStreetMap": "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
"CartoDB.Positron": "https://a.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png",
"CartoDB.DarkMatter": "https://a.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png",
"Stamen.Terrain": "https://tiles.stadiamaps.com/tiles/stamen_terrain/{z}/{x}/{y}.png",
}
url = basemap_urls.get(basemap, basemap_urls["OpenStreetMap"])
self.call_js_method("addBasemap", url, name=basemap, **kwargs)
def add_imagery_layer(
self,
url: str,
name: Optional[str] = None,
layer_type: str = "xyz",
alpha: float = 1.0,
**kwargs,
) -> None:
"""Add an imagery layer.
Args:
url: Imagery URL or service endpoint.
name: Layer name.
layer_type: Type of imagery ('xyz', 'wms', 'wmts', 'arcgis').
alpha: Layer opacity (0-1).
**kwargs: Additional options (layers, parameters for WMS, etc.).
"""
layer_id = name or f"imagery-{len(self._layers)}"
self.call_js_method(
"addImageryLayer",
url=url,
name=layer_id,
type=layer_type,
alpha=alpha,
**kwargs,
)
self._layers = {
**self._layers,
layer_id: {"id": layer_id, "type": "imagery"},
}
def remove_imagery_layer(self, name: str) -> None:
"""Remove an imagery layer.
Args:
name: Layer name to remove.
"""
if name in self._layers:
layers = dict(self._layers)
del layers[name]
self._layers = layers
self.call_js_method("removeImageryLayer", name)
# -------------------------------------------------------------------------
# Terrain Methods
# -------------------------------------------------------------------------
def set_terrain(
self,
url: Optional[str] = None,
request_vertex_normals: bool = True,
request_water_mask: bool = True,
) -> None:
"""Enable terrain.
Args:
url: Terrain provider URL. If None, uses Cesium World Terrain (requires Ion token).
request_vertex_normals: Request vertex normals for lighting.
request_water_mask: Request water mask for water effects.
"""
self.terrain_enabled = True
self.call_js_method(
"setTerrain",
url=url or "cesium-world-terrain",
requestVertexNormals=request_vertex_normals,
requestWaterMask=request_water_mask,
)
def remove_terrain(self) -> None:
"""Disable terrain and use ellipsoid."""
self.terrain_enabled = False
self.call_js_method("removeTerrain")
# -------------------------------------------------------------------------
# 3D Tiles Methods
# -------------------------------------------------------------------------
def add_3d_tileset(
self,
url: Union[str, int],
name: Optional[str] = None,
maximum_screen_space_error: float = 16,
fly_to: bool = True,
**kwargs,
) -> None:
"""Add a 3D Tileset.
Args:
url: URL to tileset.json or Cesium Ion asset ID.
name: Tileset name.
maximum_screen_space_error: Maximum screen space error for LOD.
fly_to: Whether to fly to the tileset after loading.
**kwargs: Additional options.
"""
layer_id = name or f"tileset-{len(self._layers)}"
self.call_js_method(
"add3DTileset",
url=str(url),
name=layer_id,
maximumScreenSpaceError=maximum_screen_space_error,
flyTo=fly_to,
**kwargs,
)
self._layers = {
**self._layers,
layer_id: {"id": layer_id, "type": "3dtiles"},
}
def remove_3d_tileset(self, name: str) -> None:
"""Remove a 3D Tileset.
Args:
name: Tileset name to remove.
"""
if name in self._layers:
layers = dict(self._layers)
del layers[name]
self._layers = layers
self.call_js_method("remove3DTileset", name)
# -------------------------------------------------------------------------
# GeoJSON Methods
# -------------------------------------------------------------------------
def add_geojson(
self,
data: Any,
name: Optional[str] = None,
stroke: str = "#3388ff",
stroke_width: float = 2,
fill: str = "rgba(51, 136, 255, 0.5)",
clamp_to_ground: bool = True,
fly_to: bool = True,
**kwargs,
) -> None:
"""Add GeoJSON data.
Args:
data: GeoJSON dict or file path.
name: Data source name.
stroke: Stroke color.
stroke_width: Stroke width.
fill: Fill color.
clamp_to_ground: Whether to clamp features to terrain.
fly_to: Whether to fly to the data after loading.
**kwargs: Additional options.
"""
geojson = to_geojson(data)
layer_id = name or f"geojson-{len(self._layers)}"
self.call_js_method(
"addGeoJSON",
data=geojson,
name=layer_id,
stroke=stroke,
strokeWidth=stroke_width,
fill=fill,
clampToGround=clamp_to_ground,
flyTo=fly_to,
**kwargs,
)
self._layers = {
**self._layers,
layer_id: {"id": layer_id, "type": "geojson"},
}
def remove_data_source(self, name: str) -> None:
"""Remove a data source (GeoJSON, etc.).
Args:
name: Data source name to remove.
"""
if name in self._layers:
layers = dict(self._layers)
del layers[name]
self._layers = layers
self.call_js_method("removeDataSource", name)
# -------------------------------------------------------------------------
# Camera Methods
# -------------------------------------------------------------------------
def fly_to(
self,
lng: float,
lat: float,
height: Optional[float] = None,
zoom: Optional[float] = None,
heading: float = 0,
pitch: float = -90,
roll: float = 0,
duration: float = 2,
) -> None:
"""Fly to a location.
Args:
lng: Target longitude.
lat: Target latitude.
height: Camera height in meters (overrides zoom).
zoom: Zoom level (converted to height if height not provided).
heading: Camera heading in degrees.
pitch: Camera pitch in degrees (default -90 = looking down).
roll: Camera roll in degrees.
duration: Flight duration in seconds.
"""
self.call_js_method(
"flyTo",
lng,
lat,
height=height,
zoom=zoom,
heading=heading,
pitch=pitch,
roll=roll,
duration=duration,
)
def zoom_to(self, target: str) -> None:
"""Zoom to a layer or data source.
Args:
target: Name of the layer or data source to zoom to.
"""
self.call_js_method("zoomTo", target=target)
def set_camera(
self,
longitude: float = 0,
latitude: float = 0,
height: float = 10000000,
heading: float = 0,
pitch: float = -90,
roll: float = 0,
) -> None:
"""Set the camera position immediately (no animation).
Args:
longitude: Camera longitude.
latitude: Camera latitude.
height: Camera height in meters.
heading: Camera heading in degrees.
pitch: Camera pitch in degrees.
roll: Camera roll in degrees.
"""
self.call_js_method(
"setCamera",
longitude=longitude,
latitude=latitude,
height=height,
heading=heading,
pitch=pitch,
roll=roll,
)
def reset_view(self, duration: float = 2) -> None:
"""Reset camera to home position.
Args:
duration: Animation duration in seconds.
"""
self.call_js_method("resetView", duration=duration)
# -------------------------------------------------------------------------
# Layer Management
# -------------------------------------------------------------------------
def set_visibility(self, name: str, visible: bool) -> None:
"""Set layer visibility.
Args:
name: Layer name.
visible: Whether layer should be visible.
"""
self.call_js_method("setVisibility", name, visible)
def set_opacity(self, name: str, opacity: float) -> None:
"""Set layer opacity (imagery layers only).
Args:
name: Layer name.
opacity: Opacity value (0-1).
"""
self.call_js_method("setOpacity", name, opacity)
# -------------------------------------------------------------------------
# HTML Export
# -------------------------------------------------------------------------
def _generate_html_template(self) -> str:
"""Generate standalone HTML for the globe."""
template_path = Path(__file__).parent / "templates" / "cesium.html"
if template_path.exists():
template = template_path.read_text(encoding="utf-8")
else:
template = self._get_default_template()
state = {
"center": self.center,
"zoom": self.zoom,
"access_token": self.access_token,
"terrain_enabled": self.terrain_enabled,
"width": self.width,
"height": self.height,
"layers": self._layers,
"js_calls": self._js_calls,
}
template = template.replace("{{state}}", json.dumps(state, indent=2))
template = template.replace("{{access_token}}", self.access_token)
return template
def _get_default_template(self) -> str:
"""Get default HTML template."""
return """<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Cesium Globe</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://cesium.com/downloads/cesiumjs/releases/1.120/Build/Cesium/Cesium.js"></script>
<link href="https://cesium.com/downloads/cesiumjs/releases/1.120/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
html, body { height: 100%; }
#cesiumContainer { position: absolute; top: 0; bottom: 0; width: 100%; }
</style>
</head>
<body>
<div id="cesiumContainer"></div>
<script>
const state = {{state}};
if (state.access_token) {
Cesium.Ion.defaultAccessToken = state.access_token;
}
const viewer = new Cesium.Viewer('cesiumContainer', {
baseLayerPicker: false,
geocoder: false,
homeButton: false,
sceneModePicker: false,
navigationHelpButton: false,
animation: false,
timeline: false
});
for (const call of state.js_calls || []) {
executeMethod(call.method, call.args, call.kwargs);
}
function executeMethod(method, args, kwargs) {
console.log('Executing:', method, args, kwargs);
}
</script>
</body>
</html>"""
__init__(self, center=(0.0, 0.0), zoom=2.0, width='100%', height='600px', access_token=None, terrain=False, **kwargs)
special
¶
Initialize a Cesium 3D globe.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
center |
Tuple[float, float] |
Globe center as (longitude, latitude). |
(0.0, 0.0) |
zoom |
float |
Initial zoom level (converted to camera height). |
2.0 |
width |
str |
Widget width as CSS string. |
'100%' |
height |
str |
Widget height as CSS string. |
'600px' |
access_token |
Optional[str] |
Cesium Ion access token (uses CESIUM_TOKEN env var if not provided). |
None |
terrain |
bool |
Whether to enable terrain on initialization. |
False |
**kwargs |
Additional widget arguments. |
{} |
Source code in anymap_ts/cesium.py
def __init__(
self,
center: Tuple[float, float] = (0.0, 0.0),
zoom: float = 2.0,
width: str = "100%",
height: str = "600px",
access_token: Optional[str] = None,
terrain: bool = False,
**kwargs,
):
"""Initialize a Cesium 3D globe.
Args:
center: Globe center as (longitude, latitude).
zoom: Initial zoom level (converted to camera height).
width: Widget width as CSS string.
height: Widget height as CSS string.
access_token: Cesium Ion access token (uses CESIUM_TOKEN env var if not provided).
terrain: Whether to enable terrain on initialization.
**kwargs: Additional widget arguments.
"""
# Get access token from env if not provided
if access_token is None:
access_token = get_cesium_token()
super().__init__(
center=list(center),
zoom=zoom,
width=width,
height=height,
access_token=access_token,
terrain_enabled=terrain,
**kwargs,
)
# Enable terrain if requested
if terrain:
self.set_terrain()
add_3d_tileset(self, url, name=None, maximum_screen_space_error=16, fly_to=True, **kwargs)
¶
Add a 3D Tileset.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
url |
Union[str, int] |
URL to tileset.json or Cesium Ion asset ID. |
required |
name |
Optional[str] |
Tileset name. |
None |
maximum_screen_space_error |
float |
Maximum screen space error for LOD. |
16 |
fly_to |
bool |
Whether to fly to the tileset after loading. |
True |
**kwargs |
Additional options. |
{} |
Source code in anymap_ts/cesium.py
def add_3d_tileset(
self,
url: Union[str, int],
name: Optional[str] = None,
maximum_screen_space_error: float = 16,
fly_to: bool = True,
**kwargs,
) -> None:
"""Add a 3D Tileset.
Args:
url: URL to tileset.json or Cesium Ion asset ID.
name: Tileset name.
maximum_screen_space_error: Maximum screen space error for LOD.
fly_to: Whether to fly to the tileset after loading.
**kwargs: Additional options.
"""
layer_id = name or f"tileset-{len(self._layers)}"
self.call_js_method(
"add3DTileset",
url=str(url),
name=layer_id,
maximumScreenSpaceError=maximum_screen_space_error,
flyTo=fly_to,
**kwargs,
)
self._layers = {
**self._layers,
layer_id: {"id": layer_id, "type": "3dtiles"},
}
add_basemap(self, basemap='OpenStreetMap', **kwargs)
¶
Add a basemap imagery layer.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
basemap |
str |
Name of basemap (e.g., "OpenStreetMap", "Bing"). |
'OpenStreetMap' |
**kwargs |
Additional options. |
{} |
Source code in anymap_ts/cesium.py
def add_basemap(
self,
basemap: str = "OpenStreetMap",
**kwargs,
) -> None:
"""Add a basemap imagery layer.
Args:
basemap: Name of basemap (e.g., "OpenStreetMap", "Bing").
**kwargs: Additional options.
"""
# Common basemap URLs
basemap_urls = {
"OpenStreetMap": "https://tile.openstreetmap.org/{z}/{x}/{y}.png",
"CartoDB.Positron": "https://a.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png",
"CartoDB.DarkMatter": "https://a.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}.png",
"Stamen.Terrain": "https://tiles.stadiamaps.com/tiles/stamen_terrain/{z}/{x}/{y}.png",
}
url = basemap_urls.get(basemap, basemap_urls["OpenStreetMap"])
self.call_js_method("addBasemap", url, name=basemap, **kwargs)
add_geojson(self, data, name=None, stroke='#3388ff', stroke_width=2, fill='rgba(51, 136, 255, 0.5)', clamp_to_ground=True, fly_to=True, **kwargs)
¶
Add GeoJSON data.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
data |
Any |
GeoJSON dict or file path. |
required |
name |
Optional[str] |
Data source name. |
None |
stroke |
str |
Stroke color. |
'#3388ff' |
stroke_width |
float |
Stroke width. |
2 |
fill |
str |
Fill color. |
'rgba(51, 136, 255, 0.5)' |
clamp_to_ground |
bool |
Whether to clamp features to terrain. |
True |
fly_to |
bool |
Whether to fly to the data after loading. |
True |
**kwargs |
Additional options. |
{} |
Source code in anymap_ts/cesium.py
def add_geojson(
self,
data: Any,
name: Optional[str] = None,
stroke: str = "#3388ff",
stroke_width: float = 2,
fill: str = "rgba(51, 136, 255, 0.5)",
clamp_to_ground: bool = True,
fly_to: bool = True,
**kwargs,
) -> None:
"""Add GeoJSON data.
Args:
data: GeoJSON dict or file path.
name: Data source name.
stroke: Stroke color.
stroke_width: Stroke width.
fill: Fill color.
clamp_to_ground: Whether to clamp features to terrain.
fly_to: Whether to fly to the data after loading.
**kwargs: Additional options.
"""
geojson = to_geojson(data)
layer_id = name or f"geojson-{len(self._layers)}"
self.call_js_method(
"addGeoJSON",
data=geojson,
name=layer_id,
stroke=stroke,
strokeWidth=stroke_width,
fill=fill,
clampToGround=clamp_to_ground,
flyTo=fly_to,
**kwargs,
)
self._layers = {
**self._layers,
layer_id: {"id": layer_id, "type": "geojson"},
}
add_imagery_layer(self, url, name=None, layer_type='xyz', alpha=1.0, **kwargs)
¶
Add an imagery layer.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
url |
str |
Imagery URL or service endpoint. |
required |
name |
Optional[str] |
Layer name. |
None |
layer_type |
str |
Type of imagery ('xyz', 'wms', 'wmts', 'arcgis'). |
'xyz' |
alpha |
float |
Layer opacity (0-1). |
1.0 |
**kwargs |
Additional options (layers, parameters for WMS, etc.). |
{} |
Source code in anymap_ts/cesium.py
def add_imagery_layer(
self,
url: str,
name: Optional[str] = None,
layer_type: str = "xyz",
alpha: float = 1.0,
**kwargs,
) -> None:
"""Add an imagery layer.
Args:
url: Imagery URL or service endpoint.
name: Layer name.
layer_type: Type of imagery ('xyz', 'wms', 'wmts', 'arcgis').
alpha: Layer opacity (0-1).
**kwargs: Additional options (layers, parameters for WMS, etc.).
"""
layer_id = name or f"imagery-{len(self._layers)}"
self.call_js_method(
"addImageryLayer",
url=url,
name=layer_id,
type=layer_type,
alpha=alpha,
**kwargs,
)
self._layers = {
**self._layers,
layer_id: {"id": layer_id, "type": "imagery"},
}
fly_to(self, lng, lat, height=None, zoom=None, heading=0, pitch=-90, roll=0, duration=2)
¶
Fly to a location.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
lng |
float |
Target longitude. |
required |
lat |
float |
Target latitude. |
required |
height |
Optional[float] |
Camera height in meters (overrides zoom). |
None |
zoom |
Optional[float] |
Zoom level (converted to height if height not provided). |
None |
heading |
float |
Camera heading in degrees. |
0 |
pitch |
float |
Camera pitch in degrees (default -90 = looking down). |
-90 |
roll |
float |
Camera roll in degrees. |
0 |
duration |
float |
Flight duration in seconds. |
2 |
Source code in anymap_ts/cesium.py
def fly_to(
self,
lng: float,
lat: float,
height: Optional[float] = None,
zoom: Optional[float] = None,
heading: float = 0,
pitch: float = -90,
roll: float = 0,
duration: float = 2,
) -> None:
"""Fly to a location.
Args:
lng: Target longitude.
lat: Target latitude.
height: Camera height in meters (overrides zoom).
zoom: Zoom level (converted to height if height not provided).
heading: Camera heading in degrees.
pitch: Camera pitch in degrees (default -90 = looking down).
roll: Camera roll in degrees.
duration: Flight duration in seconds.
"""
self.call_js_method(
"flyTo",
lng,
lat,
height=height,
zoom=zoom,
heading=heading,
pitch=pitch,
roll=roll,
duration=duration,
)
remove_3d_tileset(self, name)
¶
Remove a 3D Tileset.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name |
str |
Tileset name to remove. |
required |
Source code in anymap_ts/cesium.py
def remove_3d_tileset(self, name: str) -> None:
"""Remove a 3D Tileset.
Args:
name: Tileset name to remove.
"""
if name in self._layers:
layers = dict(self._layers)
del layers[name]
self._layers = layers
self.call_js_method("remove3DTileset", name)
remove_data_source(self, name)
¶
Remove a data source (GeoJSON, etc.).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name |
str |
Data source name to remove. |
required |
Source code in anymap_ts/cesium.py
def remove_data_source(self, name: str) -> None:
"""Remove a data source (GeoJSON, etc.).
Args:
name: Data source name to remove.
"""
if name in self._layers:
layers = dict(self._layers)
del layers[name]
self._layers = layers
self.call_js_method("removeDataSource", name)
remove_imagery_layer(self, name)
¶
Remove an imagery layer.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name |
str |
Layer name to remove. |
required |
Source code in anymap_ts/cesium.py
def remove_imagery_layer(self, name: str) -> None:
"""Remove an imagery layer.
Args:
name: Layer name to remove.
"""
if name in self._layers:
layers = dict(self._layers)
del layers[name]
self._layers = layers
self.call_js_method("removeImageryLayer", name)
remove_terrain(self)
¶
Disable terrain and use ellipsoid.
Source code in anymap_ts/cesium.py
def remove_terrain(self) -> None:
"""Disable terrain and use ellipsoid."""
self.terrain_enabled = False
self.call_js_method("removeTerrain")
reset_view(self, duration=2)
¶
Reset camera to home position.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
duration |
float |
Animation duration in seconds. |
2 |
Source code in anymap_ts/cesium.py
def reset_view(self, duration: float = 2) -> None:
"""Reset camera to home position.
Args:
duration: Animation duration in seconds.
"""
self.call_js_method("resetView", duration=duration)
set_camera(self, longitude=0, latitude=0, height=10000000, heading=0, pitch=-90, roll=0)
¶
Set the camera position immediately (no animation).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
longitude |
float |
Camera longitude. |
0 |
latitude |
float |
Camera latitude. |
0 |
height |
float |
Camera height in meters. |
10000000 |
heading |
float |
Camera heading in degrees. |
0 |
pitch |
float |
Camera pitch in degrees. |
-90 |
roll |
float |
Camera roll in degrees. |
0 |
Source code in anymap_ts/cesium.py
def set_camera(
self,
longitude: float = 0,
latitude: float = 0,
height: float = 10000000,
heading: float = 0,
pitch: float = -90,
roll: float = 0,
) -> None:
"""Set the camera position immediately (no animation).
Args:
longitude: Camera longitude.
latitude: Camera latitude.
height: Camera height in meters.
heading: Camera heading in degrees.
pitch: Camera pitch in degrees.
roll: Camera roll in degrees.
"""
self.call_js_method(
"setCamera",
longitude=longitude,
latitude=latitude,
height=height,
heading=heading,
pitch=pitch,
roll=roll,
)
set_opacity(self, name, opacity)
¶
Set layer opacity (imagery layers only).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name |
str |
Layer name. |
required |
opacity |
float |
Opacity value (0-1). |
required |
Source code in anymap_ts/cesium.py
def set_opacity(self, name: str, opacity: float) -> None:
"""Set layer opacity (imagery layers only).
Args:
name: Layer name.
opacity: Opacity value (0-1).
"""
self.call_js_method("setOpacity", name, opacity)
set_terrain(self, url=None, request_vertex_normals=True, request_water_mask=True)
¶
Enable terrain.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
url |
Optional[str] |
Terrain provider URL. If None, uses Cesium World Terrain (requires Ion token). |
None |
request_vertex_normals |
bool |
Request vertex normals for lighting. |
True |
request_water_mask |
bool |
Request water mask for water effects. |
True |
Source code in anymap_ts/cesium.py
def set_terrain(
self,
url: Optional[str] = None,
request_vertex_normals: bool = True,
request_water_mask: bool = True,
) -> None:
"""Enable terrain.
Args:
url: Terrain provider URL. If None, uses Cesium World Terrain (requires Ion token).
request_vertex_normals: Request vertex normals for lighting.
request_water_mask: Request water mask for water effects.
"""
self.terrain_enabled = True
self.call_js_method(
"setTerrain",
url=url or "cesium-world-terrain",
requestVertexNormals=request_vertex_normals,
requestWaterMask=request_water_mask,
)
set_visibility(self, name, visible)
¶
Set layer visibility.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name |
str |
Layer name. |
required |
visible |
bool |
Whether layer should be visible. |
required |
Source code in anymap_ts/cesium.py
def set_visibility(self, name: str, visible: bool) -> None:
"""Set layer visibility.
Args:
name: Layer name.
visible: Whether layer should be visible.
"""
self.call_js_method("setVisibility", name, visible)
zoom_to(self, target)
¶
Zoom to a layer or data source.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
target |
str |
Name of the layer or data source to zoom to. |
required |
Source code in anymap_ts/cesium.py
def zoom_to(self, target: str) -> None:
"""Zoom to a layer or data source.
Args:
target: Name of the layer or data source to zoom to.
"""
self.call_js_method("zoomTo", target=target)
get_cesium_token()
¶
Get Cesium Ion access token from environment variable.
Returns:
| Type | Description |
|---|---|
str |
Cesium Ion access token or empty string if not set. |
Source code in anymap_ts/cesium.py
def get_cesium_token() -> str:
"""Get Cesium Ion access token from environment variable.
Returns:
Cesium Ion access token or empty string if not set.
"""
return os.environ.get("CESIUM_TOKEN", "")