diff --git a/.github/workflows/draft-pdf.yml b/.github/workflows/draft-pdf.yml index e36bfbeaf..66a2996ef 100644 --- a/.github/workflows/draft-pdf.yml +++ b/.github/workflows/draft-pdf.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout uses: actions/checkout@v6 - name: Build draft PDF - uses: openjournals/openjournals-draft-action@master + uses: openjournals/openjournals-draft-action@v1 with: journal: joss paper-path: paper/paper.md diff --git a/paper/GeoJupyter.png b/paper/GeoJupyter.png new file mode 100644 index 000000000..0bfb0c43a Binary files /dev/null and b/paper/GeoJupyter.png differ diff --git a/paper/JupyterGIS-AI.png b/paper/JupyterGIS-AI.png new file mode 100644 index 000000000..543883503 Binary files /dev/null and b/paper/JupyterGIS-AI.png differ diff --git a/paper/JupyterGIS-CO2.png b/paper/JupyterGIS-CO2.png new file mode 100644 index 000000000..e8db8f780 Binary files /dev/null and b/paper/JupyterGIS-CO2.png differ diff --git a/paper/JupyterGIS-QGIS-support.png b/paper/JupyterGIS-QGIS-support.png new file mode 100644 index 000000000..f21d884d4 Binary files /dev/null and b/paper/JupyterGIS-QGIS-support.png differ diff --git a/paper/JupyterGIS-folow-mode.png b/paper/JupyterGIS-folow-mode.png new file mode 100644 index 000000000..af737b965 Binary files /dev/null and b/paper/JupyterGIS-folow-mode.png differ diff --git a/paper/JupyterGIS-processing.png b/paper/JupyterGIS-processing.png new file mode 100644 index 000000000..d5ff17920 Binary files /dev/null and b/paper/JupyterGIS-processing.png differ diff --git a/paper/JupyterGIS-python.png b/paper/JupyterGIS-python.png new file mode 100644 index 000000000..a7bdd46e1 Binary files /dev/null and b/paper/JupyterGIS-python.png differ diff --git a/paper/JupyterGIS-screenshot.png b/paper/JupyterGIS-screenshot.png new file mode 100644 index 000000000..555b40cdb Binary files /dev/null and b/paper/JupyterGIS-screenshot.png differ diff --git a/paper/JupyterGIS-symbology-cog.png b/paper/JupyterGIS-symbology-cog.png new file mode 100644 index 000000000..c2b84e66b Binary files /dev/null and b/paper/JupyterGIS-symbology-cog.png differ diff --git a/paper/JupyterGIS-symbology-colormap.png b/paper/JupyterGIS-symbology-colormap.png new file mode 100644 index 000000000..21f293426 Binary files /dev/null and b/paper/JupyterGIS-symbology-colormap.png differ diff --git a/paper/paper.bib b/paper/paper.bib index 556bd529f..c60facaf3 100644 --- a/paper/paper.bib +++ b/paper/paper.bib @@ -8,6 +8,41 @@ @software{QGIS2025 url = {https://qgis.org} } +@software{CONDAFORGE2025, + author = {conda-forge community}, + title = {The conda-forge Project: Community-based Software Distribution Built on the conda Package Format and Ecosystem}, + year = 2015, + publisher = {Zenodo}, + doi = {10.5281/zenodo.4774217}, + url = {https://conda-forge.org}, +} + +@article{OPENEO2021, + title = {The openEO API–Harmonising the Use of Earth Observation Cloud Services Using Virtual Data Cube Functionalities}, + volume = {13}, + ISSN = {2072-4292}, + url = {http://dx.doi.org/10.3390/rs13061125}, + DOI = {10.3390/rs13061125}, + number = {6}, + journal = {Remote Sensing}, + publisher = {MDPI AG}, + author = {Schramm, Matthias and Pebesma, Edzer and Milenković, Milutin and Foresta, Luca and Dries, Jeroen and Jacob, Alexander and Wagner, Wolfgang and Mohr, Matthias and Neteler, Markus and Kadunc, Miha and Miksa, Tomasz and Kempeneers, Pieter and Verbesselt, Jan and G\"{o}ßwein, Bernhard and Navacchi, Claudio and Lippens, Stefaan and Reiche, Johannes}, + year = {2021}, + month = mar, + pages = {1125} +} + +@InProceedings{CRDT2011, + author="Shapiro, Marc and Pregui{\c{c}}a, Nuno and Baquero, Carlos and Zawirski, Marek", + editor="D{\'e}fago, Xavier and Petit, Franck and Villain, Vincent", + title="Conflict-Free Replicated Data Types", + booktitle="Stabilization, Safety, and Security of Distributed Systems", + year="2011", + publisher="Springer Berlin Heidelberg", + address="Berlin, Heidelberg", + pages="386--400", +} + @inproceedings{YJS2015, author = {Kevin Jahns and others}, title = {Yjs: A Framework for Near Real-Time P2P Shared Editing on Arbitrary Data Types}, @@ -16,7 +51,7 @@ @inproceedings{YJS2015 doi = {10.1007/978-3-319-19890-3_55} } -@inproceedings{JupyterNotebooks2018, +@inproceedings{JUPY2018, author = {Kluyver, Thomas and others}, title = {Jupyter Notebooks—a publishing format for reproducible computational workflows}, booktitle = {Positioning and Power in Academic Publishing: Players, Agents and Agendas}, @@ -25,6 +60,48 @@ @inproceedings{JupyterNotebooks2018 doi = {10.3233/978-1-61499-649-1-87} } +@inproceedings{BINDER2018, + series = {SciPy}, + title = {Binder 2.0 - Reproducible, interactive, sharable environments for science at scale}, + ISSN = {2575-9752}, + url = {http://dx.doi.org/10.25080/Majora-4af1f417-011}, + DOI = {10.25080/majora-4af1f417-011}, + booktitle = {Proceedings of the 17th Python in Science Conference}, + publisher = {SciPy}, + author = {Jupyter, Project and Bussonnier, Matthias and Forde, Jessica and Freeman, Jeremy and Granger, Brian and Head, Tim and Holdgraf, Chris and Kelley, Kyle and Nalvarte, Gladys and Osheroff, Andrew and Pacer, M and Panda, Yuvi and Perez, Fernando and Ragan-Kelley, Benjamin and Willing, Carol}, + year = {2018}, + pages = {113–120}, + collection = {SciPy} +} + +@article{Galaxy2024, + title = {The Galaxy platform for accessible, reproducible, and collaborative data analyses: 2024 update}, + volume = {52}, + ISSN = {1362-4962}, + url = {http://dx.doi.org/10.1093/nar/gkae410}, + DOI = {10.1093/nar/gkae410}, + number = {W1}, + journal = {Nucleic Acids Research}, + publisher = {Oxford University Press (OUP)}, + author = {Abueg, Linelle Ann L and Afgan, Enis and Allart, Olivier and Awan, Ahmed H and Bacon, Wendi A and Baker, Dannon and Bassetti, Madeline and Batut, Bérénice and Bernt, Matthias and Blankenberg, Daniel and Bombarely, Aureliano and Bretaudeau, Anthony and Bromhead, Catherine J and Burke, Melissa L and Capon, Patrick K and Čech, Martin and Chavero-Díez, María and Chilton, John M and Collins, Tyler J and Coppens, Frederik and Coraor, Nate and Cuccuru, Gianmauro and Cumbo, Fabio and Davis, John and De Geest, Paul F and de Koning, Willem and Demko, Martin and DeSanto, Assunta and Begines, José Manuel Domínguez and Doyle, Maria A and Droesbeke, Bert and Erxleben-Eggenhofer, Anika and F\"{o}ll, Melanie C and Formenti, Giulio and Fouilloux, Anne and Gangazhe, Rendani and Genthon, Tanguy and Goecks, Jeremy and Beltran, Alejandra N Gonzalez and Goonasekera, Nuwan A and Goué, Nadia and Griffin, Timothy J and Gr\"{u}ning, Bj\"{o}rn A and Guerler, Aysam and Gundersen, Sveinung and Gustafsson, Ove Johan Ragnar and Hall, Christina and Harrop, Thomas W and Hecht, Helge and Heidari, Alireza and Heisner, Tillman and Heyl, Florian and Hiltemann, Saskia and Hotz, Hans-Rudolf and Hyde, Cameron J and Jagtap, Pratik D and Jakiela, Julia and Johnson, James E and Joshi, Jayadev and Jossé, Marie and Jum’ah, Khaled and Kalaš, Matúš and Kamieniecka, Katarzyna and Kayikcioglu, Tunc and Konkol, Markus and Kostrykin, Leonid and Kucher, Natalie and Kumar, Anup and Kuntz, Mira and Lariviere, Delphine and Lazarus, Ross and Bras, Yvan Le and Corguillé, Gildas Le and Lee, Justin and Leo, Simone and Liborio, Leandro and Libouban, Romane and Tabernero, David López and Lopez-Delisle, Lucille and Los, Laila S and Mahmoud, Alexandru and Makunin, Igor and Marin, Pierre and Mehta, Subina and Mok, Winnie and Moreno, Pablo A and Morier-Genoud, Fran\c{c}ois and Mosher, Stephen and M\"{u}ller, Teresa and Nasr, Engy and Nekrutenko, Anton and Nelson, Tiffanie M and Oba, Asime J and Ostrovsky, Alexander and Polunina, Polina V and Poterlowicz, Krzysztof and Price, Elliott J and Price, Gareth R and Rasche, Helena and Raubenolt, Bryan and Royaux, Coline and Sargent, Luke and Savage, Michelle T and Savchenko, Volodymyr and Savchenko, Denys and Schatz, Michael C and Seguineau, Pauline and Serrano-Solano, Beatriz and Soranzo, Nicola and Srikakulam, Sanjay Kumar and Suderman, Keith and Syme, Anna E and Tangaro, Marco Antonio and Tedds, Jonathan A and Tekman, Mehmet and Cheng (Mike) Thang, Wai and Thanki, Anil S and Uhl, Michael and van den Beek, Marius and Varshney, Deepti and Vessio, Jenn and Videm, Pavankumar and Von Kuster, Greg and Watson, Gregory R and Whitaker-Allen, Natalie and Winter, Uwe and Wolstencroft, Martin and Zambelli, Federico and Zierep, Paul and Zoabi, Rand}, + year = {2024}, + month = may, + pages = {W83–W94} +} + +@article{OpenOnDemand2018, + doi = {10.21105/joss.00622}, + url = {https://doi.org/10.21105/joss.00622}, + year = {2018}, + publisher = {The Open Journal}, + volume = {3}, + number = {25}, + pages = {622}, + author = {Hudak, Dave and Johnson, Doug and Chalker, Alan and Nicklas, Jeremy and Franz, Eric and Dockendorf, Trey and McMichael, Brian L.}, + title = {Open OnDemand: A web-based client portal for HPC centers}, + journal = {Journal of Open Source Software} +} + @software{GDAL2025, author = {{GDAL/OGR contributors}}, title = {GDAL/OGR Geospatial Data Abstraction software Library}, @@ -34,6 +111,21 @@ @software{GDAL2025 doi = {10.5281/zenodo.5884351} } +@article{NATURE2025, + title = {A prudent planetary limit for geologic carbon storage}, + volume = {645}, + ISSN = {1476-4687}, + url = {http://dx.doi.org/10.1038/s41586-025-09423-y}, + DOI = {10.1038/s41586-025-09423-y}, + number = {8079}, + journal = {Nature}, + publisher = {Springer Science and Business Media LLC}, + author = {Gidden, Matthew J. and Joshi, Siddharth and Armitage, John J. and Christ, Alina-Berenice and Boettcher, Miranda and Brutschin, Elina and K\"{o}berle, Alexandre C. and Riahi, Keywan and Schellnhuber, Hans Joachim and Schleussner, Carl-Friedrich and Rogelj, Joeri}, + year = {2025}, + month = sep, + pages = {124–132} +} + @software{OpenLayers2025, author = {{OpenLayers Contributors}}, title = {OpenLayers}, diff --git a/paper/paper.md b/paper/paper.md index 8dd103ff3..fc276717d 100644 --- a/paper/paper.md +++ b/paper/paper.md @@ -49,13 +49,13 @@ bibliography: paper.bib # Summary -JupyterGIS is a JupyterLab [@JupyterNotebooks2018] extension that enables collaborative, web-based Geographic Information System (GIS) workflows. It provides a familiar GIS interface inspired by traditional desktop GIS tools, real-time collaborative editing, and a Python API for programmatic control, making it a powerful tool for geospatial data analysis, visualization, and sharing. JupyterGIS supports a wide range of geospatial data formats, including GeoTIFFs and Cloud-Optimized GeoTIFFs, Shapefile, GeoParquet, and PMTiles, and provides advanced features such as symbology editing, spatio-temporal animations, and a browser-based processing toolbox powered by WebAssembly (WASM) builds of GDAL [@GDAL2025]. +JupyterGIS is a JupyterLab [@JUPY2018] extension that enables collaborative, web-based Geographic Information System (GIS) workflows. It provides a familiar GIS interface inspired by traditional desktop GIS tools, real-time collaborative editing, and a Python API for programmatic control, making it a powerful tool for geospatial data analysis, visualization, and sharing. JupyterGIS supports a wide range of geospatial data formats, including GeoTIFFs and Cloud-Optimized GeoTIFFs, Shapefile, GeoParquet, and PMTiles, and provides advanced features such as symbology editing, spatio-temporal animations, and a browser-based processing toolbox powered by WebAssembly (WASM) builds of GDAL [@GDAL2025]. The extension is designed to enhance productivity and collaboration among researchers, educators, developers, or any person working with geospatial data. # Statement of need -Geospatial data analysis and visualization are essential in fields such as environmental science, urban planning, and disaster management. However, traditional GIS tools often lack real-time collaboration and seamless integration with computational notebooks. JupyterGIS addresses these gaps by: +Geospatial data analysis and visualization are essential in fields such as environmental science, urban planning, and disaster management. However, traditional GIS tools often lack **real-time collaboration** and seamless integration with computational **notebooks**. JupyterGIS addresses these gaps by: - Enabling **real-time collaborative editing** (similar to Google Docs) for GIS projects. - Providing **interactive maps and geospatial visualizations within Jupyter notebooks**. @@ -64,7 +64,101 @@ Geospatial data analysis and visualization are essential in fields such as envir JupyterGIS is particularly valuable for teams working on shared geospatial projects, educators teaching GIS concepts, and researchers who need to integrate GIS workflows with data science tools. -# Features +# State of the field + +Geospatial analysis and visualization rely on a diverse ecosystem of tools, each addressing specific needs. The landscape includes closed-source solutions, open-source alternatives, cloud-based platforms, and notebook-integrated tools. + +However, none of the existing open-source offerings fully address the growing demand for real-time collaboration. + +## Closed-Source Desktop Solutions + +**ESRI's ArcGIS** remains the dominant proprietary GIS platform, offering comprehensive tools for data management, analysis, and visualization. While ArcGIS Online provides cloud-based collaboration features, it is not as instantaneous. Edits are synchronized at scheduled intervals or manually, not in real time. + +## Open-Source Desktop Solutions + +**QGIS** is the leading open-source desktop GIS, renowned for its extensibility, support for diverse data formats, and active community. It provides a powerful alternative to proprietary software but lacks native real-time collaborative editing of GIS documents. As a desktop software, it must be installed on the user’s device. + +## Proprietary Cloud-Based Platforms + +**Google Earth Engine** enables large-scale geospatial analysis in the cloud, excelling in remote sensing and large-scale data processing. However, its focus on script-based workflows and lack of interactive, collaborative editing make it less suitable for teams needing real-time collaboration or integration with local data science tools. + +## In-Notebook Tools + +Libraries like [ipyleaflet](https://github.com/jupyter-widgets/ipyleaflet) and [folium](https://github.com/python-visualization/folium) bring interactive mapping to Jupyter notebooks, enabling lightweight visualization of geospatial data. While useful for exploratory analysis, these tools lack a graphical user interface for non-developers willing to create GIS documents with advanced layer styling. + +# JupyterGIS + +JupyterGIS brings an interactive Desktop-style GIS experience (like QGIS) in a web interface including real-time **collaborative editing** features for GIS documents, enabling teams to work together seamlessly, much like coediting documents online text-processing tools. + +It supports a wide range of **geospatial data formats**, including GeoTIFFs and Cloud-Optimized GeoTIFFs, Shapefile, GeoParquet, and PMTiles, and provides advanced features such as symbology editing, spatio-temporal animations, and a browser-based processing toolbox powered by WebAssembly (WASM) builds of GDAL. JupyterGIS also allows for editing QGIS files directly, with a partial support of the QGIS features. + +JupyterGIS includes a **Python API**, which allows editing GIS documents interactively from Jupyter notebooks and consoles. The Python API leverages the Jupyter rich mime type rendering features to display geographical data inline in notebooks. The Python API operates on the shared model like a collaborator in the collaborative editing framework. + +JupyterGIS is designed for flexibility and accessibility, supporting deployment across a wide range of Jupyter environments, from **JupyterHub**, the go-to solution for multi-user Jupyter deployments, to **JupyterLite**, which runs entirely in the web browser. + +JupyterGIS has been built from the ground up to be extensible with plugins. Several extensions have been created by the development team. Most notably, the [**JupyterGIS-tiler**](https://github.com/geojupyter/jupytergis-tiler) project, which enables an integration with the Pangeo ecosystem, and allows to display Xarray Python variables as layers in JupyterGIS documents. + +Finally, JupyterGIS includes basic support for browsing SpatioTemporal Asset Catalogs (STAC) interactively and displaying the assets on GIS documents. + +![Screenshot of JupyterGIS in action, showcasing several features, including support for the QGIS file format, Jupyter notebook integration, and the editing user interface](JupyterGIS-screenshot.png) + +## Support for QGIS and jGIS project files + +- JupyterGIS can open existing QGIS project files (such as .qgz and .qgs) directly in JupyterLab, allowing users to continue work started in desktop GIS. +- New .jGIS project files can be created entirely within JupyterLab, enabling users to start projects without a desktop GIS tool. +- This interoperability makes it easy to move between desktop GIS environments and JupyterLab while preserving layer configurations, data sources, and project structure. + +![Screenshot of using JupyterGIS to edit a QGIS file directly from the JupyterLab interface](JupyterGIS-QGIS-support.png) + +## Interactive map and layer management + +- Users can **add**, **rename**, **delete**, and **reorder** layers using an intuitive interface made of context menus and drag and drop. +- A broad range of layer types is supported, including vector formats (**GeoJSON**, **Shapefile**, **GeoParquet**), raster formats (**COG**), as well as **raster and vector tile layers**. +- The interface allows **zooming to a layer’s bounding box** for quick navigation and centering. +- Vector Layer data can be downloaded or exported, enabling reuse of datasets outside the JupyterGIS environment. + +## A lightweight processing toolbox + +- JupyterGIS includes a set of commonly used spatial operations such as buffering, dissolving, centroid computation, and generating convex or concave hulls. + +![Screenshot of JupyterGIS showing the processing tool to compute the convex hulls of geometries](JupyterGIS-processing.png) + +## Symbology and styling options + +- A symbology panel lets users apply various styles to vector layers including single symbol, graduated, categorized, canonical, and heatmap renderers. +- Raster layers can be visualized using single-band or multi-band symbology, useful for displaying imagery or multidimensional raster products. +- These styling tools allow clear and expressive map visualization without leaving the JupyterLab environment. + +![Screenshot of JupyterGIS demonstrating its advanced symbology feature: a graduated colormap visualizing earthquake magnitudes](JupyterGIS-symbology-colormap.png) + +![Screenshot of JupyterGIS demonstrating another symbology feature: a colormap applied on a single band of a Cloud Optimized Geotiff (COG) layer](JupyterGIS-symbology-cog.png) + +## Interactive tools and dynamic visualizations + +- The “identify” tool allows clicking on features to view their attributes, similar to traditional desktop GIS exploration. +- Time-dependent datasets can be animated, supporting visualization of changes across time such as environmental monitoring or temporal event sequences. +- These tools enhance exploratory analysis and make it easier to interact with complex spatial data. + +## Real-time collaboration and annotation + +- JupyterGIS supports true real-time multi-user collaboration: multiple users can edit the same map simultaneously. +- A follow mode allows one user to follow another’s viewpoint on the map, helpful for guided exploration or teaching. +- Users can add map annotations, participate in discussions tied to geographic context, and see other collaborators’ cursors or pointers directly on the map. +- This makes JupyterGIS well-suited for remote teams, workshops, or shared data review sessions. + +![Screenshot of JupyterGIS demonstrating the “follow mode”: following the cursor and viewport of another collaborator](JupyterGIS-folow-mode.png) + +## Python API and notebook integration + +- A comprehensive Python API allows programmatic control of JupyterGIS projects: creating or opening projects, adding layers, editing map content, and applying many of the same operations available in the UI. +- The Python runtime behaves like another collaborator: changes made through Python appear in the interface for all users. +- This integration allows seamless combination of GIS visualization with Python data science workflows, enabling users to leverage packages like GeoPandas, Rasterio, or Xarray while interacting with the map. + +![Screenshot demonstrating using the Python API to interactively explore a dataset loaded from Python in the JupyterGIS interface](JupyterGIS-python.png) + +## JupyterGIS Feature Summary + +The following table summarizes the features listed above. | Feature | Description | | --------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | @@ -72,7 +166,7 @@ JupyterGIS is particularly valuable for teams working on shared geospatial proje | **QGIS File Support** | Partial support for QGIS [@QGIS2025] project file formats (.qgs, .qgz), enabling users to load, visualize, and edit projects with some limitations. | | **Interactive Maps** | Render and interact with geospatial data directly in JupyterLab. | | **Processing Toolbox** | Browser-based geospatial processing tools (e.g., buffer, convex hull, dissolve) powered by GDAL/WASM. | -| **Symbology Enhancements** | Flexible styling options, including graduated, categorized, and canonical symbology. | +| **Advanced Symbology** | Flexible styling options, including graduated, categorized, and canonical symbology. | | **STAC Integration** | Embedded STAC browser for data discovery and integration. | | **Vector Tile Support** | Full compatibility with vector tiles, including the PMTiles format. | | **Data Format Support** | GeoTIFF, Shapefile, GeoParquet (through a conversion to GeoJSON), PMTiles, and more. | @@ -82,46 +176,160 @@ JupyterGIS is particularly valuable for teams working on shared geospatial proje # Installation -JupyterGIS can be installed from: +JupyterGIS is available both on PyPI and on conda-forge [@CONDAFORGE2025]. -PyPI: +It can be installed from PyPI with pip: ``` python -m pip install jupytergis ``` -Conda-forge: +Or retrieved from conda-forge with e.g. mamba. ``` mamba install -c conda-forge jupytergis ``` -# Architecture +# Software design + +## Collaboration as a First-Class Requirement: Shaping the JupyterGIS Document Model + +The collaborative editing of documents, which has gained significant traction with popular collaboration tools, has become an integral part of our digital lives, and has made us collectively more productive. Gone are the days of cumbersome email exchanges with documents shuttling back and forth, risking the oversight of edits made by diverse contributors. + +Looking ahead, the potential of co-editing extends far beyond text documents, particularly in tackling the intricate design of complex systems, which necessitate the amalgamation of diverse expertise to construct a unified model. In geo-sciences, it may range from climate modelling to agriculture, ecology, urban planning, and many more areas of expertise. + +More than a "nice to have", we believe that collaborative editing will soon be a natural expectation for most users: + +- Firstly, as the user interface becomes accessible through the browser, users will naturally find themselves opening the same document across multiple browser windows or even multiple devices simultaneously. The seamless ability to "collaborate with oneself" becomes an expectation, free from the hindrance of cumbersome locking mechanisms preventing multiple frontends from simultaneously editing a project. + +- Secondly, with a web UI, users will anticipate the capability to share a project link with colleagues. The associated user experience intricacies, such as managing multiple users within the same project, must be addressed simultaneously. -JupyterGIS is built as a JupyterLab extension, leveraging modern Web technologies: +Retrofitting these features into an existing application is considerably more arduous than building the initial data model on the appropriate paradigm from inception. This is the reason why we set ourselves to do so for the JupyterGIS project. -- **Frontend**: The frontend is built upon the JupyterLab application framework, and utilises React for the main control panels. -- **Collaborative editing**: Real-time synchronization utilises JupyterLab’s collaborative editing infrastructure, which is built upon the YJS ecosystem (YJS, PyCRDT) [@YJS2015]. -- **Processing**: the processing toolbox is based on a WebAssembly build of GDAL. -- **Visualisation**: The map viewer of JupyterGIS is powered by OpenLayers [@OpenLayers2025] +## Building upon the JupyterLab application framework + +Advanced authoring tools, such as IDEs, CAD modelers, and GIS applications, are essential for professionals who rely on them for extended periods. These users have high expectations and demand solid tools to optimize their productivity. + +Key aspects include: + +- extensibility with plugins, +- configurable keyboard shortcuts, +- themability, +- internationalization, +- scriptability, +- and the ability to operate across multiple browser windows and devices. + +We believe that the JupyterLab application framework is a great foundation to build such applications for demanding users. In addition to the aforementioned features, it is the foundation of a strong ecosystem of extensions and has a large user base, and it provides the foundations for collaborative editing. Collaborative editing in JupyterLab is built upon an implementation of CRDT data structures (Conflict-free Replicated Data Type) called YJS [@YJS2015]. CRDTs were first theorised in 2011 [@CRDT2011] and allow for decentralised conflict resolution. + +Finally, by building upon JupyterLab, JupyterGIS inherits these strengths and integrates natively with the broader Jupyter ecosystem, including notebooks, kernels, and rich display capabilities. It also enables server-less deployments utilizing JupyterLite, a distribution of Jupyter that runs entirely in the web-browser. + +## The JupyterGIS stack + +JupyterGIS leverages the following technologies: + +| Frontend | JupyterLab application framework + React | +| Collaboration | Real-time synchronization with YJS and PyCRDT [@YJS2015] | +| Processing | WebAssembly-powered GDAL [@GDAL2025] toolbox | +| Visualization | OpenLayers [@OpenLayers2025] for interactive map rendering | + +# Research impact + +## Deployments on Institutional Research Infrastructure + +JupyterGIS has been successfully deployed across several major **institutional research infrastructures**: + +- JupyterGIS is now part of the Galaxy Toolbox and can be installed on any Galaxy [@Galaxy2024] instance. It is included on the [Galaxy Europe deployment](https://usegalaxy.eu) of EOSC at usegalaxy.eu. It will soon also be installed on the thematic node (Earth Science) of EOSC. More details on the Galaxy integration are available in a [blog post](https://galaxyproject.org/news/2025-05-20-jupytergis/) published on the blog of the Galaxy project. +- JupyterGIS has been deployed on the [Copernicus Data Space Ecosystem (CDSE)](https://jupyterhub.dataspace.copernicus.eu). It is free to register and use. CDSE also has a large collection of Copernicus datasets. +- JupyterGIS has been integrated with the Open OnDemand portal [@OpenOnDemand2018], and deployed on the instance of the University of Oslo. + +## Public deployments + +Beyond these institutional deployments, JupyterGIS is widely accessible through multiple public deployments: + +- Ready-to-use JupyterGIS environments are available via Binder [@BINDER2018], with direct access provided in the JupyterGIS GitHub repository. +- The repository also features a **JupyterLite-based deployment**, a fully static solution that runs in the browser using **WebAssembly** for Python execution. This approach eliminates the need for cloud infrastructure, enabling **scalable and lightweight deployments anywhere**. + +## Supporting scientific publications + +JupyterGIS played a key role in creating an interactive map of global subsurface CO₂ storage potential in sedimentary basins. This [interactive map](https://cdr.apps.ece.iiasa.ac.at/sedimentary-basin-level-maps), hosted by the International Institute for Applied Systems Analysis (IIASA), was deployed using JupyterLite as supplementary material for an article published in Nature [@NATURE2025]. + +This deployment showcases the power of JupyterLite for scalable, resource-efficient solutions, enabling large-scale dissemination with minimal cloud infrastructure. + +![Screenshot of the interactive map supporting the article on subsurface CO₂ storage](JupyterGIS-CO2.png) + +## Use cases + +Several use cases have been developed to illustrate usage of JupyterGIS, and are available in the [JupyterGIS-Showcases](https://github.com/annefou/jupytergis-showcases) GitHub repository. + +We highlight the three following examples - available in the repository linked above: + +### Sentinel-3 Heatwave Analysis + +Developed based on the original work done by EURAC Research, this use case demonstrates JupyterGIS’s capability for thermal anomaly detection and climate monitoring. The workflow integrates Sentinel-3 SLSTR (Sea and Land Surface Temperature Radiometer) data to identify and visualise heatwave events. + +### Sentinel-2 Snow mapping (NSDI) + +This use case applies the Normalized Difference Snow Index (NSDI) to Sentinel-2 multispectral imagery for snow cover mapping. + +### FAIR2Adapt Climate Adaptation Case study (Hamburg) + +An ongoing collaboration with the City of Hamburg under the FAIR2Adapt INFRA-EOSC project demonstrates JupyterGIS’s application for urban climate adaptation planning. The Use case focuses on flood risk assessment and infrastructure resilience, showcasing the tool’s relevance for decision-support systems. # Community and Contributions -JupyterGIS is an open-source project under the BSD 3-Clause License. Contributions are welcome via: +## Contributing and engaging with the JupyterGIS community + +JupyterGIS is released under the BSD 3-Clause License. Contributions are welcome on the [GitHub repository](https://github.com/geojupyter/jupytergis). The [documentation](https://jupytergis.readthedocs.io) is available online on ReadTheDocs. We host community discussion on a [public discussion channel](GeoJupyter Zulip channel). -- **GitHub Repository**: geojupyter/jupytergis -- **Documentation**: jupytergis.readthedocs.io -- **Community Discussions**: GeoJupyter Zulip channel +## The GeoJupyter Initiative + +JupyterGIS has been incorporated as the first and central component of a broader initiative: [GeoJupyter](https://geojupyter.org/), an open and collaborative community-driven effort to reimagine geospatial interactive computing experiences for education, research, and industry. + +Beyond QuantStack and Simula Research Lab, JupyterGIS has received significant contributions from other GeoJupyter members, such as the Eric & Wendy Schmidt Center for Data Science and Environment at UC Berkeley. + +![The GeoJupyter community website](GeoJupyter.png) # Future Work -The JupyterGIS team plans to: +Our roadmap already includes the following developments: + +## Integration with openEO + +We plan to introduce native support for layers defined as openEO [@OPENEO2021] [process graphs](https://api.openeo.org/v/0.3.0/processgraphs/) within JupyterGIS documents. These layers will be dynamically rendered in JupyterGIS Next as XYZ tiles, enabling seamless integration into geospatial workflows. To achieve this, we will define a new layer type in the JupyterGIS in-memory model and extend the Python API to support the creation and manipulation of openEO process graph objects. + +openEO process graphs align perfectly with JupyterGIS documents, as they can be serialized and embedded directly within a JupyterGIS file. This integration will transform JupyterGIS, including JupyterLite-based deployments, into a powerful editor and viewer for openEO process graphs, bridging the gap between cloud-based geospatial processing and interactive, collaborative document editing. -- Expand the GDAL-based processing toolbox. -- Deepen integration with QGIS and enrich the Python API. +We believe that the combination of the openEO engine and the JupyterGIS frontend will result in a credible open-source alternative to Google Earth Engine. This solution will not only offer scalability through JupyterLite but also empower users to craft rich, narrative-driven maps, making advanced geospatial analysis more accessible and engaging + +## Including an R API + +To extend JupyterGIS to the R ecosystem, we will develop an R API mirroring the functionality of the existing Python API. + +This API will interact with the collaborative editing framework and the underlying data model, just as the Python API does. The primary technical requirement is to create R bindings for the [y-crdt](https://github.com/y-crdt/y-crdt) Rust library, the same library that powers the collaborative data model in the backend and supports the Python bindings. This R API will unlock advanced mapping capabilities for R developers. + +## JupyterLite-AI + +We will integrate JupyterGIS with JupyterLite-AI by exposing JupyterGIS features as tools within the JupyterLite environment. + +By leveraging the JupyterLab application framework, we ensured that all user actions, whether triggered through the UI, top-bar menus, or keyboard shortcuts, are backed by JupyterLab commands, a serializable API. This design makes JupyterGIS highly compatible with LLM-based tool-calling, enabling seamless automation and AI-driven interactions. + +We will integrate JupyterGIS with JupyterLite-AI, by exposing the JupyterGIS features as tools for JupyterLite. In the screenshot below, we show an early example of such an integration. + +![Screenshot of the JupyterLite-AI integration with JupyterGIS, currently in the works](JupyterGIS-AI.png) # Acknowledgments -JupyterGIS was developed at QuantStack and at the Eric and Wendy Schmidt Center for Data Science & Environment at UC Berkeley, with financial support from the European Space Agency (ESA) and the Centre National d’Études Spatiales (CNES). +Acknowledgments +JupyterGIS was developed through a collaboration between **QuantStack**, the **Simula Research Laboratory**, and the **Eric and Wendy Schmidt Center for Data Science & Environment at UC Berkeley** (DSE), with additional contributions from community members. + +- **QuantStack** and **Simula Research Laboratory** received funding from the European Space Agency (**ESA)** through the Open Call for Proposals for EO Innovation. +- QuantStack also secured additional funding from the Centre National d’Études Spatiales (**CNES**) to specifically develop the STAC browser and story maps features. + QuantStack contributed further to the project through unfunded efforts. +- The **Eric and Wendy Schmidt Center for Data Science & Environment at UC Berkeley** funded the contributions of its researchers to the project. + +# AI Usage Disclosure + +The development of JupyterGIS relied entirely on **human expertise**, and traditional software engineering practices. While we leveraged developer productivity tools, such as IDE features for code auto-completion and suggestions, every contribution, including code, documentation, and design, underwent review by the core team. +This article was written entirely by humans, though we used productivity tools for grammatical corrections and proofreading. # References