|  | 
| 6 | 6 | 
 | 
| 7 | 7 | import json | 
| 8 | 8 | from textwrap import dedent | 
| 9 |  | -from typing import TYPE_CHECKING, Any, Protocol, TypeAlias, cast | 
|  | 9 | +from typing import TYPE_CHECKING, Any, Literal, Protocol, TypeAlias, cast | 
| 10 | 10 | 
 | 
| 11 | 11 | import numpy as np | 
| 12 | 12 | from arro3.core import Array, ChunkedArray, Schema, Table, struct_field | 
|  | 
| 26 | 26 | ) | 
| 27 | 27 | from lonboard.basemap import CartoStyle, MaplibreBasemap | 
| 28 | 28 | from lonboard.layer import PathLayer, PolygonLayer, ScatterplotLayer | 
|  | 29 | +from lonboard.view import BaseView, GlobeView | 
| 29 | 30 | 
 | 
| 30 | 31 | if TYPE_CHECKING: | 
| 31 | 32 |  import duckdb | 
| @@ -81,13 +82,14 @@ def __geo_interface__(self) -> dict: ... | 
| 81 | 82 | DEFAULT_POLYGON_LINE_COLOR = [0, 0, 0, 200] | 
| 82 | 83 | 
 | 
| 83 | 84 | 
 | 
| 84 |  | -def viz( | 
|  | 85 | +def viz(# noqa: PLR0913 | 
| 85 | 86 |  data: VizDataInput | list[VizDataInput] | tuple[VizDataInput, ...], | 
| 86 | 87 |  *, | 
| 87 | 88 |  scatterplot_kwargs: ScatterplotLayerKwargs | None = None, | 
| 88 | 89 |  path_kwargs: PathLayerKwargs | None = None, | 
| 89 | 90 |  polygon_kwargs: PolygonLayerKwargs | None = None, | 
| 90 | 91 |  map_kwargs: MapKwargs | None = None, | 
|  | 92 | + view: BaseView | Literal["globe"] | None = None, | 
| 91 | 93 | ) -> Map: | 
| 92 | 94 |  """Plot your data easily. | 
| 93 | 95 |  | 
| @@ -165,6 +167,7 @@ def viz( | 
| 165 | 167 |  [`PolygonLayer`][lonboard.PolygonLayer]s. | 
| 166 | 168 |  map_kwargs: a `dict` of parameters to pass down to the generated | 
| 167 | 169 |  [`Map`][lonboard.Map]. | 
|  | 170 | + view: a [view instance][lonboard.view.BaseView] to use for the map view, or the string "globe". | 
| 168 | 171 |  | 
| 169 | 172 |  For more control over rendering, construct [`Map`][lonboard.Map] and `Layer` objects | 
| 170 | 173 |  directly. | 
| @@ -200,8 +203,26 @@ def viz( | 
| 200 | 203 | 
 | 
| 201 | 204 |  map_kwargs = map_kwargs if map_kwargs else {} | 
| 202 | 205 | 
 | 
|  | 206 | + if "view" not in map_kwargs and view is not None: | 
|  | 207 | + if view == "globe": | 
|  | 208 | + map_kwargs["view"] = GlobeView() | 
|  | 209 | + else: | 
|  | 210 | + map_kwargs["view"] = view | 
|  | 211 | + | 
| 203 | 212 |  if "basemap_style" not in map_kwargs and "basemap" not in map_kwargs: | 
| 204 |  | - map_kwargs["basemap"] = MaplibreBasemap(style=CartoStyle.DarkMatter) | 
|  | 213 | + map_kwargs["basemap"] = MaplibreBasemap( | 
|  | 214 | + mode="interleaved", | 
|  | 215 | + style=CartoStyle.DarkMatter, | 
|  | 216 | + ) | 
|  | 217 | + | 
|  | 218 | + # If we're using a known style that has labels, set layers to be below labels | 
|  | 219 | + if map_kwargs["basemap"].style in [ | 
|  | 220 | + CartoStyle.DarkMatter, | 
|  | 221 | + CartoStyle.Positron, | 
|  | 222 | + CartoStyle.Voyager, | 
|  | 223 | + ]: | 
|  | 224 | + for layer in layers: | 
|  | 225 | + layer.before_id = "watername_ocean" | 
| 205 | 226 | 
 | 
| 206 | 227 |  return Map(layers=layers, **map_kwargs) | 
| 207 | 228 | 
 | 
|  | 
0 commit comments