Skip to content

Commit 482c2ba

Browse files
authored
docs: Release post for 0.13 (#1036)
1 parent cf2c5fe commit 482c2ba

File tree

10 files changed

+268
-24
lines changed

10 files changed

+268
-24
lines changed

CHANGELOG.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
- feat: Suppress JupyterLab context menu on Map right click by @kylebarron in https://github.com/developmentseed/lonboard/pull/889
88
- feat: Support two render modes: Standard/deck.gl-first and MapboxOverlay by @kylebarron in https://github.com/developmentseed/lonboard/pull/921
99
- feat: Create richer `Basemap` class and deprecate `basemap_style` arg by @kylebarron in https://github.com/developmentseed/lonboard/pull/935
10-
- feat: Support globe view by @kylebarron in https://github.com/developmentseed/lonboard/pull/908
1110
- feat: Move `TripsLayer` and `ArcLayer` out of experimental by @kylebarron in https://github.com/developmentseed/lonboard/pull/983
1211
- feat: Support for map controls by @kylebarron in https://github.com/developmentseed/lonboard/pull/924
1312
- feat: Provide default controls for Map by @kylebarron in https://github.com/developmentseed/lonboard/pull/992
@@ -16,7 +15,6 @@
1615
- feat: Add A5Layer by @kylebarron in https://github.com/developmentseed/lonboard/pull/1001
1716
- feat: Add geohash and s2 layers by @kylebarron in https://github.com/developmentseed/lonboard/pull/1007
1817
- feat: Implement view state validation for non map-view states by @kylebarron in https://github.com/developmentseed/lonboard/pull/1008
19-
- feat: Validate that GlobeView is only used with interleaved basemap mode by @kylebarron in https://github.com/developmentseed/lonboard/pull/1012
2018
- feat: Add view parameter to viz by @kylebarron in https://github.com/developmentseed/lonboard/pull/1013
2119

2220
### Performance improvements :zap:

assets/controls-example.jpg

467 KB
Loading

assets/interleaved-labels.jpg

40.1 KB
Loading

docs/blog/.authors.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
authors:
2+
kylebarron:
3+
name: Kyle Barron
4+
description: Creator
5+
avatar: https://github.com/kylebarron.png

docs/blog/index.md

Whitespace-only changes.

docs/blog/posts/lonboard-0.13.md

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
---
2+
draft: false
3+
date: 2025-11-05
4+
categories:
5+
- Release
6+
authors:
7+
- kylebarron
8+
links:
9+
- CHANGELOG.md
10+
---
11+
12+
# Releasing lonboard 0.13!
13+
14+
Lonboard is a Python library for fast, interactive geospatial vector data visualization in Jupyter.
15+
16+
This post gives an overview of what's new in Lonboard version 0.13.
17+
18+
<!-- more -->
19+
20+
Refer to the [changelog] for all updates.
21+
22+
## New layer types: H3, S2, Geohash, A5
23+
24+
Lonboard supports new layer types for [H3][h3], [S2][s2], [Geohash][geohash], and [A5][a5] data.
25+
26+
[h3]: https://h3geo.org/
27+
[a5]: https://a5geo.org/
28+
[s2]: http://s2geometry.io/
29+
[geohash]: https://en.wikipedia.org/wiki/Geohash
30+
31+
- [`H3HexagonLayer`][lonboard.H3HexagonLayer]: render hexagons from the [H3][h3] geospatial indexing system
32+
- [`S2Layer`][lonboard.S2Layer]: render polygons based on the [S2][s2] geospatial indexing system.
33+
- [`A5Layer`][lonboard.A5Layer]: render polygons based on the [A5][a5] geospatial indexing system.
34+
- [`GeohashLayer`][lonboard.GeohashLayer]: render polygons based on the [Geohash][geohash] geospatial indexing system.
35+
36+
![](../../assets/kontur-h3.jpg)
37+
38+
> Screenshot from [H3 Population](../../../../../examples/kontur_pop) example
39+
40+
Additionally, the [HeatmapLayer][lonboard.HeatmapLayer], which has been broken since Lonboard v0.10 due to upstream changes in deck.gl, has been fixed and is now functional again. (Thanks to @felixpalmer for [fixing this upstream](https://github.com/visgl/deck.gl/pull/9787)!).
41+
42+
## Interleaved rendering with Maplibre
43+
44+
When rendering dense visualizations, the data can obscure helpful elements of the basemap, removing spatial context from the visualization.
45+
46+
It's now possible to render Lonboard data layers interleaved in the Maplibre layer stack. This means Maplibre text labels can be rendered above your Lonboard-rendered data.
47+
48+
![](../../assets/interleaved-labels.jpg)
49+
50+
> Screenshot from [H3 Population](../../../../../examples/interleaved-labels) example
51+
52+
To do this:
53+
54+
- Set [`before_id`](../../../../../api/layers/base-layer#lonboard.BaseLayer.before_id) on your layer as the value of the Maplibre layer `id` you want the Lonboard layer to be under. See [`before_id`](../../../../../api/layers/base-layer#lonboard.BaseLayer.before_id) for more information.
55+
- Create a new basemap [set to `interleaved` mode][lonboard.basemap.MaplibreBasemap.mode]:
56+
- Pass the basemap to the `Map` constructor.
57+
58+
```py
59+
from lonboard.basemap import MaplibreBasemap
60+
from lonboard import Map, ScatterplotLayer
61+
62+
# Example layer ID when using Carto basemap styles
63+
layer = ScatterplotLayer(..., before_id="watername_ocean")
64+
basemap = MaplibreBasemap(mode="interleaved")
65+
m = Map(layer, basemap=basemap)
66+
```
67+
68+
## Map controls: scale, fullscreen, navigation
69+
70+
Common UI elements that we call "Controls" are now supported in Lonboard maps. In this release, this includes three types of controls:
71+
72+
- Scale control: shows a scale bar on the map
73+
- Fullscreen control: button to toggle fullscreen mode
74+
- Navigation control: zoom in/out buttons and a compass
75+
76+
These three controls are rendered on the map by default, but can be customized via the [`Map.controls`][lonboard.Map.controls] attribute. See [`lonboard.controls`][] for more information.
77+
78+
![](../../assets/controls-example.jpg)
79+
80+
## Performance improvements
81+
82+
First and foremost, I learned there was _severe bug_ in which the string representation (aka `repr`) of the [`table` attribute][lonboard.BaseArrowLayer.table] was being generated during map display. In conjunction with [an upstream issue](https://github.com/kylebarron/arro3/issues/432), this made it _very slow_ to render a map for datasets with many coordinates in a single row (such as polygons representing administrative boundaries). https://github.com/developmentseed/lonboard/pull/1015 **improved the Python-side of rendering by 99% in this case**, from 12 seconds to 5 milliseconds.
83+
84+
In https://github.com/developmentseed/lonboard/pull/902 we now fully parallelize the Parquet file generation in a thread pool on the Python side, leading to 4x faster Parquet serialization.
85+
86+
In https://github.com/developmentseed/lonboard/pull/954 we improve the Polygon rendering performance on the JavaScript side and remove a network request for a dependency needed to perform multi-threaded preparation for Polygon data rendering.
87+
88+
In general, Lonboard data rendering should feel instantaneous. If it's especially slow, on the order of ~10 seconds, [open an issue](https://github.com/developmentseed/lonboard/issues/new/choose) with your dataset to discuss.
89+
90+
## All updates
91+
92+
Refer to the [changelog] for all updates.
93+
94+
[changelog]: ../../CHANGELOG.md/#0130-2025-11-05

examples/index.md

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,19 @@
22

33
<div class="grid cards" markdown>
44

5-
- [Speedtest data ![](../assets/scatterplot-layer-network-speeds.jpg)](../examples/internet-speeds) using [`ScatterplotLayer`](../api/layers/scatterplot-layer)
6-
- [North America roads ![](../assets/path-layer-roads.jpg)](../examples/north-america-roads) using [`PathLayer`](../api/layers/path-layer)
7-
- [Spatially-Partitioned GeoParquet ![](../assets/spatially-partitioned-geoparquet.jpg)](../examples/overture-geoparquet) using [`PolygonLayer`](../api/layers/polygon-layer)
8-
- [Overture Maps buildings ![](../assets/overture.jpg)](../examples/overture-maps) using [`PolygonLayer`](../api/layers/polygon-layer)
9-
- [Air Traffic Control animation ![](../assets/air-traffic-control.gif)](../examples/air-traffic-control) using [`TripsLayer`](../api/layers/trips-layer)
10-
- [Global boundaries ![](../assets/boundaries.png)](../examples/global-boundaries) using [`PolygonLayer`](../api/layers/polygon-layer)
11-
- [H3 Population Data ![](../assets/kontur-h3.jpg)](../examples/kontur_pop) using [`H3HexagonLayer`](../api/layers/h3-hexagon-layer)
12-
- [U.S. County-to-County Migration ![](../assets/arc-layer-migration-example.gif)](../examples/migration) using [`ArcLayer`](../api/layers/arc-layer) and [`BrushingExtension`](../api/layer-extensions/brushing-extension)
13-
- [Scatterplot with GPU data filtering ![](../assets/data-filter-extension.gif)](../examples/data-filter-extension) using [`ScatterplotLayer`](../api/layers/scatterplot-layer) and [`DataFilterExtension`](../api/layer-extensions/data-filter-extension)
14-
- [Motor Vehicle Crashes in NYC ![](../assets/motor-vehicle-crashes-nyc.jpg)](../examples/map_challenge/1-points) using [`ScatterplotLayer`](../api/layers/scatterplot-layer)
15-
- [Rivers in Asia ![](../assets/rivers-asia.jpg)](../examples/map_challenge/6-asia/) using [`PathLayer`](../api/layers/path-layer)
16-
- [Inflation Reduction Act Projects ![](../assets/column-layer.jpg)](../examples/column-layer/) using [`ColumnLayer`](../api/layers/column-layer)
5+
- [Speedtest data ![](../assets/scatterplot-layer-network-speeds.jpg)](../examples/internet-speeds) using [`ScatterplotLayer`][lonboard.ScatterplotLayer]
6+
- [North America roads ![](../assets/path-layer-roads.jpg)](../examples/north-america-roads) using [`PathLayer`][lonboard.PathLayer]
7+
- [Spatially-Partitioned GeoParquet ![](../assets/spatially-partitioned-geoparquet.jpg)](../examples/overture-geoparquet) using [`PolygonLayer`][lonboard.PolygonLayer]
8+
- [Overture Maps buildings ![](../assets/overture.jpg)](../examples/overture-maps) using [`PolygonLayer`][lonboard.PolygonLayer]
9+
- [Air Traffic Control animation ![](../assets/air-traffic-control.gif)](../examples/air-traffic-control) using [`TripsLayer`][lonboard.TripsLayer]
10+
- [Global boundaries ![](../assets/boundaries.png)](../examples/global-boundaries) using [`PolygonLayer`][lonboard.PolygonLayer]
11+
- [H3 Population Data ![](../assets/kontur-h3.jpg)](../examples/kontur_pop) using [`H3HexagonLayer`][lonboard.H3HexagonLayer]
12+
- [U.S. County-to-County Migration ![](../assets/arc-layer-migration-example.gif)](../examples/migration) using [`ArcLayer`][lonboard.ArcLayer] and [`BrushingExtension`][lonboard.layer_extension.BrushingExtension]
13+
- [Scatterplot with GPU data filtering ![](../assets/data-filter-extension.gif)](../examples/data-filter-extension) using [`ScatterplotLayer`][lonboard.ScatterplotLayer] and [`DataFilterExtension`][lonboard.layer_extension.DataFilterExtension]
14+
- [Motor Vehicle Crashes in NYC ![](../assets/motor-vehicle-crashes-nyc.jpg)](../examples/map_challenge/1-points) using [`ScatterplotLayer`][lonboard.ScatterplotLayer]
15+
- [Rivers in Asia ![](../assets/rivers-asia.jpg)](../examples/map_challenge/6-asia/) using [`PathLayer`][lonboard.PathLayer]
16+
- [Inflation Reduction Act Projects ![](../assets/column-layer.jpg)](../examples/column-layer/) using [`ColumnLayer`][lonboard.ColumnLayer]
17+
- [Interleaved Maplibre Labels ![](../assets/interleaved-labels.jpg)](../examples/interleaved-labels/) using [`BitmapLayer`][lonboard.BitmapLayer] and [`MaplibreBasemap`][lonboard.basemap.MaplibreBasemap]
1718
- [Linked Maps ![](../assets/linked-maps.gif)](../examples/linked-maps/)
1819
- [Clicked Point ![](../assets/clicked-point.png)](../examples/clicked-point/)
1920
</div>
@@ -26,11 +27,11 @@
2627
<video controls autoplay loop>
2728
<source src="https://github.com/user-attachments/assets/77f6a2b3-80c9-4524-8be2-79152746da1d" type="video/mp4">
2829
</video>
29-
](../examples/marimo/nyc_taxi_trips/) using [`ArcLayer`](../api/layers/arc-layer) & [GeoDataFusion](https://github.com/datafusion-contrib/datafusion-geo)
30-
- [DuckDB Spatial ![](../assets/duckdb-heatmap.jpg)](../examples/duckdb) using [`HeatmapLayer`](../api/layers/heatmap-layer)
31-
- [Color picker integration ![](../assets/color-picker.jpg)](../examples/integrations/color-picker) using [`SolidPolygonLayer`](../api/layers/solid-polygon-layer)
32-
- [JupyterLab Sidecar integration ![](../assets/jupyter-sidecar.jpg)](../examples/integrations/sidecar/) using [`ScatterplotLayer`](../api/layers/scatterplot-layer) and [`JupyterLab Sidecar`](https://github.com/jupyter-widgets/jupyterlab-sidecar)
33-
- [MovingPandas ![](../assets/ais-movingpandas.gif)](../examples/ais-movingpandas) using [`TripsLayer`](../api/layers/trips-layer)
30+
](../examples/marimo/nyc_taxi_trips/) using [`ArcLayer`][lonboard.ArcLayer] & [GeoDataFusion](https://github.com/datafusion-contrib/datafusion-geo)
31+
- [DuckDB Spatial ![](../assets/duckdb-heatmap.jpg)](../examples/duckdb) using [`HeatmapLayer`][lonboard.HeatmapLayer]
32+
- [Color picker integration ![](../assets/color-picker.jpg)](../examples/integrations/color-picker) using [`SolidPolygonLayer`][lonboard.SolidPolygonLayer]
33+
- [JupyterLab Sidecar integration ![](../assets/jupyter-sidecar.jpg)](../examples/integrations/sidecar/) using [`ScatterplotLayer`][lonboard.ScatterplotLayer] and [`JupyterLab Sidecar`](https://github.com/jupyter-widgets/jupyterlab-sidecar)
34+
- [MovingPandas ![](../assets/ais-movingpandas.gif)](../examples/ais-movingpandas) using [`TripsLayer`][lonboard.TripsLayer]
3435

3536

3637
</div>
@@ -41,8 +42,8 @@ These examples are maintained by external contributors.
4142

4243
<div class="grid cards" markdown>
4344

44-
- [Using Lonboard to visualize graph flows ![](../assets/longraph.jpg)](https://knaaptime.com/longraph/) using [`ArcLayer`](../api/layers/arc-layer), [`PolygonLayer`](../api/layers/polygon-layer), and [`BrushingExtension`](../api/layer-extensions/brushing-extension) by [@knaaptime](https://github.com/knaaptime).
45-
- [American Community Survey exploration](https://github.com/jaanli/lonboard/blob/1af815ea586121dbbe0d8cae70f7814a642ad165/examples/american-community-survey.ipynb) using [`ScatterplotLayer`](../api/layers/scatterplot-layer) and [`DataFilterExtension`](../api/layer-extensions/data-filter-extension) by [@jaanli](https://github.com/jaanli).
45+
- [Using Lonboard to visualize graph flows ![](../assets/longraph.jpg)](https://knaaptime.com/longraph/) using [`ArcLayer`][lonboard.ArcLayer], [`PolygonLayer`][lonboard.PolygonLayer], and [`BrushingExtension`][lonboard.layer_extension.BrushingExtension] by [@knaaptime](https://github.com/knaaptime).
46+
- [American Community Survey exploration](https://github.com/jaanli/lonboard/blob/1af815ea586121dbbe0d8cae70f7814a642ad165/examples/american-community-survey.ipynb) using [`ScatterplotLayer`][lonboard.ScatterplotLayer] and [`DataFilterExtension`][lonboard.layer_extension.DataFilterExtension] by [@jaanli](https://github.com/jaanli).
4647

4748
</div>
4849

examples/interleaved-labels.ipynb

Lines changed: 131 additions & 0 deletions
Large diffs are not rendered by default.

lonboard/layer/_base.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ def _add_extension_traits(self, extensions: Sequence[BaseExtension]) -> None:
265265
So if you pass `before_id="background"`, you won't see your deck.gl layer because it
266266
will be rendered below **all** layers in the Maplibre basemap.
267267
268-
A common choice for Carto-based styles is to use `before_id="waterway-label"` so
268+
A common choice for Carto-based styles is to use `before_id="watername_ocean"` so
269269
that your deck.gl layer is rendered above the core basemap elements but below all
270270
text labels.
271271
@@ -326,6 +326,12 @@ class BaseArrowLayer(BaseLayer):
326326
# The following traitlets **are** serialized to JS
327327

328328
table: ArrowTableTrait
329+
"""An Arrow table with data for this layer.
330+
331+
Some downstream layers will require this table to have a geospatial column. Other
332+
layers, such as the [`H3HexagonLayer`][lonboard.layer.H3HexagonLayer] will accept
333+
non-geospatial data in conjunction with other accessors.
334+
"""
329335

330336
def _repr_keys(self) -> Generator[str, Any, None]:
331337
# Avoid rendering `table` in the string repr

mkdocs.yml

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,13 @@ nav:
4444
- examples/overture-geoparquet.ipynb
4545
- examples/air-traffic-control.ipynb
4646
- examples/global-boundaries.ipynb
47+
- examples/kontur_pop.ipynb
4748
- examples/migration.ipynb
4849
- examples/data-filter-extension.ipynb
4950
- examples/column-layer.ipynb
51+
- examples/interleaved-labels.ipynb
5052
- examples/linked-maps.ipynb
53+
- examples/clicked-point.ipynb
5154
- NYC Taxi Trips: examples/marimo/nyc_taxi_trips.md
5255
- Integrations:
5356
- examples/duckdb.ipynb
@@ -57,6 +60,8 @@ nav:
5760
- 30 Day Map Challenge:
5861
- "Day 1: Points": examples/map_challenge/1-points.ipynb
5962
- "Day 6: Asia": examples/map_challenge/6-asia.ipynb
63+
- Blog:
64+
- blog/index.md
6065
- API Reference:
6166
- api/viz.md
6267
- api/map.md
@@ -146,8 +151,6 @@ theme:
146151
text: Roboto
147152
code: Roboto Mono
148153

149-
# logo: img/geopolars_logo.svg
150-
151154
features:
152155
- content.code.annotate
153156
- content.code.copy
@@ -158,6 +161,9 @@ theme:
158161
- search.share
159162

160163
plugins:
164+
- autorefs:
165+
resolve_closest: true
166+
- blog
161167
- search
162168
- social
163169
- mike:
@@ -241,6 +247,9 @@ markdown_extensions:
241247
- pymdownx.magiclink:
242248
hide_protocol: true
243249
repo_url_shortener: true
250+
repo_url_shorthand: true
251+
repo: lonboard
252+
user: developmentseed
244253
- pymdownx.smartsymbols
245254
- pymdownx.superfences
246255
- pymdownx.tasklist:

0 commit comments

Comments
 (0)