From b0dee56c63085d83c5ac39a486ea3db14d07fccb Mon Sep 17 00:00:00 2001 From: Qiusheng Wu Date: Mon, 6 Jul 2026 16:45:17 -0400 Subject: [PATCH 1/5] docs: replace MkDocs with Zensical for the documentation website Zensical is the successor to Material for MkDocs from the same team, with much faster builds and native mkdocstrings support. Since Zensical does not yet support mkdocs-jupyter, notebooks are converted to Markdown pages with nbconvert at build time via scripts/convert_notebooks.py. --- .github/workflows/docs-build.yml | 5 +- .github/workflows/docs.yml | 12 +- .gitignore | 9 + docs/overrides/main.html | 11 - mkdocs.yml | 420 ------------------------------- requirements_docs.txt | 8 +- scripts/convert_notebooks.py | 74 ++++++ zensical.toml | 345 +++++++++++++++++++++++++ 8 files changed, 442 insertions(+), 442 deletions(-) delete mode 100644 docs/overrides/main.html delete mode 100644 mkdocs.yml create mode 100644 scripts/convert_notebooks.py create mode 100644 zensical.toml diff --git a/.github/workflows/docs-build.yml b/.github/workflows/docs-build.yml index 2df76c4590..2802ea10c0 100644 --- a/.github/workflows/docs-build.yml +++ b/.github/workflows/docs-build.yml @@ -59,10 +59,11 @@ jobs: run: | .venv/bin/pytest . --verbose - - name: Install mkdocs + - name: Build docs run: | uv pip install -r requirements_docs.txt - .venv/bin/mkdocs build + .venv/bin/python scripts/convert_notebooks.py + .venv/bin/zensical build - name: Deploy to Netlify uses: nwtgck/actions-netlify@v4.0 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index f846c4347f..d0a690bd55 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -58,7 +58,15 @@ jobs: run: | .venv/bin/pytest . --verbose - - name: Install mkdocs + - name: Build docs run: | uv pip install -r requirements_docs.txt - .venv/bin/mkdocs gh-deploy --force + .venv/bin/python scripts/convert_notebooks.py + .venv/bin/zensical build + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v4 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./site + force_orphan: true diff --git a/.gitignore b/.gitignore index 1a31213997..6a5d6bccc7 100644 --- a/.gitignore +++ b/.gitignore @@ -151,3 +151,12 @@ ENV/ tests/test_testings.py docs/changelog_update.py + +# Markdown pages generated from notebooks by scripts/convert_notebooks.py +docs/notebooks/*.md +docs/notebooks/*_files/ +docs/workshops/*.md +docs/workshops/*_files/ +docs/maplibre/*.md +!docs/maplibre/overview.md +docs/maplibre/*_files/ diff --git a/docs/overrides/main.html b/docs/overrides/main.html deleted file mode 100644 index 702c96bf29..0000000000 --- a/docs/overrides/main.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends "base.html" %} - -{% block content %} -{% if page.nb_url %} - - {% include ".icons/material/download.svg" %} - -{% endif %} - -{{ super() }} -{% endblock content %} diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index 2a9e3b0196..0000000000 --- a/mkdocs.yml +++ /dev/null @@ -1,420 +0,0 @@ -site_name: leafmap -site_description: A Python package for interactive mapping and geospatial analysis with minimal coding in a Jupyter environment -site_author: Qiusheng Wu -site_url: https://leafmap.org - -repo_url: https://github.com/opengeos/leafmap - -copyright: "Copyright © 2021 - 2025 Qiusheng Wu" - -theme: - palette: - - scheme: default - # primary: blue - # accent: indigo - toggle: - icon: material/toggle-switch-off-outline - name: Switch to dark mode - - scheme: slate - primary: indigo - accent: indigo - toggle: - icon: material/toggle-switch - name: Switch to light mode - name: material - icon: - repo: fontawesome/brands/github - logo: assets/logo.png - favicon: assets/favicon.png - features: - - navigation.instant - - navigation.tracking - - navigation.top - - search.highlight - - search.share - custom_dir: "docs/overrides" - font: - text: Google Sans - code: Regular - -plugins: - - search - - mkdocstrings: - handlers: - python: - selection: - docstring_style: google - rendering: - show_root_heading: true - show_source: false - - - git-revision-date - - git-revision-date-localized: - enable_creation_date: true - type: timeago - # - pdf-export - - mkdocs-jupyter: - include_source: True - ignore_h1_titles: True - execute: false - allow_errors: false - ignore: ["conf.py", "data/README.md", "usage.md"] - execute_ignore: - [ - "check_maplibre.py", - "changelog_update.py", - "workshops/*.ipynb", - "notebooks/02_using_basemaps.ipynb", - "notebooks/08_whitebox.ipynb", - "notebooks/15_openstreetmap.ipynb", - "notebooks/16_heremap.ipynb", - "notebooks/28_publish_map.ipynb", - "notebooks/38_plotly.ipynb", - "notebooks/40_plotly_gui.ipynb", - "notebooks/42_create_cog.ipynb", - "notebooks/47_numpy_to_cog.ipynb", - "notebooks/48_lidar.ipynb", - "notebooks/49_split_control.ipynb", - "notebooks/50_marker_cluster.ipynb", - "notebooks/57_national_map.ipynb", - "notebooks/58_bokeh.ipynb", - "notebooks/67_maxar_open_data.ipynb", - "notebooks/68_openaerialmap.ipynb", - "notebooks/69_turkey_earthquake.ipynb", - "notebooks/71_aws_s3.ipynb", - "notebooks/72_timelapse.ipynb", - "notebooks/74_map_tiles_to_geotiff.ipynb", - "notebooks/75_segment_anything.ipynb", - "notebooks/77_split_raster.ipynb", - "notebooks/80_solar.ipynb", - "notebooks/81_buildings.ipynb", - "notebooks/82_pmtiles.ipynb", - "notebooks/83_vector_viz.ipynb", - "notebooks/84_read_parquet.ipynb", - "notebooks/85_gedi.ipynb", - "notebooks/87_actinia.ipynb", - "notebooks/88_nasa_earth_data.ipynb", - "notebooks/92_maplibre.ipynb", - "notebooks/93_maplibre_pmtiles.ipynb", - "notebooks/94_mapbox.ipynb", - "notebooks/97_overture_data.ipynb", - "notebooks/99_wetlands.ipynb", - "notebooks/100_nlcd.ipynb", - "notebooks/101_nasa_opera.ipynb", - "notebooks/102_fused.ipynb", - "notebooks/107_copernicus.ipynb", - "notebooks/116_hls_nasa_earthdata.ipynb", - "maplibre/3d_pmtiles.ipynb", - "maplibre/animate_a_line.ipynb", - "maplibre/copernicus.ipynb", - "maplibre/fields_of_the_world.ipynb", - "maplibre/mapillary.ipynb", - "maplibre/nasa_opera.ipynb", - "maplibre/live_update_feature.ipynb", - "maplibre/AlphaEarth.ipynb", - "maplibre/pmtiles.ipynb", - "maplibre/similarity_search.ipynb", - "maplibre/google_earth.ipynb", - ] - -markdown_extensions: - - admonition - - abbr - - attr_list - - def_list - - footnotes - - meta - - md_in_html - - pymdownx.superfences - - pymdownx.highlight: - linenums: true - - toc: - permalink: true - -extra: - analytics: - provider: google - property: G-B1C88N45QG - -nav: - - Home: index.md - - Book: https://book.leafmap.org - - Installation: installation.md - - Get Started: get-started.md - - Usage: notebooks/00_key_features.ipynb - - Web App: https://huggingface.co/spaces/giswqs/solara-geospatial - - Tutorials: tutorials.md - - Contributing: contributing.md - - FAQ: faq.md - - Changelog: changelog.md - - YouTube Channel: https://youtube.com/@giswqs - - Report Issues: https://github.com/opengeos/leafmap/issues - - API Reference: - - basemaps module: basemaps.md - - bokehmap module: bokehmap.md - - colormaps module: colormaps.md - - common module: common.md - - deck module: deck.md - - deckgl module: deckgl.md - - download module: download.md - - examples module: examples.md - - fire module: fire.md - - foliumap module: foliumap.md - - kepler module: kepler.md - - maplibregl module: maplibregl.md - - leafmap module: leafmap.md - - legends module: legends.md - - map_widgets module: map_widgets.md - - osm module: osm.md - - pc module: pc.md - - plot module: plot.md - - plotlymap module: plotlymap.md - - pydeck module: deck.md - - stac module: stac.md - - terrascope module: terrascope.md - - toolbar module: toolbar.md - - Workshops: - - workshops/FOSS4G_2021.ipynb - - workshops/SIGSPATIAL_2021.ipynb - - workshops/YouthMappers_2021.ipynb - - workshops/ICRW_2023.ipynb - - workshops/EarthCube_2023.ipynb - - workshops/Taiwan_2024.ipynb - - workshops/HGAC_2024.ipynb - - workshops/CVPR_2025.ipynb - - workshops/AGU_2025.ipynb - - MapLibre: - - maplibre/overview.md - - maplibre/3d_buildings.ipynb - - maplibre/3d_choropleth.ipynb - - maplibre/3d_indoor_mapping.ipynb - - maplibre/3d_pmtiles.ipynb - - maplibre/3d_style.ipynb - - maplibre/3d_terrain.ipynb - - maplibre/add_3d_buildings.ipynb - - maplibre/add_a_marker.ipynb - - maplibre/add_colorbar.ipynb - - maplibre/add_components.ipynb - - maplibre/add_deckgl_layer.ipynb - - maplibre/add_gif.ipynb - - maplibre/add_html.ipynb - - maplibre/add_icon.ipynb - - maplibre/add_image.ipynb - - maplibre/add_image_generated.ipynb - - maplibre/add_labels.ipynb - - maplibre/add_legend.ipynb - - maplibre/add_logo.ipynb - - maplibre/add_text.ipynb - - maplibre/AlphaEarth.ipynb - - maplibre/animate_a_line.ipynb - - maplibre/animate_camera_around_point.ipynb - - maplibre/animate_images.ipynb - - maplibre/animate_point_along_line.ipynb - - maplibre/animate_point_along_route.ipynb - - maplibre/arc_layer.ipynb - - maplibre/attribution_position.ipynb - - maplibre/basemaps.ipynb - - maplibre/center_on_symbol.ipynb - - maplibre/change_building_color.ipynb - - maplibre/change_case_of_labels.ipynb - - maplibre/choropleth.ipynb - - maplibre/cloud_optimized_geotiff.ipynb - - maplibre/cluster.ipynb - - maplibre/color_switcher.ipynb - - maplibre/copernicus.ipynb - - maplibre/countries_filter.ipynb - - maplibre/create_vector.ipynb - - maplibre/custom_marker.ipynb - - maplibre/dashboard.ipynb - - maplibre/data_driven_lines.ipynb - - maplibre/disable_scroll_zoom.ipynb - - maplibre/display_rich_text.ipynb - - maplibre/drag_a_marker.ipynb - - maplibre/draw_features.ipynb - - maplibre/duckdb_layer.ipynb - - maplibre/edit_vector.ipynb - - maplibre/fallback_image.ipynb - - maplibre/fields_of_the_world.ipynb - - maplibre/fit_bounds.ipynb - - maplibre/fill_pattern.ipynb - - maplibre/floating_sidebar.ipynb - - maplibre/fly_to.ipynb - - maplibre/fly_to_options.ipynb - - maplibre/fullscreen.ipynb - - maplibre/geojson_layer_in_stack.ipynb - - maplibre/geojson_line.ipynb - - maplibre/geojson_points.ipynb - - maplibre/geojson_polygon.ipynb - - maplibre/geopandas.ipynb - - maplibre/globe_control.ipynb - - maplibre/google_earth.ipynb - - maplibre/google_earth_engine.ipynb - - maplibre/gps_trace.ipynb - - maplibre/H3.ipynb - - maplibre/heatmap_layer.ipynb - - maplibre/historical_imagery.ipynb - - maplibre/housing_prices.ipynb - - maplibre/interactive_false.ipynb - - maplibre/jump_to.ipynb - - maplibre/language_switch.ipynb - - maplibre/latlon_grid.ipynb - - maplibre/layer_control.ipynb - - maplibre/layer_groups.ipynb - - maplibre/layer_manager.ipynb - - maplibre/layer_styling.ipynb - - maplibre/line_gradient.ipynb - - maplibre/live_geojson.ipynb - - maplibre/live_update_feature.ipynb - - maplibre/local_geojson.ipynb - - maplibre/local_raster.ipynb - - maplibre/local_titiler.ipynb - - maplibre/locate_user.ipynb - - maplibre/map_tiles.ipynb - - maplibre/mapillary.ipynb - - maplibre/maptiler_styles.ipynb - - maplibre/MGRS.ipynb - - maplibre/mouse_position.ipynb - - maplibre/multiple_geometries.ipynb - - maplibre/nasa_opera.ipynb - - maplibre/navigation.ipynb - - maplibre/ocean_bathymetry.ipynb - - maplibre/openfreemap.ipynb - - maplibre/openstreetmap.ipynb - - maplibre/overture.ipynb - - maplibre/pmtiles.ipynb - - maplibre/restrict_bounds.ipynb - - maplibre/satellite_map.ipynb - - maplibre/search_control.ipynb - - maplibre/set_pitch_bearing.ipynb - - maplibre/set_terrain.ipynb - - maplibre/sidebar.ipynb - - maplibre/similarity_search.ipynb - - maplibre/stac.ipynb - - maplibre/time_slider.ipynb - - maplibre/to_html.ipynb - - maplibre/variable_label_placement.ipynb - - maplibre/variable_offset_label_placement.ipynb - - maplibre/vector_tile.ipynb - - maplibre/video_on_a_map.ipynb - - maplibre/visualize_population_density.ipynb - - maplibre/wms_source.ipynb - - maplibre/wms_to_geotiff.ipynb - - maplibre/zoom_to_linestring.ipynb - - Notebooks: - - notebooks/00_key_features.ipynb - - notebooks/01_leafmap_intro.ipynb - - notebooks/02_using_basemaps.ipynb - - notebooks/03_cog_stac.ipynb - - notebooks/04_cog_mosaic.ipynb - - notebooks/05_load_raster.ipynb - - notebooks/06_legend.ipynb - - notebooks/07_colorbar.ipynb - - notebooks/08_whitebox.ipynb - - notebooks/09_csv_to_points.ipynb - - notebooks/10_add_vector.ipynb - - notebooks/11_linked_maps.ipynb - - notebooks/12_split_map.ipynb - - notebooks/13_geopandas.ipynb - - notebooks/14_postgis.ipynb - - notebooks/15_openstreetmap.ipynb - - notebooks/16_heremap.ipynb - - notebooks/17_vector_tile_layer.ipynb - - notebooks/18_point_layer.ipynb - - notebooks/19_map_to_html.ipynb - - notebooks/20_planet_imagery.ipynb - - notebooks/21_ts_inspector.ipynb - - notebooks/22_time_slider.ipynb - - notebooks/23_colormaps.ipynb - - notebooks/24_heatmap.ipynb - - notebooks/25_map_title.ipynb - - notebooks/26_kepler_gl.ipynb - - notebooks/27_basemap_gallery.ipynb - - notebooks/28_publish_map.ipynb - - notebooks/29_pydeck.ipynb - - notebooks/30_census_data.ipynb - - notebooks/31_search_basemaps.ipynb - - notebooks/32_local_tile.ipynb - - notebooks/33_image_overlay.ipynb - - notebooks/34_add_points_from_xy.ipynb - - notebooks/35_circle_markers.ipynb - - notebooks/36_add_labels.ipynb - - notebooks/37_planetary_computer.ipynb - - notebooks/38_plotly.ipynb - - notebooks/39_inspector_tool.ipynb - - notebooks/40_plotly_gui.ipynb - - notebooks/41_raster_gui.ipynb - - notebooks/42_create_cog.ipynb - - notebooks/43_search_control.ipynb - - notebooks/44_attribute_table.ipynb - - notebooks/45_create_vector.ipynb - - notebooks/46_edit_vector.ipynb - - notebooks/47_numpy_to_cog.ipynb - - notebooks/48_lidar.ipynb - - notebooks/49_split_control.ipynb - - notebooks/50_marker_cluster.ipynb - - notebooks/51_clip_image.ipynb - - notebooks/52_netcdf.ipynb - - notebooks/53_choropleth.ipynb - - notebooks/54_plot_raster.ipynb - - notebooks/55_lidar.ipynb - - notebooks/56_download_ned.ipynb - - notebooks/57_national_map.ipynb - - notebooks/58_bokeh.ipynb - - notebooks/59_create_legend.ipynb - - notebooks/60_add_widget.ipynb - - notebooks/61_vector_to_gif.ipynb - - notebooks/62_folium_colorbar.ipynb - - notebooks/63_arcgis.ipynb - - notebooks/64_stac_search.ipynb - - notebooks/65_sagemaker.ipynb - - notebooks/66_gradio.ipynb - - notebooks/67_maxar_open_data.ipynb - - notebooks/68_openaerialmap.ipynb - - notebooks/69_turkey_earthquake.ipynb - - notebooks/70_zonal_stats.ipynb - - notebooks/71_aws_s3.ipynb - - notebooks/72_timelapse.ipynb - - notebooks/73_custom_stac.ipynb - - notebooks/74_map_tiles_to_geotiff.ipynb - - notebooks/75_segment_anything.ipynb - - notebooks/76_image_comparison.ipynb - - notebooks/77_split_raster.ipynb - - notebooks/78_read_raster.ipynb - - notebooks/79_timeseries.ipynb - - notebooks/80_solar.ipynb - - notebooks/81_buildings.ipynb - - notebooks/82_pmtiles.ipynb - - notebooks/83_vector_viz.ipynb - - notebooks/84_read_parquet.ipynb - - notebooks/85_gedi.ipynb - - notebooks/86_add_markers.ipynb - - notebooks/87_actinia.ipynb - - notebooks/88_nasa_earth_data.ipynb - - notebooks/89_image_array_viz.ipynb - - notebooks/90_pixel_inspector.ipynb - - notebooks/91_raster_viz_gui.ipynb - - notebooks/92_maplibre.ipynb - - notebooks/93_maplibre_pmtiles.ipynb - - notebooks/94_mapbox.ipynb - - notebooks/95_edit_vector.ipynb - - notebooks/96_batch_edit_vector.ipynb - - notebooks/97_overture_data.ipynb - - notebooks/98_watershed.ipynb - - notebooks/99_wetlands.ipynb - - notebooks/100_nlcd.ipynb - - notebooks/101_nasa_opera.ipynb - - notebooks/102_fused.ipynb - - notebooks/103_raster_colormap.ipynb - - notebooks/104_point_style.ipynb - - notebooks/105_vector_time_slider.ipynb - - notebooks/106_aws_s3.ipynb - - notebooks/107_copernicus.ipynb - - notebooks/108_add_geotiff.ipynb - - notebooks/109_local_titiler.ipynb - - notebooks/110_polars.ipynb - - notebooks/111_zarr.ipynb - - notebooks/112_quackosm.ipynb - - notebooks/113_titiler_cmr.ipynb - - notebooks/114_nasa_fire.ipynb - - notebooks/115_terrascope.ipynb - - notebooks/116_hls_nasa_earthdata.ipynb diff --git a/requirements_docs.txt b/requirements_docs.txt index c4498b053a..ffbfd4bac6 100644 --- a/requirements_docs.txt +++ b/requirements_docs.txt @@ -6,14 +6,7 @@ flake8 grip ipykernel livereload -mkdocs -mkdocs-git-revision-date-localized-plugin -mkdocs-git-revision-date-plugin -mkdocs-jupyter>=0.26.3 -mkdocs-material>=9.1.3 -mkdocs-pdf-export-plugin mkdocstrings -mkdocstrings-crystal mkdocstrings-python nbconvert nbformat @@ -27,3 +20,4 @@ tox twine watchdog wheel +zensical diff --git a/scripts/convert_notebooks.py b/scripts/convert_notebooks.py new file mode 100644 index 0000000000..7a94397ea9 --- /dev/null +++ b/scripts/convert_notebooks.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python +"""Convert documentation notebooks to Markdown pages for the Zensical build. + +Zensical does not yet support the mkdocs-jupyter plugin, so this script is +run before ``zensical build`` to convert every notebook under ``docs/`` into +a Markdown page that Zensical can render natively. Stored cell outputs are +preserved, and extracted images are written to a ``_files`` +directory next to the generated Markdown file. The original ``.ipynb`` files +are left in place so that they are still copied to the built site and remain +downloadable. + +Usage: + python scripts/convert_notebooks.py +""" + +import concurrent.futures +import pathlib +import sys + +import nbformat +from nbconvert import MarkdownExporter +from nbconvert.writers import FilesWriter + +DOCS_DIR = pathlib.Path(__file__).resolve().parents[1] / "docs" +NOTEBOOK_DIRS = ["notebooks", "workshops", "maplibre"] + + +def convert_notebook(path: pathlib.Path) -> str: + """Convert a single notebook to a Markdown page next to it. + + Args: + path: Path to the ``.ipynb`` file to convert. + + Returns: + str: The path of the notebook that was converted, for logging. + """ + notebook = nbformat.read(str(path), as_version=4) + # Many notebooks are saved without language_info metadata, which nbconvert + # needs to emit language-tagged code fences for syntax highlighting. + notebook.metadata.setdefault("language_info", {"name": "python"}) + exporter = MarkdownExporter(exclude_input_prompt=True, exclude_output_prompt=True) + resources = {"output_files_dir": f"{path.stem}_files", "unique_key": path.stem} + body, resources = exporter.from_notebook_node(notebook, resources=resources) + writer = FilesWriter(build_directory=str(path.parent)) + writer.write(body, resources, notebook_name=path.stem) + return str(path.relative_to(DOCS_DIR)) + + +def main() -> None: + """Convert all notebooks in the documentation folders to Markdown.""" + notebooks = sorted( + nb for folder in NOTEBOOK_DIRS for nb in (DOCS_DIR / folder).glob("*.ipynb") + ) + if not notebooks: + sys.exit("No notebooks found to convert.") + + failures = [] + with concurrent.futures.ProcessPoolExecutor() as executor: + futures = {executor.submit(convert_notebook, nb): nb for nb in notebooks} + for future in concurrent.futures.as_completed(futures): + nb = futures[future] + try: + future.result() + except Exception as exc: # noqa: BLE001 + failures.append((nb, exc)) + print(f"FAILED: {nb}: {exc}", file=sys.stderr) + + print(f"Converted {len(notebooks) - len(failures)}/{len(notebooks)} notebooks.") + if failures: + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/zensical.toml b/zensical.toml new file mode 100644 index 0000000000..7c70cedca5 --- /dev/null +++ b/zensical.toml @@ -0,0 +1,345 @@ +[project] +site_name = "leafmap" +site_description = "A Python package for interactive mapping and geospatial analysis with minimal coding in a Jupyter environment" +site_author = "Qiusheng Wu" +site_url = "https://leafmap.org" +repo_url = "https://github.com/opengeos/leafmap" +copyright = "Copyright © 2021 - 2026 Qiusheng Wu" + +nav = [ + { "Home" = "index.md" }, + { "Book" = "https://book.leafmap.org" }, + { "Installation" = "installation.md" }, + { "Get Started" = "get-started.md" }, + { "Usage" = "notebooks/00_key_features.md" }, + { "Web App" = "https://huggingface.co/spaces/giswqs/solara-geospatial" }, + { "Tutorials" = "tutorials.md" }, + { "Contributing" = "contributing.md" }, + { "FAQ" = "faq.md" }, + { "Changelog" = "changelog.md" }, + { "YouTube Channel" = "https://youtube.com/@giswqs" }, + { "Report Issues" = "https://github.com/opengeos/leafmap/issues" }, + { "API Reference" = [ + { "basemaps module" = "basemaps.md" }, + { "bokehmap module" = "bokehmap.md" }, + { "colormaps module" = "colormaps.md" }, + { "common module" = "common.md" }, + { "deck module" = "deck.md" }, + { "deckgl module" = "deckgl.md" }, + { "download module" = "download.md" }, + { "examples module" = "examples.md" }, + { "fire module" = "fire.md" }, + { "foliumap module" = "foliumap.md" }, + { "kepler module" = "kepler.md" }, + { "maplibregl module" = "maplibregl.md" }, + { "leafmap module" = "leafmap.md" }, + { "legends module" = "legends.md" }, + { "map_widgets module" = "map_widgets.md" }, + { "osm module" = "osm.md" }, + { "pc module" = "pc.md" }, + { "plot module" = "plot.md" }, + { "plotlymap module" = "plotlymap.md" }, + { "pydeck module" = "deck.md" }, + { "stac module" = "stac.md" }, + { "terrascope module" = "terrascope.md" }, + { "toolbar module" = "toolbar.md" }, + ] }, + { "Workshops" = [ + "workshops/FOSS4G_2021.md", + "workshops/SIGSPATIAL_2021.md", + "workshops/YouthMappers_2021.md", + "workshops/ICRW_2023.md", + "workshops/EarthCube_2023.md", + "workshops/Taiwan_2024.md", + "workshops/HGAC_2024.md", + "workshops/CVPR_2025.md", + "workshops/AGU_2025.md", + ] }, + { "MapLibre" = [ + "maplibre/overview.md", + "maplibre/3d_buildings.md", + "maplibre/3d_choropleth.md", + "maplibre/3d_indoor_mapping.md", + "maplibre/3d_pmtiles.md", + "maplibre/3d_style.md", + "maplibre/3d_terrain.md", + "maplibre/add_3d_buildings.md", + "maplibre/add_a_marker.md", + "maplibre/add_colorbar.md", + "maplibre/add_components.md", + "maplibre/add_deckgl_layer.md", + "maplibre/add_gif.md", + "maplibre/add_html.md", + "maplibre/add_icon.md", + "maplibre/add_image.md", + "maplibre/add_image_generated.md", + "maplibre/add_labels.md", + "maplibre/add_legend.md", + "maplibre/add_logo.md", + "maplibre/add_text.md", + "maplibre/AlphaEarth.md", + "maplibre/animate_a_line.md", + "maplibre/animate_camera_around_point.md", + "maplibre/animate_images.md", + "maplibre/animate_point_along_line.md", + "maplibre/animate_point_along_route.md", + "maplibre/arc_layer.md", + "maplibre/attribution_position.md", + "maplibre/basemaps.md", + "maplibre/center_on_symbol.md", + "maplibre/change_building_color.md", + "maplibre/change_case_of_labels.md", + "maplibre/choropleth.md", + "maplibre/cloud_optimized_geotiff.md", + "maplibre/cluster.md", + "maplibre/color_switcher.md", + "maplibre/copernicus.md", + "maplibre/countries_filter.md", + "maplibre/create_vector.md", + "maplibre/custom_marker.md", + "maplibre/dashboard.md", + "maplibre/data_driven_lines.md", + "maplibre/disable_scroll_zoom.md", + "maplibre/display_rich_text.md", + "maplibre/drag_a_marker.md", + "maplibre/draw_features.md", + "maplibre/duckdb_layer.md", + "maplibre/edit_vector.md", + "maplibre/fallback_image.md", + "maplibre/fields_of_the_world.md", + "maplibre/fit_bounds.md", + "maplibre/fill_pattern.md", + "maplibre/floating_sidebar.md", + "maplibre/fly_to.md", + "maplibre/fly_to_options.md", + "maplibre/fullscreen.md", + "maplibre/geojson_layer_in_stack.md", + "maplibre/geojson_line.md", + "maplibre/geojson_points.md", + "maplibre/geojson_polygon.md", + "maplibre/geopandas.md", + "maplibre/globe_control.md", + "maplibre/google_earth.md", + "maplibre/google_earth_engine.md", + "maplibre/gps_trace.md", + "maplibre/H3.md", + "maplibre/heatmap_layer.md", + "maplibre/historical_imagery.md", + "maplibre/housing_prices.md", + "maplibre/interactive_false.md", + "maplibre/jump_to.md", + "maplibre/language_switch.md", + "maplibre/latlon_grid.md", + "maplibre/layer_control.md", + "maplibre/layer_groups.md", + "maplibre/layer_manager.md", + "maplibre/layer_styling.md", + "maplibre/line_gradient.md", + "maplibre/live_geojson.md", + "maplibre/live_update_feature.md", + "maplibre/local_geojson.md", + "maplibre/local_raster.md", + "maplibre/local_titiler.md", + "maplibre/locate_user.md", + "maplibre/map_tiles.md", + "maplibre/mapillary.md", + "maplibre/maptiler_styles.md", + "maplibre/MGRS.md", + "maplibre/mouse_position.md", + "maplibre/multiple_geometries.md", + "maplibre/nasa_opera.md", + "maplibre/navigation.md", + "maplibre/ocean_bathymetry.md", + "maplibre/openfreemap.md", + "maplibre/openstreetmap.md", + "maplibre/overture.md", + "maplibre/pmtiles.md", + "maplibre/restrict_bounds.md", + "maplibre/satellite_map.md", + "maplibre/search_control.md", + "maplibre/set_pitch_bearing.md", + "maplibre/set_terrain.md", + "maplibre/sidebar.md", + "maplibre/similarity_search.md", + "maplibre/stac.md", + "maplibre/time_slider.md", + "maplibre/to_html.md", + "maplibre/variable_label_placement.md", + "maplibre/variable_offset_label_placement.md", + "maplibre/vector_tile.md", + "maplibre/video_on_a_map.md", + "maplibre/visualize_population_density.md", + "maplibre/wms_source.md", + "maplibre/wms_to_geotiff.md", + "maplibre/zoom_to_linestring.md", + ] }, + { "Notebooks" = [ + "notebooks/00_key_features.md", + "notebooks/01_leafmap_intro.md", + "notebooks/02_using_basemaps.md", + "notebooks/03_cog_stac.md", + "notebooks/04_cog_mosaic.md", + "notebooks/05_load_raster.md", + "notebooks/06_legend.md", + "notebooks/07_colorbar.md", + "notebooks/08_whitebox.md", + "notebooks/09_csv_to_points.md", + "notebooks/10_add_vector.md", + "notebooks/11_linked_maps.md", + "notebooks/12_split_map.md", + "notebooks/13_geopandas.md", + "notebooks/14_postgis.md", + "notebooks/15_openstreetmap.md", + "notebooks/16_heremap.md", + "notebooks/17_vector_tile_layer.md", + "notebooks/18_point_layer.md", + "notebooks/19_map_to_html.md", + "notebooks/20_planet_imagery.md", + "notebooks/21_ts_inspector.md", + "notebooks/22_time_slider.md", + "notebooks/23_colormaps.md", + "notebooks/24_heatmap.md", + "notebooks/25_map_title.md", + "notebooks/26_kepler_gl.md", + "notebooks/27_basemap_gallery.md", + "notebooks/28_publish_map.md", + "notebooks/29_pydeck.md", + "notebooks/30_census_data.md", + "notebooks/31_search_basemaps.md", + "notebooks/32_local_tile.md", + "notebooks/33_image_overlay.md", + "notebooks/34_add_points_from_xy.md", + "notebooks/35_circle_markers.md", + "notebooks/36_add_labels.md", + "notebooks/37_planetary_computer.md", + "notebooks/38_plotly.md", + "notebooks/39_inspector_tool.md", + "notebooks/40_plotly_gui.md", + "notebooks/41_raster_gui.md", + "notebooks/42_create_cog.md", + "notebooks/43_search_control.md", + "notebooks/44_attribute_table.md", + "notebooks/45_create_vector.md", + "notebooks/46_edit_vector.md", + "notebooks/47_numpy_to_cog.md", + "notebooks/48_lidar.md", + "notebooks/49_split_control.md", + "notebooks/50_marker_cluster.md", + "notebooks/51_clip_image.md", + "notebooks/52_netcdf.md", + "notebooks/53_choropleth.md", + "notebooks/54_plot_raster.md", + "notebooks/55_lidar.md", + "notebooks/56_download_ned.md", + "notebooks/57_national_map.md", + "notebooks/58_bokeh.md", + "notebooks/59_create_legend.md", + "notebooks/60_add_widget.md", + "notebooks/61_vector_to_gif.md", + "notebooks/62_folium_colorbar.md", + "notebooks/63_arcgis.md", + "notebooks/64_stac_search.md", + "notebooks/65_sagemaker.md", + "notebooks/66_gradio.md", + "notebooks/67_maxar_open_data.md", + "notebooks/68_openaerialmap.md", + "notebooks/69_turkey_earthquake.md", + "notebooks/70_zonal_stats.md", + "notebooks/71_aws_s3.md", + "notebooks/72_timelapse.md", + "notebooks/73_custom_stac.md", + "notebooks/74_map_tiles_to_geotiff.md", + "notebooks/75_segment_anything.md", + "notebooks/76_image_comparison.md", + "notebooks/77_split_raster.md", + "notebooks/78_read_raster.md", + "notebooks/79_timeseries.md", + "notebooks/80_solar.md", + "notebooks/81_buildings.md", + "notebooks/82_pmtiles.md", + "notebooks/83_vector_viz.md", + "notebooks/84_read_parquet.md", + "notebooks/85_gedi.md", + "notebooks/86_add_markers.md", + "notebooks/87_actinia.md", + "notebooks/88_nasa_earth_data.md", + "notebooks/89_image_array_viz.md", + "notebooks/90_pixel_inspector.md", + "notebooks/91_raster_viz_gui.md", + "notebooks/92_maplibre.md", + "notebooks/93_maplibre_pmtiles.md", + "notebooks/94_mapbox.md", + "notebooks/95_edit_vector.md", + "notebooks/96_batch_edit_vector.md", + "notebooks/97_overture_data.md", + "notebooks/98_watershed.md", + "notebooks/99_wetlands.md", + "notebooks/100_nlcd.md", + "notebooks/101_nasa_opera.md", + "notebooks/102_fused.md", + "notebooks/103_raster_colormap.md", + "notebooks/104_point_style.md", + "notebooks/105_vector_time_slider.md", + "notebooks/106_aws_s3.md", + "notebooks/107_copernicus.md", + "notebooks/108_add_geotiff.md", + "notebooks/109_local_titiler.md", + "notebooks/110_polars.md", + "notebooks/111_zarr.md", + "notebooks/112_quackosm.md", + "notebooks/113_titiler_cmr.md", + "notebooks/114_nasa_fire.md", + "notebooks/115_terrascope.md", + "notebooks/116_hls_nasa_earthdata.md", + ] }, +] + +[project.theme] +logo = "assets/logo.png" +favicon = "assets/favicon.png" +features = [ + "content.code.copy", + "navigation.footer", + "navigation.instant", + "navigation.top", + "navigation.tracking", + "search.highlight", + "search.share", +] + +[project.theme.icon] +repo = "fontawesome/brands/github" + +[[project.theme.palette]] +scheme = "default" +toggle.icon = "material/toggle-switch-off-outline" +toggle.name = "Switch to dark mode" + +[[project.theme.palette]] +scheme = "slate" +primary = "indigo" +accent = "indigo" +toggle.icon = "material/toggle-switch" +toggle.name = "Switch to light mode" + +[project.plugins.mkdocstrings.handlers.python.options] +docstring_style = "google" +show_root_heading = true +show_source = false + +[project.extra.analytics] +provider = "google" +property = "G-B1C88N45QG" + +[project.markdown_extensions.abbr] +[project.markdown_extensions.admonition] +[project.markdown_extensions.attr_list] +[project.markdown_extensions.def_list] +[project.markdown_extensions.footnotes] +[project.markdown_extensions.meta] +[project.markdown_extensions.md_in_html] +[project.markdown_extensions.pymdownx.superfences] +[project.markdown_extensions.pymdownx.highlight] +linenums = true +[project.markdown_extensions.toc] +permalink = true From e006515582b7f910a595cd2254188613636767e4 Mon Sep 17 00:00:00 2001 From: Qiusheng Wu Date: Mon, 6 Jul 2026 16:50:46 -0400 Subject: [PATCH 2/5] fix: pin tomli below 2.2 and add gh-pages deploy permissions tomli 2.2+ ships mypyc-compiled wheels that crash with "extension module 'tomli' is already cached" on Python 3.13 when imported by zensical (https://github.com/python/cpython/issues/123880), breaking the docs build in CI. Also grant the docs deploy job contents:write explicitly so peaceiris/actions-gh-pages can push to gh-pages under least-privilege token settings. --- .github/workflows/docs.yml | 2 ++ requirements_docs.txt | 3 +++ 2 files changed, 5 insertions(+) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index d0a690bd55..69068ce469 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -8,6 +8,8 @@ on: jobs: deploy: runs-on: ubuntu-latest + permissions: + contents: write strategy: matrix: python-version: ["3.13"] diff --git a/requirements_docs.txt b/requirements_docs.txt index ffbfd4bac6..7329994244 100644 --- a/requirements_docs.txt +++ b/requirements_docs.txt @@ -16,6 +16,9 @@ pygments pymdown-extensions PyYAML sphinx +# tomli>=2.2 ships mypyc-compiled wheels that crash on Python 3.13 when +# imported by zensical (https://github.com/python/cpython/issues/123880) +tomli<2.2 tox twine watchdog From 8708c6e07b224256d1067c3974a72acaadb6413e Mon Sep 17 00:00:00 2001 From: Qiusheng Wu Date: Mon, 6 Jul 2026 16:54:26 -0400 Subject: [PATCH 3/5] Address CodeRabbit review feedback - Pin peaceiris/actions-gh-pages to the v4.0.0 commit SHA to reduce supply-chain risk from mutable tags. --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 69068ce469..e6b61798b8 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -67,7 +67,7 @@ jobs: .venv/bin/zensical build - name: Deploy to GitHub Pages - uses: peaceiris/actions-gh-pages@v4 + uses: peaceiris/actions-gh-pages@84c30a85c19949d7eee79c4ff27748b70285e453 # v4.0.0 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./site From a276921c7900b4dcb6b805db6c2005400c89129b Mon Sep 17 00:00:00 2001 From: Qiusheng Wu Date: Mon, 6 Jul 2026 16:56:02 -0400 Subject: [PATCH 4/5] Address CodeRabbit review feedback - Document why the docs deploy job needs contents: write. --- .github/workflows/docs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index e6b61798b8..e8c6be9146 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -8,6 +8,7 @@ on: jobs: deploy: runs-on: ubuntu-latest + # Required so peaceiris/actions-gh-pages can push the built site to gh-pages. permissions: contents: write strategy: From f0f82416b7c9e53a39008100a566960564720204 Mon Sep 17 00:00:00 2001 From: Qiusheng Wu Date: Mon, 6 Jul 2026 16:59:23 -0400 Subject: [PATCH 5/5] fix: use notebook filenames as nav titles for consistency Zensical derives nav titles from a page's first H1 when present and the filename otherwise, producing a mixed navigation menu. Set explicit filename-based titles on all notebook-derived nav entries. --- zensical.toml | 484 +++++++++++++++++++++++++------------------------- 1 file changed, 242 insertions(+), 242 deletions(-) diff --git a/zensical.toml b/zensical.toml index 7c70cedca5..6256d4254f 100644 --- a/zensical.toml +++ b/zensical.toml @@ -45,252 +45,252 @@ nav = [ { "toolbar module" = "toolbar.md" }, ] }, { "Workshops" = [ - "workshops/FOSS4G_2021.md", - "workshops/SIGSPATIAL_2021.md", - "workshops/YouthMappers_2021.md", - "workshops/ICRW_2023.md", - "workshops/EarthCube_2023.md", - "workshops/Taiwan_2024.md", - "workshops/HGAC_2024.md", - "workshops/CVPR_2025.md", - "workshops/AGU_2025.md", + { "FOSS4G_2021" = "workshops/FOSS4G_2021.md" }, + { "SIGSPATIAL_2021" = "workshops/SIGSPATIAL_2021.md" }, + { "YouthMappers_2021" = "workshops/YouthMappers_2021.md" }, + { "ICRW_2023" = "workshops/ICRW_2023.md" }, + { "EarthCube_2023" = "workshops/EarthCube_2023.md" }, + { "Taiwan_2024" = "workshops/Taiwan_2024.md" }, + { "HGAC_2024" = "workshops/HGAC_2024.md" }, + { "CVPR_2025" = "workshops/CVPR_2025.md" }, + { "AGU_2025" = "workshops/AGU_2025.md" }, ] }, { "MapLibre" = [ - "maplibre/overview.md", - "maplibre/3d_buildings.md", - "maplibre/3d_choropleth.md", - "maplibre/3d_indoor_mapping.md", - "maplibre/3d_pmtiles.md", - "maplibre/3d_style.md", - "maplibre/3d_terrain.md", - "maplibre/add_3d_buildings.md", - "maplibre/add_a_marker.md", - "maplibre/add_colorbar.md", - "maplibre/add_components.md", - "maplibre/add_deckgl_layer.md", - "maplibre/add_gif.md", - "maplibre/add_html.md", - "maplibre/add_icon.md", - "maplibre/add_image.md", - "maplibre/add_image_generated.md", - "maplibre/add_labels.md", - "maplibre/add_legend.md", - "maplibre/add_logo.md", - "maplibre/add_text.md", - "maplibre/AlphaEarth.md", - "maplibre/animate_a_line.md", - "maplibre/animate_camera_around_point.md", - "maplibre/animate_images.md", - "maplibre/animate_point_along_line.md", - "maplibre/animate_point_along_route.md", - "maplibre/arc_layer.md", - "maplibre/attribution_position.md", - "maplibre/basemaps.md", - "maplibre/center_on_symbol.md", - "maplibre/change_building_color.md", - "maplibre/change_case_of_labels.md", - "maplibre/choropleth.md", - "maplibre/cloud_optimized_geotiff.md", - "maplibre/cluster.md", - "maplibre/color_switcher.md", - "maplibre/copernicus.md", - "maplibre/countries_filter.md", - "maplibre/create_vector.md", - "maplibre/custom_marker.md", - "maplibre/dashboard.md", - "maplibre/data_driven_lines.md", - "maplibre/disable_scroll_zoom.md", - "maplibre/display_rich_text.md", - "maplibre/drag_a_marker.md", - "maplibre/draw_features.md", - "maplibre/duckdb_layer.md", - "maplibre/edit_vector.md", - "maplibre/fallback_image.md", - "maplibre/fields_of_the_world.md", - "maplibre/fit_bounds.md", - "maplibre/fill_pattern.md", - "maplibre/floating_sidebar.md", - "maplibre/fly_to.md", - "maplibre/fly_to_options.md", - "maplibre/fullscreen.md", - "maplibre/geojson_layer_in_stack.md", - "maplibre/geojson_line.md", - "maplibre/geojson_points.md", - "maplibre/geojson_polygon.md", - "maplibre/geopandas.md", - "maplibre/globe_control.md", - "maplibre/google_earth.md", - "maplibre/google_earth_engine.md", - "maplibre/gps_trace.md", - "maplibre/H3.md", - "maplibre/heatmap_layer.md", - "maplibre/historical_imagery.md", - "maplibre/housing_prices.md", - "maplibre/interactive_false.md", - "maplibre/jump_to.md", - "maplibre/language_switch.md", - "maplibre/latlon_grid.md", - "maplibre/layer_control.md", - "maplibre/layer_groups.md", - "maplibre/layer_manager.md", - "maplibre/layer_styling.md", - "maplibre/line_gradient.md", - "maplibre/live_geojson.md", - "maplibre/live_update_feature.md", - "maplibre/local_geojson.md", - "maplibre/local_raster.md", - "maplibre/local_titiler.md", - "maplibre/locate_user.md", - "maplibre/map_tiles.md", - "maplibre/mapillary.md", - "maplibre/maptiler_styles.md", - "maplibre/MGRS.md", - "maplibre/mouse_position.md", - "maplibre/multiple_geometries.md", - "maplibre/nasa_opera.md", - "maplibre/navigation.md", - "maplibre/ocean_bathymetry.md", - "maplibre/openfreemap.md", - "maplibre/openstreetmap.md", - "maplibre/overture.md", - "maplibre/pmtiles.md", - "maplibre/restrict_bounds.md", - "maplibre/satellite_map.md", - "maplibre/search_control.md", - "maplibre/set_pitch_bearing.md", - "maplibre/set_terrain.md", - "maplibre/sidebar.md", - "maplibre/similarity_search.md", - "maplibre/stac.md", - "maplibre/time_slider.md", - "maplibre/to_html.md", - "maplibre/variable_label_placement.md", - "maplibre/variable_offset_label_placement.md", - "maplibre/vector_tile.md", - "maplibre/video_on_a_map.md", - "maplibre/visualize_population_density.md", - "maplibre/wms_source.md", - "maplibre/wms_to_geotiff.md", - "maplibre/zoom_to_linestring.md", + { "overview" = "maplibre/overview.md" }, + { "3d_buildings" = "maplibre/3d_buildings.md" }, + { "3d_choropleth" = "maplibre/3d_choropleth.md" }, + { "3d_indoor_mapping" = "maplibre/3d_indoor_mapping.md" }, + { "3d_pmtiles" = "maplibre/3d_pmtiles.md" }, + { "3d_style" = "maplibre/3d_style.md" }, + { "3d_terrain" = "maplibre/3d_terrain.md" }, + { "add_3d_buildings" = "maplibre/add_3d_buildings.md" }, + { "add_a_marker" = "maplibre/add_a_marker.md" }, + { "add_colorbar" = "maplibre/add_colorbar.md" }, + { "add_components" = "maplibre/add_components.md" }, + { "add_deckgl_layer" = "maplibre/add_deckgl_layer.md" }, + { "add_gif" = "maplibre/add_gif.md" }, + { "add_html" = "maplibre/add_html.md" }, + { "add_icon" = "maplibre/add_icon.md" }, + { "add_image" = "maplibre/add_image.md" }, + { "add_image_generated" = "maplibre/add_image_generated.md" }, + { "add_labels" = "maplibre/add_labels.md" }, + { "add_legend" = "maplibre/add_legend.md" }, + { "add_logo" = "maplibre/add_logo.md" }, + { "add_text" = "maplibre/add_text.md" }, + { "AlphaEarth" = "maplibre/AlphaEarth.md" }, + { "animate_a_line" = "maplibre/animate_a_line.md" }, + { "animate_camera_around_point" = "maplibre/animate_camera_around_point.md" }, + { "animate_images" = "maplibre/animate_images.md" }, + { "animate_point_along_line" = "maplibre/animate_point_along_line.md" }, + { "animate_point_along_route" = "maplibre/animate_point_along_route.md" }, + { "arc_layer" = "maplibre/arc_layer.md" }, + { "attribution_position" = "maplibre/attribution_position.md" }, + { "basemaps" = "maplibre/basemaps.md" }, + { "center_on_symbol" = "maplibre/center_on_symbol.md" }, + { "change_building_color" = "maplibre/change_building_color.md" }, + { "change_case_of_labels" = "maplibre/change_case_of_labels.md" }, + { "choropleth" = "maplibre/choropleth.md" }, + { "cloud_optimized_geotiff" = "maplibre/cloud_optimized_geotiff.md" }, + { "cluster" = "maplibre/cluster.md" }, + { "color_switcher" = "maplibre/color_switcher.md" }, + { "copernicus" = "maplibre/copernicus.md" }, + { "countries_filter" = "maplibre/countries_filter.md" }, + { "create_vector" = "maplibre/create_vector.md" }, + { "custom_marker" = "maplibre/custom_marker.md" }, + { "dashboard" = "maplibre/dashboard.md" }, + { "data_driven_lines" = "maplibre/data_driven_lines.md" }, + { "disable_scroll_zoom" = "maplibre/disable_scroll_zoom.md" }, + { "display_rich_text" = "maplibre/display_rich_text.md" }, + { "drag_a_marker" = "maplibre/drag_a_marker.md" }, + { "draw_features" = "maplibre/draw_features.md" }, + { "duckdb_layer" = "maplibre/duckdb_layer.md" }, + { "edit_vector" = "maplibre/edit_vector.md" }, + { "fallback_image" = "maplibre/fallback_image.md" }, + { "fields_of_the_world" = "maplibre/fields_of_the_world.md" }, + { "fit_bounds" = "maplibre/fit_bounds.md" }, + { "fill_pattern" = "maplibre/fill_pattern.md" }, + { "floating_sidebar" = "maplibre/floating_sidebar.md" }, + { "fly_to" = "maplibre/fly_to.md" }, + { "fly_to_options" = "maplibre/fly_to_options.md" }, + { "fullscreen" = "maplibre/fullscreen.md" }, + { "geojson_layer_in_stack" = "maplibre/geojson_layer_in_stack.md" }, + { "geojson_line" = "maplibre/geojson_line.md" }, + { "geojson_points" = "maplibre/geojson_points.md" }, + { "geojson_polygon" = "maplibre/geojson_polygon.md" }, + { "geopandas" = "maplibre/geopandas.md" }, + { "globe_control" = "maplibre/globe_control.md" }, + { "google_earth" = "maplibre/google_earth.md" }, + { "google_earth_engine" = "maplibre/google_earth_engine.md" }, + { "gps_trace" = "maplibre/gps_trace.md" }, + { "H3" = "maplibre/H3.md" }, + { "heatmap_layer" = "maplibre/heatmap_layer.md" }, + { "historical_imagery" = "maplibre/historical_imagery.md" }, + { "housing_prices" = "maplibre/housing_prices.md" }, + { "interactive_false" = "maplibre/interactive_false.md" }, + { "jump_to" = "maplibre/jump_to.md" }, + { "language_switch" = "maplibre/language_switch.md" }, + { "latlon_grid" = "maplibre/latlon_grid.md" }, + { "layer_control" = "maplibre/layer_control.md" }, + { "layer_groups" = "maplibre/layer_groups.md" }, + { "layer_manager" = "maplibre/layer_manager.md" }, + { "layer_styling" = "maplibre/layer_styling.md" }, + { "line_gradient" = "maplibre/line_gradient.md" }, + { "live_geojson" = "maplibre/live_geojson.md" }, + { "live_update_feature" = "maplibre/live_update_feature.md" }, + { "local_geojson" = "maplibre/local_geojson.md" }, + { "local_raster" = "maplibre/local_raster.md" }, + { "local_titiler" = "maplibre/local_titiler.md" }, + { "locate_user" = "maplibre/locate_user.md" }, + { "map_tiles" = "maplibre/map_tiles.md" }, + { "mapillary" = "maplibre/mapillary.md" }, + { "maptiler_styles" = "maplibre/maptiler_styles.md" }, + { "MGRS" = "maplibre/MGRS.md" }, + { "mouse_position" = "maplibre/mouse_position.md" }, + { "multiple_geometries" = "maplibre/multiple_geometries.md" }, + { "nasa_opera" = "maplibre/nasa_opera.md" }, + { "navigation" = "maplibre/navigation.md" }, + { "ocean_bathymetry" = "maplibre/ocean_bathymetry.md" }, + { "openfreemap" = "maplibre/openfreemap.md" }, + { "openstreetmap" = "maplibre/openstreetmap.md" }, + { "overture" = "maplibre/overture.md" }, + { "pmtiles" = "maplibre/pmtiles.md" }, + { "restrict_bounds" = "maplibre/restrict_bounds.md" }, + { "satellite_map" = "maplibre/satellite_map.md" }, + { "search_control" = "maplibre/search_control.md" }, + { "set_pitch_bearing" = "maplibre/set_pitch_bearing.md" }, + { "set_terrain" = "maplibre/set_terrain.md" }, + { "sidebar" = "maplibre/sidebar.md" }, + { "similarity_search" = "maplibre/similarity_search.md" }, + { "stac" = "maplibre/stac.md" }, + { "time_slider" = "maplibre/time_slider.md" }, + { "to_html" = "maplibre/to_html.md" }, + { "variable_label_placement" = "maplibre/variable_label_placement.md" }, + { "variable_offset_label_placement" = "maplibre/variable_offset_label_placement.md" }, + { "vector_tile" = "maplibre/vector_tile.md" }, + { "video_on_a_map" = "maplibre/video_on_a_map.md" }, + { "visualize_population_density" = "maplibre/visualize_population_density.md" }, + { "wms_source" = "maplibre/wms_source.md" }, + { "wms_to_geotiff" = "maplibre/wms_to_geotiff.md" }, + { "zoom_to_linestring" = "maplibre/zoom_to_linestring.md" }, ] }, { "Notebooks" = [ - "notebooks/00_key_features.md", - "notebooks/01_leafmap_intro.md", - "notebooks/02_using_basemaps.md", - "notebooks/03_cog_stac.md", - "notebooks/04_cog_mosaic.md", - "notebooks/05_load_raster.md", - "notebooks/06_legend.md", - "notebooks/07_colorbar.md", - "notebooks/08_whitebox.md", - "notebooks/09_csv_to_points.md", - "notebooks/10_add_vector.md", - "notebooks/11_linked_maps.md", - "notebooks/12_split_map.md", - "notebooks/13_geopandas.md", - "notebooks/14_postgis.md", - "notebooks/15_openstreetmap.md", - "notebooks/16_heremap.md", - "notebooks/17_vector_tile_layer.md", - "notebooks/18_point_layer.md", - "notebooks/19_map_to_html.md", - "notebooks/20_planet_imagery.md", - "notebooks/21_ts_inspector.md", - "notebooks/22_time_slider.md", - "notebooks/23_colormaps.md", - "notebooks/24_heatmap.md", - "notebooks/25_map_title.md", - "notebooks/26_kepler_gl.md", - "notebooks/27_basemap_gallery.md", - "notebooks/28_publish_map.md", - "notebooks/29_pydeck.md", - "notebooks/30_census_data.md", - "notebooks/31_search_basemaps.md", - "notebooks/32_local_tile.md", - "notebooks/33_image_overlay.md", - "notebooks/34_add_points_from_xy.md", - "notebooks/35_circle_markers.md", - "notebooks/36_add_labels.md", - "notebooks/37_planetary_computer.md", - "notebooks/38_plotly.md", - "notebooks/39_inspector_tool.md", - "notebooks/40_plotly_gui.md", - "notebooks/41_raster_gui.md", - "notebooks/42_create_cog.md", - "notebooks/43_search_control.md", - "notebooks/44_attribute_table.md", - "notebooks/45_create_vector.md", - "notebooks/46_edit_vector.md", - "notebooks/47_numpy_to_cog.md", - "notebooks/48_lidar.md", - "notebooks/49_split_control.md", - "notebooks/50_marker_cluster.md", - "notebooks/51_clip_image.md", - "notebooks/52_netcdf.md", - "notebooks/53_choropleth.md", - "notebooks/54_plot_raster.md", - "notebooks/55_lidar.md", - "notebooks/56_download_ned.md", - "notebooks/57_national_map.md", - "notebooks/58_bokeh.md", - "notebooks/59_create_legend.md", - "notebooks/60_add_widget.md", - "notebooks/61_vector_to_gif.md", - "notebooks/62_folium_colorbar.md", - "notebooks/63_arcgis.md", - "notebooks/64_stac_search.md", - "notebooks/65_sagemaker.md", - "notebooks/66_gradio.md", - "notebooks/67_maxar_open_data.md", - "notebooks/68_openaerialmap.md", - "notebooks/69_turkey_earthquake.md", - "notebooks/70_zonal_stats.md", - "notebooks/71_aws_s3.md", - "notebooks/72_timelapse.md", - "notebooks/73_custom_stac.md", - "notebooks/74_map_tiles_to_geotiff.md", - "notebooks/75_segment_anything.md", - "notebooks/76_image_comparison.md", - "notebooks/77_split_raster.md", - "notebooks/78_read_raster.md", - "notebooks/79_timeseries.md", - "notebooks/80_solar.md", - "notebooks/81_buildings.md", - "notebooks/82_pmtiles.md", - "notebooks/83_vector_viz.md", - "notebooks/84_read_parquet.md", - "notebooks/85_gedi.md", - "notebooks/86_add_markers.md", - "notebooks/87_actinia.md", - "notebooks/88_nasa_earth_data.md", - "notebooks/89_image_array_viz.md", - "notebooks/90_pixel_inspector.md", - "notebooks/91_raster_viz_gui.md", - "notebooks/92_maplibre.md", - "notebooks/93_maplibre_pmtiles.md", - "notebooks/94_mapbox.md", - "notebooks/95_edit_vector.md", - "notebooks/96_batch_edit_vector.md", - "notebooks/97_overture_data.md", - "notebooks/98_watershed.md", - "notebooks/99_wetlands.md", - "notebooks/100_nlcd.md", - "notebooks/101_nasa_opera.md", - "notebooks/102_fused.md", - "notebooks/103_raster_colormap.md", - "notebooks/104_point_style.md", - "notebooks/105_vector_time_slider.md", - "notebooks/106_aws_s3.md", - "notebooks/107_copernicus.md", - "notebooks/108_add_geotiff.md", - "notebooks/109_local_titiler.md", - "notebooks/110_polars.md", - "notebooks/111_zarr.md", - "notebooks/112_quackosm.md", - "notebooks/113_titiler_cmr.md", - "notebooks/114_nasa_fire.md", - "notebooks/115_terrascope.md", - "notebooks/116_hls_nasa_earthdata.md", + { "00_key_features" = "notebooks/00_key_features.md" }, + { "01_leafmap_intro" = "notebooks/01_leafmap_intro.md" }, + { "02_using_basemaps" = "notebooks/02_using_basemaps.md" }, + { "03_cog_stac" = "notebooks/03_cog_stac.md" }, + { "04_cog_mosaic" = "notebooks/04_cog_mosaic.md" }, + { "05_load_raster" = "notebooks/05_load_raster.md" }, + { "06_legend" = "notebooks/06_legend.md" }, + { "07_colorbar" = "notebooks/07_colorbar.md" }, + { "08_whitebox" = "notebooks/08_whitebox.md" }, + { "09_csv_to_points" = "notebooks/09_csv_to_points.md" }, + { "10_add_vector" = "notebooks/10_add_vector.md" }, + { "11_linked_maps" = "notebooks/11_linked_maps.md" }, + { "12_split_map" = "notebooks/12_split_map.md" }, + { "13_geopandas" = "notebooks/13_geopandas.md" }, + { "14_postgis" = "notebooks/14_postgis.md" }, + { "15_openstreetmap" = "notebooks/15_openstreetmap.md" }, + { "16_heremap" = "notebooks/16_heremap.md" }, + { "17_vector_tile_layer" = "notebooks/17_vector_tile_layer.md" }, + { "18_point_layer" = "notebooks/18_point_layer.md" }, + { "19_map_to_html" = "notebooks/19_map_to_html.md" }, + { "20_planet_imagery" = "notebooks/20_planet_imagery.md" }, + { "21_ts_inspector" = "notebooks/21_ts_inspector.md" }, + { "22_time_slider" = "notebooks/22_time_slider.md" }, + { "23_colormaps" = "notebooks/23_colormaps.md" }, + { "24_heatmap" = "notebooks/24_heatmap.md" }, + { "25_map_title" = "notebooks/25_map_title.md" }, + { "26_kepler_gl" = "notebooks/26_kepler_gl.md" }, + { "27_basemap_gallery" = "notebooks/27_basemap_gallery.md" }, + { "28_publish_map" = "notebooks/28_publish_map.md" }, + { "29_pydeck" = "notebooks/29_pydeck.md" }, + { "30_census_data" = "notebooks/30_census_data.md" }, + { "31_search_basemaps" = "notebooks/31_search_basemaps.md" }, + { "32_local_tile" = "notebooks/32_local_tile.md" }, + { "33_image_overlay" = "notebooks/33_image_overlay.md" }, + { "34_add_points_from_xy" = "notebooks/34_add_points_from_xy.md" }, + { "35_circle_markers" = "notebooks/35_circle_markers.md" }, + { "36_add_labels" = "notebooks/36_add_labels.md" }, + { "37_planetary_computer" = "notebooks/37_planetary_computer.md" }, + { "38_plotly" = "notebooks/38_plotly.md" }, + { "39_inspector_tool" = "notebooks/39_inspector_tool.md" }, + { "40_plotly_gui" = "notebooks/40_plotly_gui.md" }, + { "41_raster_gui" = "notebooks/41_raster_gui.md" }, + { "42_create_cog" = "notebooks/42_create_cog.md" }, + { "43_search_control" = "notebooks/43_search_control.md" }, + { "44_attribute_table" = "notebooks/44_attribute_table.md" }, + { "45_create_vector" = "notebooks/45_create_vector.md" }, + { "46_edit_vector" = "notebooks/46_edit_vector.md" }, + { "47_numpy_to_cog" = "notebooks/47_numpy_to_cog.md" }, + { "48_lidar" = "notebooks/48_lidar.md" }, + { "49_split_control" = "notebooks/49_split_control.md" }, + { "50_marker_cluster" = "notebooks/50_marker_cluster.md" }, + { "51_clip_image" = "notebooks/51_clip_image.md" }, + { "52_netcdf" = "notebooks/52_netcdf.md" }, + { "53_choropleth" = "notebooks/53_choropleth.md" }, + { "54_plot_raster" = "notebooks/54_plot_raster.md" }, + { "55_lidar" = "notebooks/55_lidar.md" }, + { "56_download_ned" = "notebooks/56_download_ned.md" }, + { "57_national_map" = "notebooks/57_national_map.md" }, + { "58_bokeh" = "notebooks/58_bokeh.md" }, + { "59_create_legend" = "notebooks/59_create_legend.md" }, + { "60_add_widget" = "notebooks/60_add_widget.md" }, + { "61_vector_to_gif" = "notebooks/61_vector_to_gif.md" }, + { "62_folium_colorbar" = "notebooks/62_folium_colorbar.md" }, + { "63_arcgis" = "notebooks/63_arcgis.md" }, + { "64_stac_search" = "notebooks/64_stac_search.md" }, + { "65_sagemaker" = "notebooks/65_sagemaker.md" }, + { "66_gradio" = "notebooks/66_gradio.md" }, + { "67_maxar_open_data" = "notebooks/67_maxar_open_data.md" }, + { "68_openaerialmap" = "notebooks/68_openaerialmap.md" }, + { "69_turkey_earthquake" = "notebooks/69_turkey_earthquake.md" }, + { "70_zonal_stats" = "notebooks/70_zonal_stats.md" }, + { "71_aws_s3" = "notebooks/71_aws_s3.md" }, + { "72_timelapse" = "notebooks/72_timelapse.md" }, + { "73_custom_stac" = "notebooks/73_custom_stac.md" }, + { "74_map_tiles_to_geotiff" = "notebooks/74_map_tiles_to_geotiff.md" }, + { "75_segment_anything" = "notebooks/75_segment_anything.md" }, + { "76_image_comparison" = "notebooks/76_image_comparison.md" }, + { "77_split_raster" = "notebooks/77_split_raster.md" }, + { "78_read_raster" = "notebooks/78_read_raster.md" }, + { "79_timeseries" = "notebooks/79_timeseries.md" }, + { "80_solar" = "notebooks/80_solar.md" }, + { "81_buildings" = "notebooks/81_buildings.md" }, + { "82_pmtiles" = "notebooks/82_pmtiles.md" }, + { "83_vector_viz" = "notebooks/83_vector_viz.md" }, + { "84_read_parquet" = "notebooks/84_read_parquet.md" }, + { "85_gedi" = "notebooks/85_gedi.md" }, + { "86_add_markers" = "notebooks/86_add_markers.md" }, + { "87_actinia" = "notebooks/87_actinia.md" }, + { "88_nasa_earth_data" = "notebooks/88_nasa_earth_data.md" }, + { "89_image_array_viz" = "notebooks/89_image_array_viz.md" }, + { "90_pixel_inspector" = "notebooks/90_pixel_inspector.md" }, + { "91_raster_viz_gui" = "notebooks/91_raster_viz_gui.md" }, + { "92_maplibre" = "notebooks/92_maplibre.md" }, + { "93_maplibre_pmtiles" = "notebooks/93_maplibre_pmtiles.md" }, + { "94_mapbox" = "notebooks/94_mapbox.md" }, + { "95_edit_vector" = "notebooks/95_edit_vector.md" }, + { "96_batch_edit_vector" = "notebooks/96_batch_edit_vector.md" }, + { "97_overture_data" = "notebooks/97_overture_data.md" }, + { "98_watershed" = "notebooks/98_watershed.md" }, + { "99_wetlands" = "notebooks/99_wetlands.md" }, + { "100_nlcd" = "notebooks/100_nlcd.md" }, + { "101_nasa_opera" = "notebooks/101_nasa_opera.md" }, + { "102_fused" = "notebooks/102_fused.md" }, + { "103_raster_colormap" = "notebooks/103_raster_colormap.md" }, + { "104_point_style" = "notebooks/104_point_style.md" }, + { "105_vector_time_slider" = "notebooks/105_vector_time_slider.md" }, + { "106_aws_s3" = "notebooks/106_aws_s3.md" }, + { "107_copernicus" = "notebooks/107_copernicus.md" }, + { "108_add_geotiff" = "notebooks/108_add_geotiff.md" }, + { "109_local_titiler" = "notebooks/109_local_titiler.md" }, + { "110_polars" = "notebooks/110_polars.md" }, + { "111_zarr" = "notebooks/111_zarr.md" }, + { "112_quackosm" = "notebooks/112_quackosm.md" }, + { "113_titiler_cmr" = "notebooks/113_titiler_cmr.md" }, + { "114_nasa_fire" = "notebooks/114_nasa_fire.md" }, + { "115_terrascope" = "notebooks/115_terrascope.md" }, + { "116_hls_nasa_earthdata" = "notebooks/116_hls_nasa_earthdata.md" }, ] }, ]