From 8202ca5881169fc5d23851f2c41cdc2f70713147 Mon Sep 17 00:00:00 2001 From: Kyle Barron Date: Mon, 7 Oct 2024 15:54:19 -0400 Subject: [PATCH] Bump to 0.10 (#677) ### Change list - Updated changelog - Added `model.save_changes` that was left out from https://github.com/developmentseed/lonboard/pull/676 - Minor other fixes --- CHANGELOG.md | 36 ++++ docs/ecosystem/pyodide.md | 2 +- examples/internet-speeds.ipynb | 346 +++++++-------------------------- pyproject.toml | 2 +- src/index.tsx | 1 + 5 files changed, 108 insertions(+), 279 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d65678a9..8c165384 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,41 @@ # Changelog +## [0.10.0] - 2024-10-07 + +### New! :sparkles: + +- **New `TripsLayer`** for animating moving objects, which integrates with [MovingPandas](https://github.com/movingpandas/movingpandas). See the [Air Traffic Control example](https://developmentseed.org/lonboard/latest/examples/air-traffic-control/) and the [MovingPandas integration example](https://developmentseed.org/lonboard/latest/examples/ais-movingpandas/). +- **New [`ColumnLayer`](https://developmentseed.org/lonboard/latest/api/layers/column-layer/)** for rendering extruded cylinders. See the [new `ColumnLayer` example](https://developmentseed.org/lonboard/latest/examples/column-layer/). +- **Removed required dependencies!** `geopandas`, `pandas`, `shapely`, `pyarrow`, `matplotlib`, and `palettable` are now _optional_ dependencies. Lonboard will still work out of the box with them, but they aren't required to use Lonboard. This gives Lonboard a smaller footprint and makes it easier to use in environments such as [Pyodide](https://pyodide.org/). +- You can now **draw bounding boxes on the map**. This is exposed as the `selected_bounds` attribute on the `Map` object, stored as a two-dimensional bounding box `(minx, miny, maxx, maxy)`. +- **Improved documentation** + - [How to use Lonboard in pyodide](https://developmentseed.org/lonboard/latest/ecosystem/pyodide/), a Python environment that is fully running in your browser. + - Add linked maps example by @ATL2001 in https://github.com/developmentseed/lonboard/pull/655 + - Add troubleshooting doc by @kylebarron in https://github.com/developmentseed/lonboard/pull/654 + - Add longraph to showcase by @kylebarron in https://github.com/developmentseed/lonboard/pull/595 +- **New `Map.add_layer` method** for easily adding more layer(s) to an existing `Map` instance. +- Add `highlight_color` to change the color of `auto_highlight` by @kylebarron in https://github.com/developmentseed/lonboard/pull/666 +- Use deterministic colors in `viz` by @kylebarron in https://github.com/developmentseed/lonboard/pull/621 +- Categorical data filtering. The `DataFilterExtension` now has a [`filter_categories` attribute](https://developmentseed.org/lonboard/latest/api/layer-extensions/data-filter-extension/#lonboard.layer_extension.DataFilterExtension--filter_categories) that lets you filter categorical data on the map. by @kylebarron in https://github.com/developmentseed/lonboard/pull/609 + +### Breaking Changes :hammer: + +- The tooltip shown on hover was **replaced with a side panel**. You now must **click** on a geometry to view its attributes. By @vgeorge in https://github.com/developmentseed/lonboard/pull/636 + +### Fixes :bug: + +- We've switched from storing `list` objects to storing `tuple` objects (e.g. the list of layers in a `Map`). The immutability of the `tuple` ensures that a any changes in the sequence of layers will be propagated to the frontend.Fixed in https://github.com/developmentseed/lonboard/pull/620 +- A class of bugs was fixed when using Arrow input, where the chunking structure of the main `table` did not match the chunking of accessors. Fixed in https://github.com/developmentseed/lonboard/pull/644 +- Fix reading from DuckDB with only geometry column by @kylebarron in https://github.com/developmentseed/lonboard/pull/625 +- Fix attribution by @vgeorge in https://github.com/developmentseed/lonboard/pull/561 + +## New Contributors + +- @MarcSkovMadsen made their first contribution in https://github.com/developmentseed/lonboard/pull/539 +- @ATL2001 made their first contribution in https://github.com/developmentseed/lonboard/pull/655 + +**Full Changelog**: https://github.com/developmentseed/lonboard/compare/v0.9.3...v0.10.0 + ## [0.9.3] - 2024-05-27 ### Fixes :bug: diff --git a/docs/ecosystem/pyodide.md b/docs/ecosystem/pyodide.md index af3359f5..e94e392c 100644 --- a/docs/ecosystem/pyodide.md +++ b/docs/ecosystem/pyodide.md @@ -1,4 +1,4 @@ -# Using in pyodide +# Pyodide As of Lonboard version 0.10, it's possible to use Lonboard in [Pyodide](https://pyodide.org/en/stable/), where Python is running _inside your web browser_ in WebAssembly. diff --git a/examples/internet-speeds.ipynb b/examples/internet-speeds.ipynb index 4bc925d2..8cc2af3b 100644 --- a/examples/internet-speeds.ipynb +++ b/examples/internet-speeds.ipynb @@ -5,13 +5,25 @@ "id": "0f09e1c5", "metadata": {}, "source": [ - "# Speedtest Data (`ScatterplotLayer`)\n", + "# Speedtest Data\n", "\n", "This example will use data collected from Ookla's Speed Test application and [shared publicly in the AWS Open Data Registry](https://registry.opendata.aws/speedtest-global-performance/). From the AWS page:\n", "\n", "> Global fixed broadband and mobile (cellular) network performance, allocated to zoom level 16 web mercator tiles (approximately 610.8 meters by 610.8 meters at the equator). Data is provided in both Shapefile format as well as Apache Parquet with geometries represented in Well Known Text (WKT) projected in EPSG:4326. Download speed, upload speed, and latency are collected via the Speedtest by Ookla applications for Android and iOS and averaged for each tile.\n", "\n", - "You can view a [hosted version of this notebook on Notebook Sharing Space](https://notebooksharing.space/view/2c2fc0b1ef5f93c70a8c36de30b560d1316d16760714742dcf22a119f4991762#displayOptions=) (35MB download)." + "You can view a [hosted version of this notebook on Notebook Sharing Space](https://notebooksharing.space/view/2c2fc0b1ef5f93c70a8c36de30b560d1316d16760714742dcf22a119f4991762#displayOptions=) (35MB download).\n" + ] + }, + { + "cell_type": "markdown", + "id": "fbfeace7-81ee-48d4-af01-5172618e83ea", + "metadata": {}, + "source": [ + "### Dependencies\n", + "\n", + "```\n", + "pip install lonboard \"geopandas>=1\" palettable sidecar\n", + "```\n" ] }, { @@ -19,12 +31,12 @@ "id": "7dd1dfef-3756-49d9-9480-9a4cdba22345", "metadata": {}, "source": [ - "## Imports" + "## Imports\n" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "d1678764", "metadata": {}, "outputs": [], @@ -32,10 +44,10 @@ "from pathlib import Path\n", "\n", "import geopandas as gpd\n", - "import numpy as np\n", "import pandas as pd\n", "import shapely\n", "from palettable.colorbrewer.diverging import BrBG_10\n", + "from sidecar import Sidecar\n", "\n", "from lonboard import Map, ScatterplotLayer\n", "from lonboard.colormap import apply_continuous_cmap" @@ -46,8 +58,7 @@ "id": "d51ca576", "metadata": {}, "source": [ - "## Fetch data\n", - "\n" + "## Fetch data\n" ] }, { @@ -55,12 +66,12 @@ "id": "c747d8b9-94b9-421a-967a-8350bf72de9a", "metadata": {}, "source": [ - "The URL for a single data file for mobile network speeds in the first quarter of 2019:" + "The URL for a single data file for mobile network speeds in the first quarter of 2019:\n" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "34ac8eae", "metadata": {}, "outputs": [], @@ -77,12 +88,12 @@ "\n", "We fetch two columns — `avg_d_kbps` and `tile` — from this data file directly from AWS. The `pd.read_parquet` command will perform a network request for these columns from the data file, so it may take a while on a slow network connection. `avg_d_kbps` is the average download speed for that data point in kilobits per second. `tile` is the WKT string representing a given zoom-16 Web Mercator tile.\n", "\n", - "The `tile` column contains _strings_ representing WKT-formatted geometries. We need to parse those strings into geometries. Then for simplicity we'll convert into their centroids." + "The `tile` column contains _strings_ representing WKT-formatted geometries. We need to parse those strings into geometries. Then for simplicity we'll convert into their centroids.\n" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "7c20cb4c-9746-486f-aef7-95dd2dedd6a5", "metadata": {}, "outputs": [], @@ -96,7 +107,7 @@ "\n", " tile_geometries = shapely.from_wkt(df[\"tile\"])\n", " tile_centroids = shapely.centroid(tile_geometries)\n", - " gdf = gpd.GeoDataFrame(df[[\"avg_d_kbps\"]], geometry=tile_centroids, crs='EPSG:4326')\n", + " gdf = gpd.GeoDataFrame(df[[\"avg_d_kbps\"]], geometry=tile_centroids, crs=\"EPSG:4326\")\n", " gdf.to_parquet(local_path)" ] }, @@ -105,84 +116,15 @@ "id": "5852aa94-2d18-4a1b-b379-be19682d57eb", "metadata": {}, "source": [ - "We can take a quick look at this data:" + "We can take a quick look at this data:\n" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "4b27e9a4", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
avg_d_kbpsgeometry
05983POINT (-160.01862 70.63722)
13748POINT (-160.04059 70.63357)
23364POINT (-160.04059 70.63175)
32381POINT (-160.03510 70.63357)
43047POINT (-160.03510 70.63175)
\n", - "
" - ], - "text/plain": [ - " avg_d_kbps geometry\n", - "0 5983 POINT (-160.01862 70.63722)\n", - "1 3748 POINT (-160.04059 70.63357)\n", - "2 3364 POINT (-160.04059 70.63175)\n", - "3 2381 POINT (-160.03510 70.63357)\n", - "4 3047 POINT (-160.03510 70.63175)" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "gdf.head()" ] @@ -194,12 +136,12 @@ "source": [ "To ensure that this demo is snappy on most computers, we'll filter to a bounding box over Europe.\n", "\n", - "If you're on a recent computer, feel free to comment out the next line." + "If you're on a recent computer, feel free to comment out the next line.\n" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "80326895-70ba-4f4b-a7b3-106b4bbd36d9", "metadata": {}, "outputs": [], @@ -212,123 +154,15 @@ "id": "3cc2215e-7706-4ab3-b674-3de4ca41899c", "metadata": {}, "source": [ - "Even this filtered data frame still has 800,000 rows, so it's still a lot of data to explore:" + "Even this filtered data frame still has 800,000 rows, so it's still a lot of data to explore:\n" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "a34a6a27-0259-4da9-94c4-923466da05fb", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
avg_d_kbpsgeometry
05983POINT (-160.01862 70.63722)
13748POINT (-160.04059 70.63357)
23364POINT (-160.04059 70.63175)
32381POINT (-160.03510 70.63357)
43047POINT (-160.03510 70.63175)
.........
323124019528POINT (169.81842 -46.29571)
323124115693POINT (169.81293 -46.30710)
323124226747POINT (169.66461 -46.42082)
323124367995POINT (169.65912 -46.45110)
32312441230POINT (168.85162 -46.56075)
\n", - "

3231245 rows × 2 columns

\n", - "
" - ], - "text/plain": [ - " avg_d_kbps geometry\n", - "0 5983 POINT (-160.01862 70.63722)\n", - "1 3748 POINT (-160.04059 70.63357)\n", - "2 3364 POINT (-160.04059 70.63175)\n", - "3 2381 POINT (-160.03510 70.63357)\n", - "4 3047 POINT (-160.03510 70.63175)\n", - "... ... ...\n", - "3231240 19528 POINT (169.81842 -46.29571)\n", - "3231241 15693 POINT (169.81293 -46.30710)\n", - "3231242 26747 POINT (169.66461 -46.42082)\n", - "3231243 67995 POINT (169.65912 -46.45110)\n", - "3231244 1230 POINT (168.85162 -46.56075)\n", - "\n", - "[3231245 rows x 2 columns]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "gdf" ] @@ -338,37 +172,30 @@ "id": "81a61ec4-2a09-40c0-aa92-7dca570bbd49", "metadata": {}, "source": [ - "To render point data, first create a `ScatterplotLayer` and then add it to a `Map` object:" + "To render point data, first create a `ScatterplotLayer` and then add it to a `Map` object:\n" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, + "id": "733fe65a-599e-474a-9e31-0435193b1fd3", + "metadata": {}, + "outputs": [], + "source": [ + "sidecar = Sidecar()" + ] + }, + { + "cell_type": "code", + "execution_count": null, "id": "570ab332-3767-4246-8d83-df4625b2ae48", "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "93ebf1b446784969877cf66f8f455615", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Map(layers=[ScatterplotLayer(table=pyarrow.Table\n", - "avg_d_kbps: uint32\n", - "geometry: fixed_size_list[2]…" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "layer = ScatterplotLayer.from_geopandas(gdf)\n", - "m = Map(layer)\n", - "m" + "m = Map(layer, _height=800)\n", + "with sidecar:\n", + " display(m)" ] }, { @@ -376,12 +203,12 @@ "id": "6f4d89c3-282a-4beb-9f35-68eb9645e8c0", "metadata": {}, "source": [ - "We can look at the [documentation for `ScatterplotLayer`](https://developmentseed.org/lonboard/latest/api/layers/scatterplot-layer/) to see what other rendering options it allows. Let's set the fill color to something other than black:" + "We can look at the [documentation for `ScatterplotLayer`](https://developmentseed.org/lonboard/latest/api/layers/scatterplot-layer/) to see what other rendering options it allows. Let's set the fill color to something other than black:\n" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "3912b241-577f-4ac3-b78f-2702e89d6010", "metadata": {}, "outputs": [], @@ -394,7 +221,7 @@ "id": "b66a73b6-69c1-4661-a7ad-2dd3941c8753", "metadata": {}, "source": [ - "Blue is pretty, but the map would be more informative if we colored each point by a relevant characteristic. In this case, we have the download speed associated with each location, so let's use that!" + "Blue is pretty, but the map would be more informative if we colored each point by a relevant characteristic. In this case, we have the download speed associated with each location, so let's use that!\n" ] }, { @@ -402,19 +229,19 @@ "id": "ce630455-3e19-47f1-bb69-81fdcd99b126", "metadata": {}, "source": [ - "Here we compute a linear statistic for the download speed. Given a minimum bound of `5000` and a maximum bound of `50,000` the normalized speed is linearly scaled to between 0 and 1." + "Here we compute a linear statistic for the download speed. Given a minimum bound of `5000` and a maximum bound of `50,000` the normalized speed is linearly scaled to between 0 and 1.\n" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "179071b3", "metadata": {}, "outputs": [], "source": [ "min_bound = 5000\n", "max_bound = 50000\n", - "download_speed = gdf['avg_d_kbps']\n", + "download_speed = gdf[\"avg_d_kbps\"]\n", "normalized_download_speed = (download_speed - min_bound) / (max_bound - min_bound)" ] }, @@ -423,37 +250,15 @@ "id": "7f678b8e-ad23-4ebd-842c-c5158e1ec741", "metadata": {}, "source": [ - "`normalized_download_speed` is now linearly scaled based on the bounds provided above. Keep in mind that the **input range of the colormap is 0-1**. So any values that are below 0 will receive the left-most color in the colormap, while any values above 1 will receive the right-most color in the colormap." + "`normalized_download_speed` is now linearly scaled based on the bounds provided above. Keep in mind that the **input range of the colormap is 0-1**. So any values that are below 0 will receive the left-most color in the colormap, while any values above 1 will receive the right-most color in the colormap.\n" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "a8df3963-2bc2-4f89-8a38-20e232a13932", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 0.021844\n", - "1 -0.027822\n", - "2 -0.036356\n", - "3 -0.058200\n", - "4 -0.043400\n", - " ... \n", - "3231240 0.322844\n", - "3231241 0.237622\n", - "3231242 0.483267\n", - "3231243 1.399889\n", - "3231244 -0.083778\n", - "Name: avg_d_kbps, Length: 3231245, dtype: float64" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "normalized_download_speed" ] @@ -463,30 +268,15 @@ "id": "dc0e388f-eeed-4339-bd54-0491f79f45aa", "metadata": {}, "source": [ - "We can use any colormap provided by the [`palettable`](https://github.com/jiffyclub/palettable) package. Let's inspect the `BrBG_10` diverging colormap below:" + "We can use any colormap provided by the [`palettable`](https://github.com/jiffyclub/palettable) package. Let's inspect the `BrBG_10` diverging colormap below:\n" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "9d5347e2-84c7-40bc-af45-c8638188709e", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgAAAABACAYAAABsv8+/AAAAE3RFWHRUaXRsZQBCckJHIGNvbG9ybWFwMTXIUAAAABl0RVh0RGVzY3JpcHRpb24AQnJCRyBjb2xvcm1hcLqHWMgAAAAwdEVYdEF1dGhvcgBNYXRwbG90bGliIHYzLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZ9ESsrYAAAAydEVYdFNvZnR3YXJlAE1hdHBsb3RsaWIgdjMuNy41LCBodHRwczovL21hdHBsb3RsaWIub3Jn/7QtkQAAAilJREFUeJzt1k1u2zAURlGSQffTxXT/O7GYgSUHejahBPGgwHfOROWPKCYBitv//f0zW2ut99Zaa21cPu//GOPd+/t5/O7949h/39iP8WP+GI/TfO9l3yj79vXn88bL9/riO/Ueva4v7tHLd/rHx/7+6+d4rI/z+uq9sn8s18u5i/PG4tyrexz3bsffr5f3HvP7vnEer/a3Xu6x2N/K+V/7X8+3i++u7jn3v/Ns9+fWxv6s8+f15/lvnvPj7/32fne3Oe/j/XmbWxkf69ti/2/XV9970/q2nZ5bGd+2uZg/9pdzZj1nlv3fO/9p3/zhPco5x88763xZr/NzMb967+n8i/eX56/us1hv+++97b+Hr/GxPi/G/+n7+779fysAIIkAAIBAAgAAAgkAAAgkAAAgkAAAgEACAAACCQAACCQAACCQAACAQAIAAAIJAAAIJAAAIJAAAIBAAgAAAgkAAAgkAAAgkAAAgEACAAACCQAACCQAACCQAACAQAIAAAIJAAAIJAAAIJAAAIBAAgAAAgkAAAgkAAAgkAAAgEACAAACCQAACCQAACCQAACAQAIAAAIJAAAIJAAAIJAAAIBAAgAAAgkAAAgkAAAgkAAAgEACAAACCQAACCQAACCQAACAQAIAAAIJAAAIJAAAIJAAAIBAAgAAAgkAAAgkAAAgkAAAgEACAAACCQAACCQAACCQAACAQAIAAAIJAAAIJAAAIJAAAIBAAgAAAn0CyK5V+uT9Ti4AAAAASUVORK5CYII=", - "text/html": [ - "
BrBG
\"BrBG
under
bad
over
" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "BrBG_10.mpl_colormap" ] @@ -496,17 +286,19 @@ "id": "8eb59fd6-3b7d-4db9-ad9b-a66e4e58152f", "metadata": {}, "source": [ - "Now let's apply the colormap on `normalized_download_speed` using a helper provided by `lonboard`. We can set it on `layer.get_fill_color` to update the existing colors." + "Now let's apply the colormap on `normalized_download_speed` using a helper provided by `lonboard`. We can set it on `layer.get_fill_color` to update the existing colors.\n" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "5a77f728-9cbe-4372-9bfd-d6dee4b93a01", "metadata": {}, "outputs": [], "source": [ - "layer.get_fill_color = apply_continuous_cmap(normalized_download_speed, BrBG_10, alpha=0.7)" + "layer.get_fill_color = apply_continuous_cmap(\n", + " normalized_download_speed, BrBG_10, alpha=0.7\n", + ")" ] }, { @@ -514,7 +306,7 @@ "id": "44611c75-f9e6-4f53-af7d-c640d641dc15", "metadata": {}, "source": [ - "After running the above cell, you should see the map above update with a different color per point!" + "After running the above cell, you should see the map above update with a different color per point!\n" ] }, { @@ -524,12 +316,12 @@ "source": [ "We can pass an array into any of the \"accessors\" supported by the layer (this is any attribute that starts with `get_*`).\n", "\n", - "For demonstration purposes, let's also set `get_radius` to `normalized_download_speed`." + "For demonstration purposes, let's also set `get_radius` to `normalized_download_speed`.\n" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "579233ef-e077-4c8f-a111-f33d44f30a0d", "metadata": {}, "outputs": [], @@ -544,7 +336,7 @@ "id": "06e2338e-8461-49f7-9884-475fffc64789", "metadata": {}, "source": [ - "After running the above cell, you should see the map updated to have a different radius per point!" + "After running the above cell, you should see the map updated to have a different radius per point!\n" ] } ], @@ -564,7 +356,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.11.8" }, "widgets": { "application/vnd.jupyter.widget-state+json": { diff --git a/pyproject.toml b/pyproject.toml index 861995a9..060479ba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "lonboard" -version = "0.10.0-beta.2" +version = "0.10.0" description = "Fast, interactive geospatial data visualization in Jupyter." authors = ["Kyle Barron "] license = "MIT" diff --git a/src/index.tsx b/src/index.tsx index 10ef9750..9b9f47b0 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -161,6 +161,7 @@ function App() { // when we use deck.gl to perform picking, we'll have // `selected_indices` as a property of each individual layer. model.set("selected_bounds", bboxSelectBounds); + model.save_changes(); // childModels.forEach((layer) => { // layer.set("selected_bounds", bboxSelectBounds); // layer.save_changes();