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..e8c6be9146 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -8,6 +8,9 @@ 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:
matrix:
python-version: ["3.13"]
@@ -58,7 +61,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@84c30a85c19949d7eee79c4ff27748b70285e453 # v4.0.0
+ 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..7329994244 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
@@ -23,7 +16,11 @@ 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
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..6256d4254f
--- /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" = [
+ { "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" = [
+ { "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" = [
+ { "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" },
+ ] },
+]
+
+[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