<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - geoscience</title><link href="https://jasongrout.github.io/medium-archive/pelican/" rel="alternate"/><link href="https://jasongrout.github.io/medium-archive/pelican/feeds/tag-geoscience.atom.xml" rel="self"/><id>https://jasongrout.github.io/medium-archive/pelican/</id><updated>2026-08-24T16:09:00+00:00</updated><subtitle>The Project Jupyter blog: news, releases, and community stories, archived from blog.jupyter.org.</subtitle><entry><title>JupyterGIS 0.16: New visualization capabilities, collaborative Story Maps, and more</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupytergis-0-16-new-visualization-capabilities/" rel="alternate"/><published>2026-08-24T16:09:00+00:00</published><updated>2026-08-24T16:09:00+00:00</updated><author><name>Martin Renou</name></author><id>tag:jasongrout.github.io,2026-08-24:/medium-archive/pelican/posts/2026/jupytergis-0-16-new-visualization-capabilities/</id><summary type="html">&lt;p&gt;Read this article in Notebook.link, as a live story-map! https://notebook.link/@martinRenou/jupytergis-announcement&lt;/p&gt;
</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;Read this article in Notebook.link, as a live story-map! &lt;a href="https://notebook.link/@martinRenou/jupytergis-announcement"&gt;https://notebook.link/@martinRenou/jupytergis-announcement&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="/posts/2026/expanding-geospatial-workflows-in-jupytergis-stac/"&gt;Earlier this year, we introduced STAC browsing and Story Maps in JupyterGIS&lt;/a&gt;, making it easier to discover geospatial datasets and communicate results without leaving Jupyter.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/geojupyter/jupytergis/releases/tag/v0.16.0"&gt;JupyterGIS 0.16&lt;/a&gt; continues in the same direction. This release adds support for new geospatial formats, tighter integration with the scientific Python ecosystem, a redesigned Story Map editor, and a more expressive way to style geographic data.&lt;/p&gt;
&lt;h2 id="story-maps-are-getting-a-new-look"&gt;Story Maps are getting a new look!&lt;/h2&gt;
&lt;p&gt;Story Maps in JupyterGIS let you build a scrollable presentation around your map. A Story Map is made up of a sequence of segments that can combine Markdown content with map views, so you can guide the reader through a geographic story as they scroll.&lt;/p&gt;
&lt;p&gt;Each segment can define its own map state, including the current map location, visible layers, and layer styling. This means that the map can change as the reader moves through the story: layers can appear or disappear, the view can move to a new location, and symbology can change to highlight different aspects of the data.&lt;/p&gt;
&lt;h3 id="story-maps-have-received-a-significant-update-in-this-release"&gt;Story Maps have received a significant update in this release.&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Read this article in Notebook.link, as a live story-map! &lt;a href="https://notebook.link/@martinRenou/jupytergis-announcement"&gt;https://notebook.link/@martinRenou/jupytergis-announcement&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;
&lt;img alt="The Story-map associated to this release annoucement. It contains Text, images, and map views with associated layer states." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/001-1_gyuKfOzFSbmRhH9LVBTJiA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The Story-map associated to this release annoucement. It contains Text, images, and map views with associated layer states.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="a-better-story-maps-editing-experience"&gt;A better Story Maps editing experience&lt;/h2&gt;
&lt;p&gt;We’ve also made substantial improvements to the Story Map editing experience.&lt;/p&gt;
&lt;p&gt;The editor has been redesigned around Jupyter’s &lt;strong&gt;real-time collaboration infrastructure, allowing multiple people to edit the same Story Map simultaneously&lt;/strong&gt;. Changes appear immediately for everyone, making it much easier to prepare presentations, reports, or educational material as a team.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Collaboratively edit the Story Map markdown." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/002-1_yLMypnIGkeKXrR1BfXgvHg.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Collaboratively edit the Story Map markdown.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The editor now gives you a much better sense of what the final story will look like while you are working on it. Markdown sections can be previewed directly in the editor, and a new Story Map preview makes it possible to see the complete presentation without leaving the editing workflow. This makes it easier to write, arrange, and refine a story while keeping an eye on the final result. We’ve also introduced a new layout that is better suited for long-form content. In addition to guided geographic narratives, Story Maps can now be used to create richer articles combining text, maps, images, and other interactive content.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="New Story Map editor: Set story segment viewport, preview markdown, set layers properties for the story segment." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/003-1_1eO0MShCVn71uIhAkC61ZA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;New Story Map editor: Set story segment viewport, preview markdown, set layers properties for the story segment.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="openeo-layers"&gt;OpenEO layers&lt;/h2&gt;
&lt;p&gt;More and more geospatial workflows rely on remote processing instead of downloading datasets locally. openEO provides a common API to describe these processing pipelines as process graphs that are executed by a backend.&lt;/p&gt;
&lt;p&gt;JupyterGIS can now display &lt;strong&gt;openEO&lt;/strong&gt; process graphs directly as map layers. Instead of exporting intermediate results before visualizing them, you can connect an openEO backend and inspect the output of your processing pipeline directly in the map.&lt;/p&gt;
&lt;p&gt;The visualization is tile-based and lazy: JupyterGIS only requests the data needed for the current map view and zoom level. This makes it possible to explore large remote sensing workflows interactively, without materializing the full result locally.&lt;/p&gt;
&lt;p&gt;JupyterGIS can make use of any openEO server that supports tiling, such as &lt;a href="https://sentinel-hub.github.io/titiler-openeo"&gt;titiler-openeo&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;openeo&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;jupytergis&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GISDocument&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;openeo.processes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;

&lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openeo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SERVER_URL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;authenticate_basic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BASIC_AUTH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BASIC_AUTH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;cube&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_collection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;sentinel-2-global-mosaics&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;bands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;B03&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;B08&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;temporal_extent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2022-04-15&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;2022-12-31&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;cube&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cube&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reduce_dimension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;dimension&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;t&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;reducer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;first&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;cube&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cube&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;10000.0&lt;/span&gt;

&lt;span class="c1"&gt;# NDWI = (GREEN - NIR) / (GREEN + NIR)&lt;/span&gt;
&lt;span class="n"&gt;ndwi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cube&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndvi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;red&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;ndwi_vis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ndwi&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="n"&gt;ndwi_png&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ndwi_vis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linear_scale_range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;input_min&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;input_max&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;output_min&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;output_max&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ndwi_png&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;PNG&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GISDocument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latitude&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;40.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;longitude&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mf"&gt;73.95&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zoom&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ready&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_openeo_tile_layer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;doc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="Define a process graph to compute a NDWI, using the Python API of OpenEO and JupyterGIS. It is then lazily evaluated on a per-tile basis while the user pans/zooms on the map." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/004-1_L5MrEnxXuvIkT5rVl0dahw.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Define a process graph to compute a NDWI, using the Python API of OpenEO and JupyterGIS. It is then lazily evaluated on a per-tile basis while the user pans/zooms on the map.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In addition to defining openEO process graphs from the scripting Python API, JupyterGIS provides an advanced openEO process graph editor, allowing you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;connect to an openEO tile server&lt;/li&gt;
&lt;li&gt;define the graph graphically, with boxes and arrows&lt;/li&gt;
&lt;li&gt;load data collections and define processes with a drag-and-drop UI&lt;/li&gt;
&lt;li&gt;directly edit the JSON content&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="Editing an openEO process graph from the JupyterGIS front-end" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/005-1_3AGsNcwe384V1P4-ZkzcYw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Editing an openEO process graph from the JupyterGIS front-end&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Another interesting aspect of openEO is that process graphs have a well-defined, declarative JSON representation. Because of this structured format, &lt;strong&gt;they are a natural target for LLM-assisted workflows&lt;/strong&gt;. Users can describe the analysis they want in natural language, have an LLM generate or refine the corresponding process graph (e.g. using jupyterlite-ai), and immediately visualize the result in JupyterGIS. Combined with the lazy, tile-based rendering, this makes it possible to quickly iterate on processing pipelines without waiting for complete datasets to be exported or downloaded.&lt;/p&gt;
&lt;h2 id="lazy-visualization-of-xarray-datasets-with-jupyter-tiler"&gt;Lazy visualization of Xarray datasets with jupyter-tiler&lt;/h2&gt;
&lt;p&gt;JupyterGIS now integrates with the new &lt;a href="https://jupyter-tiler.readthedocs.io"&gt;jupyter-tiler&lt;/a&gt; package, making it straightforward to visualize Xarray datasets from Python.&lt;/p&gt;
&lt;p&gt;Datasets can come from anywhere: they may already exist in your notebook, or they can be loaded on demand from a STAC catalog using stackstac. Once you have an Xarray object, JupyterGIS can display it in the map without requiring an export to another format.&lt;/p&gt;
&lt;p&gt;Rendering happens lazily, generating only the tiles needed for the current view. This makes it possible to explore datasets that are much larger than memory while keeping navigation responsive.&lt;/p&gt;
&lt;p&gt;The result is a smoother workflow from data loading, to analysis, to visualization, all within the same notebook.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_data_array_layer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;NDSI Layer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;data_array&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ndsi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;colormap_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;viridis&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;colormap_range&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="Visualizing an Xarray dataset in JupyterGIS." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/006-1_GsxLjpQu33wvCx8KZxBUWA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Visualizing an Xarray dataset in JupyterGIS.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This feature requires the optional dependency jupyter-tiler to be installed.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;jupyter-tiler
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="a-more-expressive-symbology-model"&gt;A more expressive symbology model&lt;/h2&gt;
&lt;p&gt;Styling geographic data often requires combining multiple visual properties to communicate patterns effectively.&lt;/p&gt;
&lt;p&gt;JupyterGIS 0.16 introduces a &lt;strong&gt;new symbology model inspired by the Grammar of Graphics.&lt;/strong&gt; Instead of relying on a fixed set of styling options, visual properties such as color, size, and opacity can be defined in a more flexible and composable way.&lt;/p&gt;
&lt;p&gt;This makes it easier to build everything from simple thematic maps to more advanced visualizations while keeping styling definitions consistent and reproducible.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A symbology example: apply a Viridis color map to the circle colors, a linear scale to the radius of circles, and a fixed stroke color." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/jupytergis-0-16-new-visualization-capabilities/images/007-1_SU9Ll713eVozkjVQNQNmMA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;&lt;em&gt;A symbology example: apply a Viridis color map to the circle colors, a linear scale to the radius of circles, and a fixed stroke color.&lt;/em&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="geozarr-and-geopackage-support"&gt;GeoZarr and GeoPackage support&lt;/h2&gt;
&lt;p&gt;This release also expands the range of formats that JupyterGIS can open directly.&lt;/p&gt;
&lt;p&gt;Support for GeoZarr makes it possible to work with cloud-native multidimensional geospatial datasets, while GeoPackage support improves interoperability with existing GIS software and common data exchange workflows.&lt;/p&gt;
&lt;h2 id="new-collaborative-editing-capabilities"&gt;New Collaborative Editing Capabilities&lt;/h2&gt;
&lt;p&gt;JupyterGIS 0.16 also brings collaborative editing to vector layers. When working on a shared JupyterGIS document, multiple users can now edit the same vector data at the same time.&lt;/p&gt;
&lt;p&gt;Features can be created, moved, and edited collaboratively, with changes synchronized in real time between users. This makes it possible to work together on tasks such as digitizing features, annotating a map, or refining a dataset without having to exchange files or manually merge changes.&lt;/p&gt;
&lt;p&gt;Combined with the collaborative Story Map editor, this makes collaboration a more integral part of JupyterGIS: users can work together on the data itself, and then use the same shared document to explore and communicate their results.&lt;/p&gt;
&lt;h2 id="a-new-r-api"&gt;A new R API&lt;/h2&gt;
&lt;p&gt;JupyterGIS 0.16 also introduces an R client, bringing JupyterGIS to R users through the new &lt;a href="https://github.com/geojupyter/r-jupytergis"&gt;&lt;code&gt;r-jupytergis&lt;/code&gt;&lt;/a&gt; package. The R client provides bindings for interacting with JupyterGIS widgets from an R notebook, using the same JavaScript front-end as the Python client.&lt;/p&gt;
&lt;p&gt;The main interface is the &lt;code&gt;GISDocument&lt;/code&gt; widget, which can be used to create and manipulate JupyterGIS documents directly from R. This makes it possible to build geospatial workflows in R while using the same interactive map interface available to Python users.&lt;/p&gt;
&lt;p&gt;The R client also uses the same underlying collaborative infrastructure as the Python client, including the Yrs CRDT library. This means that R users can participate in the same collaborative JupyterGIS workflows rather than working in a separate environment.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GISDocument&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;france_hiking.jGIS&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;layer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="nf"&gt;add_raster_layer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://mt1.google.com/vt/lyrs=y&amp;amp;x={x}&amp;amp;y={y}&amp;amp;z={z}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Google Satellite&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;attribution&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Google&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;opacity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0.6&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="bug-fixes-and-performance-improvements"&gt;Bug fixes and performance improvements&lt;/h2&gt;
&lt;p&gt;As usual, this release also includes many smaller improvements throughout the project.&lt;/p&gt;
&lt;p&gt;We’ve fixed a number of bugs, improved performance in several parts of the application, and continued polishing both the user interface and the Python API.&lt;/p&gt;
&lt;p&gt;JupyterGIS continues to evolve as a collaborative GIS environment that fits naturally within the Jupyter ecosystem. Whether your workflow starts from a notebook, a STAC catalog, an openEO backend, or a local dataset, the goal remains the same: make it easier to move between analysis, visualization, and communication without switching tools.&lt;/p&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;This work on JupyterGIS by &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt; was funded by &lt;a href="https://www.esa.int/"&gt;the European Space Agency (ESA)&lt;/a&gt; for the Story-maps development, the R API, openEO layers support and the collaborative labelling. Additionally, QuantStack was funded by &lt;a href="https://cnes.fr/"&gt;the French National Centre for Space Studies (CNES)&lt;/a&gt; for the lazy visualization of xarray datasets.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="contributors-to-this-release"&gt;Contributors to this release&lt;/h2&gt;
&lt;p&gt;By order of &lt;a href="https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports"&gt;number of contributions&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/arjxn-py"&gt;&lt;strong&gt;Arjun Verma&lt;/strong&gt;&lt;/a&gt; is a Developer at QuantStack. He worked on the server-side geoprocessing infrastructure and on the openEO editor in the JupyterGIS front-end.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/martinRenou"&gt;&lt;strong&gt;Martin Renou&lt;/strong&gt;&lt;/a&gt; is a Technical Director at QuantStack and a maintainer of JupyterGIS. For this release, Martin coordinated and guided much of the development, and worked on the integration of openEO layers.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/gjmooney"&gt;&lt;strong&gt;Gregory Mooney&lt;/strong&gt;&lt;/a&gt; is a Developer at QuantStack and a long-time contributor to JupyterGIS. He led much of the work on the new Story Map editor and its collaborative editing capabilities.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/MMesch"&gt;&lt;strong&gt;Matthias Meschede&lt;/strong&gt;&lt;/a&gt; is Chief Operating Officer at QuantStack. He introduced the new Grammar of Graphics-inspired symbology model, bringing a more expressive and composable approach to styling geographic data.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/mfisher87"&gt;&lt;strong&gt;Matt Fisher&lt;/strong&gt;&lt;/a&gt; is the Community Manager of &lt;a href="https://github.com/geojupyter"&gt;GeoJupyter&lt;/a&gt;. He contributed to many of the discussions around the release and helped shape several of the design decisions across the project.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/nakul-py"&gt;&lt;strong&gt;Nakul Verma&lt;/strong&gt;&lt;/a&gt; is an open-source contributor to JupyterGIS. He contributed numerous bug fixes and improvements throughout the release, and introduced support for Vega expressions in the new symbology system.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/AntoinePrv"&gt;&lt;strong&gt;Antoine Prouvost&lt;/strong&gt;&lt;/a&gt; is a Developer at QuantStack. He led the initial work on the R API for JupyterGIS, building its first skeleton and establishing the foundations for the &lt;code&gt;r-jupytergis&lt;/code&gt; package.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/SandrineP"&gt;&lt;strong&gt;Sandrine Pataut&lt;/strong&gt;&lt;/a&gt; is a Developer at QuantStack. She worked on bringing many of JupyterGIS’s features to the R API, helping make the new client more complete and useful for R users.&lt;/p&gt;
&lt;p&gt;We are grateful to everyone who contributed code, reviews, ideas, discussions, and feedback to this release. JupyterGIS continues to benefit from an increasingly diverse community of contributors, and we look forward to seeing what comes next!&lt;/p&gt;
</content><category term="geoscience"/><category term="JupyterGIS"/><category term="science"/></entry><entry><title>Expanding Geospatial Workflows in JupyterGIS: STAC Browsing and Story Maps</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/expanding-geospatial-workflows-in-jupytergis-stac/" rel="alternate"/><published>2026-02-19T17:34:00+00:00</published><updated>2026-02-19T17:34:00+00:00</updated><author><name>Gregory Mooney</name></author><id>tag:jasongrout.github.io,2026-02-19:/medium-archive/pelican/posts/2026/expanding-geospatial-workflows-in-jupytergis-stac/</id><summary type="html">&lt;p&gt;Since its initial announcement less than two years ago, JupyterGIS has been a growing effort to bring interactive geospatial workflows into…&lt;/p&gt;
</summary><content type="html">&lt;figure&gt;
&lt;img alt="JupyterGIS story maps in action" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/expanding-geospatial-workflows-in-jupytergis-stac/images/001-0_X3PRP6d54Z82wwEO.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;JupyterGIS story maps in action&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Since &lt;a href="/posts/2024/jupytergis/"&gt;its initial announcement less than two years ago&lt;/a&gt;, JupyterGIS has been a growing effort to bring interactive geospatial workflows into the Jupyter ecosystem. Early milestones focused on laying the foundations: a composable GIS interface in Jupyter, a shared document model allowing real-time collaboration, a Python scripting API for exploration in the Jupyter Notebook, and a compatibility layer with the QGIS file format.&lt;/p&gt;
&lt;p&gt;With the project maturing, recent work has focused on improving two key aspects of everyday geospatial workflows: &lt;strong&gt;discovering data&lt;/strong&gt; and &lt;strong&gt;sharing results&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In this post, we (the JupyterGIS team) introduce two new features that move JupyterGIS further in that direction. First, a &lt;strong&gt;STAC browser integrated directly into the JupyterGIS user interface&lt;/strong&gt;, allowing users to explore SpatioTemporal Asset Catalogs and add selected items to a project as map layers. Second, a new &lt;strong&gt;Story Map feature&lt;/strong&gt;, inspired by existing GIS storytelling tools, which makes it possible to combine maps and narrative content in a single, interactive view.&lt;/p&gt;
&lt;p&gt;Together, these additions aim to make JupyterGIS not only a place to analyze geospatial data, but also a place to explore datasets and communicate results, all within Jupyter.&lt;/p&gt;
&lt;h2 id="exploring-stac-catalogs-in-jupytergis"&gt;Exploring STAC Catalogs in JupyterGIS&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;SpatioTemporal Asset Catalog (STAC)&lt;/strong&gt; specification provides a common way to describe and access geospatial datasets, particularly large collections of Earth observation data. By standardizing how data and metadata are exposed, STAC enables tools to discover and query datasets across different providers using consistent spatial, temporal, and property-based criteria.&lt;/p&gt;
&lt;p&gt;JupyterGIS now includes a &lt;strong&gt;STAC browser user interface&lt;/strong&gt; that allows users to explore STAC catalogs directly from within a project. The browser makes use of the &lt;strong&gt;STAC Filter extension&lt;/strong&gt;, enabling users to define rich queries on catalog items. Based on the catalog metadata, JupyterGIS automatically generates the corresponding UI components for defining these filters, making it possible to refine searches and add selected items to a project as layers without leaving the Jupyter environment.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Exploring Sentinel 3 STAC in JupyterGIS" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/expanding-geospatial-workflows-in-jupytergis-stac/images/002-0_JbD8lLupayBrGKrD.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Exploring Sentinel 3 STAC in JupyterGIS&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;At the moment, the STAC browser ships with a small set of preconfigured catalogs: &lt;strong&gt;CDSE’s Copernicus catalog&lt;/strong&gt;, &lt;strong&gt;CNES’s Geodes catalog&lt;/strong&gt;, and &lt;strong&gt;University of Southampton’s WorldPop&lt;/strong&gt;. This limited selection reflects the early stage of the feature. Work is already underway by the Eric and Wendy Schmidt Center for Data Science &amp;amp; Environment (DSE) at &lt;strong&gt;UC Berkeley&lt;/strong&gt; to allow users to &lt;strong&gt;connect to arbitrary STAC catalogs by providing their own catalog URL&lt;/strong&gt;, and to introduce a &lt;strong&gt;catalog of STAC catalogs&lt;/strong&gt; to make discovering and configuring additional data sources easier in future releases.&lt;/p&gt;
&lt;h2 id="story-maps-in-jupytergis"&gt;Story Maps in JupyterGIS&lt;/h2&gt;
&lt;p&gt;Communicating geospatial results often requires more than interactive maps alone. To address this, JupyterGIS now introduces a &lt;strong&gt;Story Map feature&lt;/strong&gt; that makes it possible to &lt;strong&gt;combine narrative content with map-based views inside a single interface&lt;/strong&gt;. Inspired by existing GIS storytelling tools, this feature allows users to structure a sequence of markdown text and map position, where each step can capture a specific state of the project, including visible layers, layers symbology, and map extent.&lt;/p&gt;
&lt;p&gt;Story Maps in JupyterGIS are designed to complement exploratory and analytical workflows, providing a lightweight way to present results directly from the same environment in which they were produced. This makes it easier to move from data exploration to communication without exporting projects to external tools.&lt;/p&gt;
&lt;p&gt;Try it live in your browser by clicking on the following link, &lt;a href="https://notebook.link/@quantstack/earthquakes-story-map"&gt;https://notebook.link/@quantstack/earthquakes-story-map&lt;/a&gt;, hosted by notebook.link, a free service for sharing Jupyter documents.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="JupyterGIS story maps showcased in notebook.link" src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/expanding-geospatial-workflows-in-jupytergis-stac/images/003-0_CyW1M7dUYYwo9Po0.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;JupyterGIS story maps showcased in &lt;a href="https://notebook.link/"&gt;notebook.link&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="acknowledgments"&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;This work on &lt;a href="https://github.com/geojupyter/jupytergis"&gt;JupyterGIS&lt;/a&gt; by &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt; was funded by the &lt;a href="https://cnes.fr/"&gt;French National Centre for Space Studies (CNES).&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/expanding-geospatial-workflows-in-jupytergis-stac/images/004-0_QxCgIK0N8j8jDhVC.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="about-the-author"&gt;About the author&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/in/gjmooney/"&gt;Greg Mooney&lt;/a&gt; is a Scientific Computing Developer at &lt;a href="https://quantstack.net"&gt;QuantStack&lt;/a&gt;. He is one of the core developers of JupyterGIS, the author of jupyterlab-gather, and a contributor to several other Jupyter extensions.&lt;/p&gt;
</content><category term="geoscience"/><category term="JupyterGIS"/><category term="science"/></entry><entry><title>Collaborative editing for GIS workflows with Jupyter and QGIS</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2025/real-time-collaboration-and-collaborative-editing-for/" rel="alternate"/><published>2025-02-26T18:50:00+00:00</published><updated>2025-07-16T19:41:00+00:00</updated><author><name>Martin Renou</name></author><id>tag:jasongrout.github.io,2025-02-26:/medium-archive/pelican/posts/2025/real-time-collaboration-and-collaborative-editing-for/</id><summary type="html">&lt;p&gt;The QGIS open-source project is a cornerstone in the geosciences ecosystem, providing robust tools for spatial data analysis and…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2025/real-time-collaboration-and-collaborative-editing-for/images/001-1__WoRjRDGSKbaUY6b4TsndA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The QGIS open-source project is a cornerstone in the geosciences ecosystem, providing robust tools for spatial data analysis and visualisation. While QGIS excels in empowering researchers and engineers, the evolving landscape of geospatial research demands enhanced collaboration and accessibility, prompting a shift towards web-based technologies.&lt;/p&gt;
&lt;h2 id="collaboration-in-jupyter"&gt;Collaboration in Jupyter&lt;/h2&gt;
&lt;p&gt;Collaboration has long been a key requirement for data science and scientific computing workflows, but Jupyter Notebooks historically lacked built-in real-time collaboration features.&lt;/p&gt;
&lt;p&gt;To bridge this gap, the &lt;a href="https://github.com/jupyterlab/jupyter-collaboration"&gt;&lt;strong&gt;jupyter-collaboration&lt;/strong&gt;&lt;/a&gt; project has focused on integrating multi-user editing capabilities directly into JupyterLab and Jupyter Notebook. This effort builds on foundational work in conflict-free replicated data types (CRDTs), leveraging technologies like &lt;a href="https://github.com/yjs/yjs"&gt;&lt;strong&gt;Yjs&lt;/strong&gt;&lt;/a&gt;, and required integration into the Notebook document model and WebSocket-based architecture.&lt;/p&gt;
&lt;figure&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/0e8IQ76sulI" title="0" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
&lt;p&gt;Making Notebook code suggestions in collaboration mode with &lt;a href="https://github.com/jupyterlab-contrib/jupyter-suggestions"&gt;https://github.com/jupyterlab-contrib/jupyter-suggestions&lt;/a&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This approach did not only enable collaborative editing of notebooks, but also opened the door for collaboration on other editing UIs. This was done e.g. in &lt;a href="https://github.com/jupytercad/JupyterCAD"&gt;&lt;strong&gt;JupyterCAD&lt;/strong&gt;&lt;/a&gt;, a 3D parametric modeler that allows multiple users to collaboratively design and manipulate CAD models within JupyterLab.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Read more about JupyterCAD here &lt;a href="/posts/2025/announcing-jupytercad-3-0/"&gt;https://blog.jupyter.org/announcing-jupytercad-3-0-d8f4b7b0a719&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/Zu0AT6IRA98" title="JupyterCAD suggestions" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
&lt;p&gt;Collaboration in JupyterCAD&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="introducing-jupytergis"&gt;Introducing JupyterGIS&lt;/h2&gt;
&lt;p&gt;Today, we are excited to announce &lt;a href="https://github.com/geojupyter/jupytergis"&gt;JupyterGIS&lt;/a&gt;, a web-based, collaborative, and extensible interface for GIS, leveraging the JupyterLab application framework and integrating seamlessly with the Jupyter notebook interface.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/geojupyter/jupytergis"&gt;JupyterGIS&lt;/a&gt; provides the following key features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a JupyterLab extension for collaborative editing of geospatial data files: with COG, Shapefile, GeoJSON data source support,&lt;/li&gt;
&lt;li&gt;support for &lt;strong&gt;importing, exporting and collaborating with QGIS files,&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;advanced analysis and editing features with an &lt;strong&gt;identify tool&lt;/strong&gt; and a &lt;strong&gt;symbology panel&lt;/strong&gt; approaching what QGIS provides,&lt;/li&gt;
&lt;li&gt;easily &lt;strong&gt;share and deploy GIS projects&lt;/strong&gt; using JupyterLite.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: JupyterGIS is not an official Jupyter subproject.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="gis-features"&gt;GIS features&lt;/h2&gt;
&lt;h3 id="raster-and-vector-layers"&gt;Raster and vector layers&lt;/h3&gt;
&lt;p&gt;JupyterGIS allows you to create multiple types of raster and vector layers, including local or remote GeoTIFFs, GeoJSON, shapefiles, and tile services.&lt;/p&gt;
&lt;p&gt;You can select from a set of pre-defined tile services in our gallery, or you can provide your own source.&lt;/p&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/4_voiMm2zPk" title="1" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;h3 id="identify-tool-and-filtering"&gt;Identify tool and filtering&lt;/h3&gt;
&lt;p&gt;Akin to QGIS, we provide an identify tool and filtering capabilities, helping you to inspect your datasource.&lt;/p&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/Cs500f7eQMA" title="2" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;h3 id="symbology"&gt;Symbology&lt;/h3&gt;
&lt;p&gt;The symbology of a layer refers to its visual representation on the map, helping you to analyze your data comfortably. JupyterGIS provides a similar feature for its raster and vector layers.&lt;/p&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/nyFPZCShyxs" title="3" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;h3 id="spatio-temporal-data"&gt;Spatio-temporal data&lt;/h3&gt;
&lt;p&gt;You can easily animate and analyze your spatio-temporal data.&lt;/p&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/y6OSPdlW_kU" title="4" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;h3 id="python-api"&gt;Python API&lt;/h3&gt;
&lt;p&gt;Even though you can do most operations from the UI, JupyterGIS also provides a Python API enabling scripting capabilities, which can be used to process data and operate on JupyterGIS documents programmatically from a Jupyter notebook.&lt;/p&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/gUn1JHg1y4Y" title="5" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;h2 id="collaborative-features"&gt;Collaborative features&lt;/h2&gt;
&lt;p&gt;Building upon our previous work to enable collaborative editing in JupyterCAD, we developed a shared document model to support multi-user workflows in JupyterGIS.&lt;/p&gt;
&lt;p&gt;Everything is shared between collaborators, from layers data to symbology and filtering rules.&lt;/p&gt;
&lt;p&gt;We also provide some collaboration features like the ability to see other collaborators’ cursors, follow collaborators’ viewports, add geolocated Google Docs-like comment conversations, and see what layer features collaborators are identifying.&lt;/p&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/FzHYYCvWyu0" title="6" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;h2 id="try-it"&gt;Try it!&lt;/h2&gt;
&lt;p&gt;You can directly try &lt;a href="https://github.com/geojupyter/jupytergis"&gt;JupyterGIS&lt;/a&gt; in your browser, without installing anything, thanks to &lt;a href="https://github.com/jupyterlite/jupyterlite"&gt;JupyterLite&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupytergis.readthedocs.io/en/latest/lite/lab/index.html?path=france_hiking.jGIS/"&gt;https://jupytergis.readthedocs.io/en/latest/lite/lab/index.html&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="documentation"&gt;Documentation&lt;/h2&gt;
&lt;p&gt;Check out the Python API reference and tutorials on how to get started in our documentation:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupytergis.readthedocs.io/"&gt;https://jupytergis.readthedocs.io&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;We are excited to welcome new contributors and see the &lt;a href="https://github.com/geojupyter/jupytergis"&gt;JupyterGIS&lt;/a&gt; community grow. Here are some exciting developments on our radar for the future:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support for more data source types.&lt;/li&gt;
&lt;li&gt;Processing tools,&lt;/li&gt;
&lt;li&gt;Support for suggestions by collaborators, similar to the inline suggestions feature of JupyterCAD,&lt;/li&gt;
&lt;li&gt;An improved and more featureful Python API,&lt;/li&gt;
&lt;li&gt;A better coverage of QGIS features.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-can-you-support-our-work"&gt;How can you support our work?&lt;/h2&gt;
&lt;p&gt;Your support is important, if you would like to help us build more exciting tools around JupyterGIS, do not hesitate to contact us &lt;a href="https://jupyter.zulipchat.com/#narrow/channel/471314-geojupyter"&gt;on the public geojupyter Zulip channel!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Additionally, you can join us for the bi-weekly GeoJupyter hackathon on Wednesday &lt;a href="https://geojupyter.org/calendar.html"&gt;https://geojupyter.org/calendar.html&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="acknowledgments"&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;This work on JupyterGIS by &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt; and &lt;a href="https://www.simula.no/"&gt;Simula Research Lab&lt;/a&gt; (Simula) &lt;a href="/posts/2024/jupytergis/"&gt;was funded by the European Space Agency (ESA) for our proposal “&lt;em&gt;Real-time collaboration and collaborative editing for GIS workflows with Jupyter and QGIS&lt;/em&gt;.”&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We are also grateful to &lt;a href="https://dse.berkeley.edu"&gt;The Eric and Wendy Schmidt Center for Data Science &amp;amp; Environment (DSE) at UC Berkeley&lt;/a&gt; for funding the work of Matt Fisher on the project.&lt;/p&gt;
&lt;p&gt;Finally, this wouldn’t have been possible without the foundational work on &lt;a href="https://github.com/jupytercad/JupyterCAD"&gt;JupyterCAD&lt;/a&gt; initiated by &lt;a href="https://github.com/trungleduc"&gt;Duc Trung Le&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="about-the-jupytergis-contributors"&gt;About the JupyterGIS contributors&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2025/real-time-collaboration-and-collaborative-editing-for/images/002-1_FvjrRTQuLq-RcpISEHyB8w.jpg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/in/meriem-ben-ismail-163042230/"&gt;Meriem Ben Ismail&lt;/a&gt; is a Scientific Software Developer at &lt;a href="https://quantstack.net"&gt;QuantStack&lt;/a&gt;. She just completed her Software Engineering degree at &lt;a href="https://insat.rnu.tn"&gt;INSAT&lt;/a&gt; (National Institute of Applied Sciences and Technology in Tunisia) and her six-month internship as an open-source scientific software engineer at &lt;a href="https://quantstack.net"&gt;QuantStack&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2025/real-time-collaboration-and-collaborative-editing-for/images/003-1_XiLiEd21JkqLBa_SjgN4gg.jpg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/in/nicolas-brichet-a26369150/"&gt;Nicolas Brichet&lt;/a&gt; is a Scientific Software Developer at QuantStack. He holds a master’s degree in robotics from the University of Montpellier. Prior to joining Quantstack, Nicolas worked for almost fourteen years in French research institutes (INRAE and CNRS), as software developer for scientific research. He also worked on different parts of the data lifecycle, such as data acquisition, analysis, and storage.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2025/real-time-collaboration-and-collaborative-editing-for/images/004-1_wLk7y0bKAluKt1Du2r2MfA.jpg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/in/david-brochart-4208721/"&gt;David Brochart&lt;/a&gt; is a Technical Director at QuantStack. David used to work in the semiconductor industry as a digital circuit designer, mostly using FPGAs. He studied telecommunications at the French “Telecom Bretagne” engineering school, with major in digital circuit design. David also worked as a researcher in hydrology at Irstea, a French scientific research institute, where he heavily used the Python scientific stack.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2025/real-time-collaboration-and-collaborative-editing-for/images/005-1_zPpzRreH5i7dnvg6L9DK_A.jpg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/mfisher87"&gt;Matt Fisher&lt;/a&gt; is a Research Software Engineer and Community Manager at &lt;a href="https://dse.berkeley.edu"&gt;Schmidt Center for Data Science &amp;amp; Environment&lt;/a&gt;. Matt is passionate about open science, community-owned software, teaching and learning, accessibility, and inclusion. It is his treasured privilege to support researchers and educators in their missions by working on projects like &lt;a href="https://qgreenland.org"&gt;QGreenland&lt;/a&gt; and &lt;a href="https://github.com/geojupyter/jupytergis"&gt;JupyterGIS!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2025/real-time-collaboration-and-collaborative-editing-for/images/006-1_J4D8_KdSR60tPA_TVAhURA.jpeg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/in/annefouilloux/"&gt;Anne Fouilloux&lt;/a&gt;, a Senior Research Engineer, specializes in Open Science, FAIR data, and Big Data analytics. With a PhD in Atmospheric Physics, she has contributed to Pangeo and EOSC (European Open Science Cloud), focusing on data management, Earth system modeling, and scalable computing. A strong advocate for Open Science, she advances data accessibility and interoperability to drive scientific innovation.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2025/real-time-collaboration-and-collaborative-editing-for/images/007-1_z2By7q9wyJvunxZNezKHxg.jpg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/in/gjmooney/"&gt;Greg Mooney&lt;/a&gt; is a Scientific Computing Developer at &lt;a href="https://quantstack.net"&gt;QuantStack&lt;/a&gt;. He received a Bachelors degree in Software Engineering from &lt;a href="https://www.asu.edu/"&gt;Arizona State University (ASU).&lt;/a&gt; Before joining QuantStack, he worked as an Aegis Computer Network Technician, working on the network infrastructure connecting various sensor systems onboard naval vessels.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2025/real-time-collaboration-and-collaborative-editing-for/images/008-1_rliFUY5GuF6sqKnjho66EQ.jpg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/martinRenou"&gt;Martin Renou&lt;/a&gt; is a Technical Director at &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt; and a maintainer of &lt;a href="https://jupyter.org/"&gt;Project Jupyter&lt;/a&gt;. Among other projects Martin is a core team member of the ipywidgets project and maintains many Jupyter widget packages such as &lt;a href="https://github.com/jupyter-widgets/ipyleaflet"&gt;ipyleaflet&lt;/a&gt;, &lt;a href="https://github.com/bloomberg/ipydatagrid"&gt;ipydatagrid&lt;/a&gt;, &lt;a href="https://github.com/QuantStack/ipygany"&gt;ipygany&lt;/a&gt;, &lt;a href="https://github.com/martinRenou/ipycanvas"&gt;ipycanvas&lt;/a&gt;, and &lt;a href="https://github.com/bqplot/bqplot"&gt;bqplot&lt;/a&gt;. He is a co-creator of the &lt;a href="https://github.com/voila-dashboards/voila/"&gt;Voilà&lt;/a&gt; dashboarding system, and the &lt;a href="https://github.com/jupyter-xeus/xeus-python"&gt;xeus-python&lt;/a&gt; kernel.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2025/real-time-collaboration-and-collaborative-editing-for/images/009-1_0_qw_xXLELz_8gHUB-3JZw.jpg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/arjxn-py"&gt;Arjun Verma&lt;/a&gt; is a Scientific Software Development Intern at &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt;. He is also a final year undergraduate student at Cluster Innovation Centre, University of Delhi. He loves 3D &amp;amp; GIS and also contributes to &lt;a href="https://github.com/jupytercad/JupyterCAD"&gt;JupyterCAD&lt;/a&gt; and is one of the maintainers of &lt;a href="https://pybamm.org/"&gt;PyBaMM&lt;/a&gt; where he has also been &lt;a href="https://summerofcode.withgoogle.com/"&gt;GSoC&lt;/a&gt; contributor and mentor.&lt;/p&gt;
</content><category term="geoscience"/><category term="science"/></entry><entry><title>Interactive Mapping with ipyopenlayers</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2024/interactive-mapping-with-ipyopenlayers/" rel="alternate"/><published>2024-09-05T15:30:00+00:00</published><updated>2024-09-05T15:30:00+00:00</updated><author><name>Cheour Nour</name></author><id>tag:jasongrout.github.io,2024-09-05:/medium-archive/pelican/posts/2024/interactive-mapping-with-ipyopenlayers/</id><summary type="html">&lt;p&gt;Bringing the Power of OpenLayers to Jupyter.&lt;/p&gt;
</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;Bringing the Power of OpenLayers to Jupyter.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Interactive maps play a crucial role in presenting complex geospatial information in a clear and engaging manner. While the Python ecosystem already offers an impressive range of libraries for visualization, ipyopenlayers stands out as a powerful new tool that allows for the seamless integration of the advanced features of the OpenLayers JavaScript library into Jupyter. In this article, we will present the main features of ipyopenlayers and demonstrate how this library can transform your geospatial data into dynamic, interactive visualizations.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-what-is-ipyopenlayers"&gt;1. What is ipyopenlayers?&lt;/h2&gt;
&lt;p&gt;ipyopenlayers is an open-source Python library that integrates OpenLayers, a popular JavaScript library for creating interactive maps, directly into Jupyter Notebooks. By combining the strengths of Jupyter and OpenLayers, ipyopenlayers allows users to create interactive maps with ease. Its versatility and simplicity make it an ideal choice for a wide range of applications, from data exploration to presenting geospatial analysis.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="2-getting-started-with-ipyopenlayers"&gt;2. Getting Started with ipyopenlayers&lt;/h2&gt;
&lt;p&gt;To start using ipyopenlayers, you only need to install the library via pip:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;ipyopenlayers
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Once installed, you’re ready to embark on your interactive map-making adventure!&lt;/p&gt;
&lt;h3 id="a-creating-your-first-map"&gt;a) Creating Your First Map&lt;/h3&gt;
&lt;p&gt;ipyopenlayers has a user-friendly interface that makes creating maps simple and quick. Here’s how to generate a basic map with just a few lines of code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;ipyopenlayers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Map&lt;/span&gt;

&lt;span class="c1"&gt;# Create a map centered on a specific location&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;center&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;zoom&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Display the map&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="Screenshot of a simple ipyopenlayers map displayed inline in the Jupyter notebook" src="https://jasongrout.github.io/medium-archive/pelican/posts/2024/interactive-mapping-with-ipyopenlayers/images/001-1_B-klBKQToGuUZtwb3xOKCQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Screenshot of a simple ipyopenlayers map displayed inline in the Jupyter notebook&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="b-adding-layers-and-controls"&gt;b) Adding Layers and Controls&lt;/h3&gt;
&lt;p&gt;Maps are more than just images; they allow you to mark specific locations and overlay various data. ipyopenlayers makes it easy to add layers and controls to your maps. For example, here’s how to add a raster tile layer from OpenStreetMap and a zoom slider control:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;ipyopenlayers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RasterTileLayer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ZoomSlider&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# Add a raster tile layer&lt;/span&gt;
&lt;span class="n"&gt;raster_layer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;RasterTileLayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://{a-c}.basemaps.cartocdn.com/dark_all/&lt;/span&gt;&lt;span class="si"&gt;{z}&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{x}&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{y}&lt;/span&gt;&lt;span class="s1"&gt;.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_layer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raster_layer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Add a zoom slider control&lt;/span&gt;
&lt;span class="n"&gt;zoom_slider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ZoomSlider&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_control&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;zoom_slider&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="Screenshot of a simple ipyopenlayers map displayed inline in the Jupyter notebook showcasing the basic controls" src="https://jasongrout.github.io/medium-archive/pelican/posts/2024/interactive-mapping-with-ipyopenlayers/images/002-0_lsbq37wgQCiEuXyc.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Screenshot of a simple ipyopenlayers map displayed inline in the Jupyter notebook showcasing the basic controls&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="3-main-features-of-ipyopenlayers"&gt;3. Main Features of ipyopenlayers&lt;/h2&gt;
&lt;p&gt;ipyopenlayers is packed with a wide array of functionalities that make it ideal for creating advanced interactive maps in Jupyter Notebooks. From adding custom controls to enabling dynamic layer and overlays, this library offers you tools for enhancing your geospatial visualizations. Here’s a sneak peek at some of its key features.&lt;/p&gt;
&lt;h3 id="a-vector-tile-layer-support"&gt;a) Vector Tile Layer Support&lt;/h3&gt;
&lt;p&gt;Vector Tile Layers enable efficient, high-quality rendering of geospatial data, allowing for smooth zooming and dynamic styling of map features. They offer flexibility and customization for detailed interactive maps in Jupyter Notebooks.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;ipyopenlayers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;VectorTileLayer&lt;/span&gt;

&lt;span class="c1"&gt;# Create a map centered at coordinates [0, 0] with zoom level 0&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;center&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;zoom&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Add a VectorTileLayer to the map&lt;/span&gt;
&lt;span class="n"&gt;vector_layer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="n"&gt;VectorTileLayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer/tile/&lt;/span&gt;&lt;span class="si"&gt;{z}&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{y}&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{x}&lt;/span&gt;&lt;span class="s1"&gt;.pbf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;source_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;MVT&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_layer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector_layer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Display the map&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="Screenshot of an ipyopenlayers map displaying a vector layout in the Jupyter notebook" src="https://jasongrout.github.io/medium-archive/pelican/posts/2024/interactive-mapping-with-ipyopenlayers/images/003-0_BsaDtYKDTbciUFgt.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Screenshot of an ipyopenlayers map displaying a vector layout in the Jupyter notebook&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="b-geojson-support"&gt;b) GeoJSON Support&lt;/h3&gt;
&lt;p&gt;GeoJSON is a popular format for encoding geographic data structures. Here’s how to display GeoJSON data on your map:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;ipyopenlayers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;GeoJSON&lt;/span&gt;

&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;center&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;77.15641232105159&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;34.561348453091625&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;zoom&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;9.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Note the coordinate order: [latitude, longitude]&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;demo.json&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Add the GeoJSON layer&lt;/span&gt;
&lt;span class="n"&gt;geo_json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GeoJSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Add the GeoJSON layer to the map&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_layer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;geo_json&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="Screenshot of an ipyopenlayers map displaying a GeoJSON dataset as a layer on a map" src="https://jasongrout.github.io/medium-archive/pelican/posts/2024/interactive-mapping-with-ipyopenlayers/images/004-0_KCYQDm_sq-YRTzhb.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Screenshot of an ipyopenlayers map displaying a GeoJSON dataset as a layer on a map&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="c-geotiff-support"&gt;c) GeoTIFF Support&lt;/h3&gt;
&lt;p&gt;ipyopenlayers also enables the visualization of GeoTIFF files, which are essential for displaying raster data with geographic context:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;ipyopenlayers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GeoTIFFTileLayer&lt;/span&gt;

&lt;span class="c1"&gt;# Create a GeoTIFF layer&lt;/span&gt;
&lt;span class="n"&gt;geo_tiff_layer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GeoTIFFTileLayer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/36/Q/WD/2020/7/S2A_36QWD_20200701_0_L2A/TCI.tif&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_layer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;geo_tiff_layer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure&gt;
&lt;img alt="Screenshot of an ipyopenlayers map displaying a GeoTIFF dataset as a layer on a map" src="https://jasongrout.github.io/medium-archive/pelican/posts/2024/interactive-mapping-with-ipyopenlayers/images/005-0_4q0M7_QjVtXcrItA.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Screenshot of an ipyopenlayers map displaying a GeoTIFF dataset as a layer on a map&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="4-advanced-use-cases-building-an-electricity-map-dashboard"&gt;4. Advanced Use Cases: Building an Electricity Map Dashboard&lt;/h2&gt;
&lt;p&gt;The potential of ipyopenlayers extends far beyond basic mapping. One innovative application is its use in creating dynamic and interactive dashboards that integrate with other powerful Python tools.&lt;/p&gt;
&lt;p&gt;A notable example is the &lt;a href="https://github.com/Nour-Cheour10/electricitymap_dashboard"&gt;&lt;strong&gt;Electricity Map Dashboard&lt;/strong&gt;&lt;/a&gt;, a project designed to visualize and analyze electricity data from around the world using ipyopenlayers in conjunction with libraries such as &lt;em&gt;electricityMap&lt;/em&gt;, &lt;em&gt;ipywidgets, voila&lt;/em&gt;, and &lt;em&gt;bqplot&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id="key-features"&gt;Key Features:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Real-time Visualization&lt;/strong&gt;: Using electricityMap, the dashboard overlays real-time electricity consumption and carbon intensity data onto a global map with ipyopenlayers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interactive Controls&lt;/strong&gt;: ipywidgets enables users to filter data by region, select specific time periods, and toggle between different map layers, making the data exploration highly interactive.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic Plotting&lt;/strong&gt;: bqplot allows users to generate customizable plots synchronized with the map, offering deeper insights into electricity trends and carbon emissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="Screenshot of the Electricity Map dashboard built with bqplot and ipyopenlayers" src="https://jasongrout.github.io/medium-archive/pelican/posts/2024/interactive-mapping-with-ipyopenlayers/images/006-1_KVMcn3qI6S79S9N8nKIy1Q.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Screenshot of the Electricity Map dashboard built with bqplot and ipyopenlayers&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This project showcases the powerful integration of ipyopenlayers with other Python tools to create a dynamic, user-friendly dashboard for analyzing global electricity trends.&lt;/p&gt;
&lt;h2 id="5-developments"&gt;5. Developments&lt;/h2&gt;
&lt;p&gt;The future of ipyopenlayers is promising, with upcoming features like improved integration with other Python libraries, advanced customization tools, and expanded support for geospatial data formats. We invite the open-source community to contribute to this project, whether through suggestions, bug reports, or code contributions.&lt;/p&gt;
&lt;h2 id="6-conclusion"&gt;6. Conclusion&lt;/h2&gt;
&lt;p&gt;With ipyopenlayers, the power of interactive maps is at your fingertips within your Jupyter Notebooks. This Python library allows you to present your geospatial data in an engaging and insightful way, making your analyses more dynamic and accessible. Whether you’re a data analyst, researcher, or simply a mapping enthusiast, ipyopenlayers provides the tools you need to turn your data into compelling visualizations.&lt;/p&gt;
&lt;p&gt;So, what are you waiting for? Install ipyopenlayers and start creating interactive maps that bring your data to life!&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="7-acknowledgments"&gt;7. Acknowledgments&lt;/h2&gt;
&lt;p&gt;This project was made possible through the collaboration and support of several individuals. Special thanks to &lt;strong&gt;Martin Renou , Technical Director at QuantStack,&lt;/strong&gt; whose guidance and expertise were instrumental throughout this project. His mentorship greatly contributed to the success of this ipyopenlayers.&lt;/p&gt;
&lt;h2 id="8-about-the-author"&gt;8. About the Author&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.linkedin.com/in/nour-cheour-606143206/"&gt;&lt;em&gt;Nour Cheour&lt;/em&gt;&lt;/a&gt; &lt;em&gt;has just completed her Engineering degree at INSAT and her six-month internship as an open-source scientific software engineer at QuantStack.&lt;/em&gt;&lt;/p&gt;
</content><category term="geoscience"/><category term="science"/><category term="visualization"/></entry><entry><title>JupyterGIS</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2024/jupytergis/" rel="alternate"/><published>2024-06-12T17:09:00+00:00</published><updated>2024-06-12T17:09:00+00:00</updated><author><name>Sylvain Corlay</name></author><id>tag:jasongrout.github.io,2024-06-12:/medium-archive/pelican/posts/2024/jupytergis/</id><summary type="html">&lt;p&gt;Pioneering Web-based, Collaborative, and Open-source GIS Tools&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2024/jupytergis/images/001-1_IkYCf2cbk3SaxaROQ0eUsA.webp" alt="The logo of Project Jupyter next to a stylised terrestrial globe" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Pioneering Web-based, Collaborative, and Open-source GIS Tools&lt;/p&gt;
&lt;p&gt;&lt;em&gt;By Sylvain Corlay [1], Anne Fouilloux [2], and Monika Weissschnur [3]&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We are thrilled to announce that the European Space Agency (ESA) is funding our proposal “&lt;em&gt;Real-time collaboration and collaborative editing for GIS workflows with Jupyter and QGIS&lt;/em&gt;.”&lt;/p&gt;
&lt;p&gt;The consortium spearheading this project comprises &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt; and &lt;a href="https://www.simula.no/"&gt;Simula Research Lab&lt;/a&gt; (Simula), two organizations with a long history of contributions to the Jupyter project and the broader open-source scientific computing ecosystem.&lt;/p&gt;
&lt;p&gt;The goal of the project is to build solid foundations for a versatile web-based user interface for Geographic Information Systems (GIS) workflows. It will comprise several components, including a JupyterLab extension for collaboratively editing QGIS project files and the integration of these APIs in the Jupyter Notebook. We will then explore integration with platforms like the &lt;a href="https://dataspace.copernicus.eu/"&gt;Copernicus Data Space Ecosystem&lt;/a&gt; (CDSE) and the &lt;a href="https://eosc.eu/"&gt;European Open Science Cloud&lt;/a&gt; (EOSC).&lt;/p&gt;
&lt;h2 id="collaborative-workflows-in-geosciences"&gt;Collaborative workflows in geosciences&lt;/h2&gt;
&lt;p&gt;Collaborative editing of documents 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.&lt;/p&gt;
&lt;p&gt;Looking ahead, the potential of co-editing extends far beyond text documents and will apply to all authoring UIs, from CAD to image processing. We think that the shift to collaborative editing will be even more transformative for larger and more complex projects, which are inherently social and require the concerted effort of large teams. Whether you are designing a stadium, a plane, or an ocean liner, you need to coordinate a diverse expertise to build a unified model. In geosciences, it may range from climate modeling to agriculture, ecology, urban planning, and many more areas of expertise. For such endeavors, we must embrace tools favoring collaboration, and this applies to the future web-based user interfaces for geoscience research.&lt;/p&gt;
&lt;p&gt;We have been working on collaborative editing in the core of JupyterLab for the past three years. Our approach is based on the &lt;a href="https://yjs.dev/"&gt;Yjs framework&lt;/a&gt;, an implementation of CRDT data structures (Conflict-free Replicated Data Type). We have learned that since it is so tied to the data model, 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 why JupyterGIS will be built from the ground up with collaborative editing in mind.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;JupyterGIS will be the first open-source GIS tool to provide collaborative editing features.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Importantly, JupyterGIS is part of a broader mission to enable collaborative workflows in open-source technical computing. The &lt;a href="/posts/2023/collaborative-cad-in-jupyterlab/"&gt;JupyterCAD&lt;/a&gt; project, a collaborative CAD modeler, is another example of this endeavor. By sharing knowledge and resources, both JupyterGIS and JupyterCAD will benefit from and contribute to each other’s progress, ultimately driving innovation and productivity in their respective fields.&lt;/p&gt;
&lt;h2 id="from-the-desktop-to-the-web"&gt;From the desktop to the web&lt;/h2&gt;
&lt;p&gt;Advanced authoring tools, including IDEs, CAD modelers, image processing software, and GIS applications, are essential for professionals who rely on them for extended periods. These users have high expectations and demand key features to optimize their productivity and workflow. Among these features are extensibility with plugins, configurable keyboard shortcuts, themability, internationalization, scriptability, a unified settings system, and the ability to operate across multiple browser windows and devices.&lt;/p&gt;
&lt;p&gt;Developing a new application from the ground up that meets all these requirements is a formidable challenge. This is where the JupyterLab application framework proves invaluable. By leveraging this framework, developers can build custom, feature-rich authoring tools that incorporate these essential features from the outset, making it an ideal solution for creating modern, user-centric applications.&lt;/p&gt;
&lt;p&gt;Beyond the pure authoring user interface, for which JupyterLab is a great tool, it is also the &lt;em&gt;perfect&lt;/em&gt; tool for integration with notebook-based workflows. As part of this project, we will develop an advanced Python API to manage JupyterGIS sessions, leveraging Jupyter’s robust display system to incorporate sophisticated GIS features inline in Jupyter notebooks and consoles. This integration will further enhance the capabilities and versatility of our application. This feature will follow the same architecture as that of JupyterCAD for the integration with the notebook user interface.&lt;/p&gt;
&lt;h2 id="real-world-applications"&gt;Real-world applications&lt;/h2&gt;
&lt;p&gt;JupyterGIS is meant to become a &lt;em&gt;general-purpose&lt;/em&gt; tool. However, we will work with teams of practitioners on &lt;em&gt;specific&lt;/em&gt; real-world applications to ensure that it addresses their needs.&lt;/p&gt;
&lt;p&gt;One such project concerns the use of digital and GIS solutions for emergency management. While practitioners involved in emergency management already have experience with such tools, we are convinced that web-based applications built with collaboration in mind from the start can foster improved coordination and collaboration, and therefore the effectiveness of the response.&lt;/p&gt;
&lt;p&gt;Response teams comprise different organizations, including the affected municipalities, police, emergency response organizations like the Red Cross, and advisers such as the U.S. Army Corps of Engineers (USACE) in the United States or the Norwegian Water Resources and Energy Directorate (NVE) in Norway. Even when using the same incident management system, miscommunications and misunderstandings can occur between these stakeholders, resulting in delays or improper use of resources. An improved integration of collaborative GIS software can improve upon the existing tooling.&lt;/p&gt;
&lt;h2 id="building-collaborations-in-europe-and-beyond"&gt;Building collaborations in Europe and beyond&lt;/h2&gt;
&lt;p&gt;We will partner with key practitioners and make sure JupyterGIS addresses their use cases. Integration in the &lt;a href="https://dataspace.copernicus.eu/"&gt;Copernicus Data Space Ecosystem&lt;/a&gt; (CDSE) and the &lt;a href="https://eosc.eu/"&gt;European Open Science Cloud&lt;/a&gt; (EOSC) will be key to the adoption of JupyterGIS and demonstrate its deployment in such environments.&lt;/p&gt;
&lt;p&gt;Beyond Europe, we are currently working on including this project into a broader scope. We are excited to be partnering with the “&lt;a href="https://www.live-env.org/"&gt;LIVE-Env&lt;/a&gt;” project, an open-source initiative spearheaded by Alyssa Goodman at Harvard University. Furthermore, we are establishing a key collaboration with the &lt;a href="https://bids.berkeley.edu/home"&gt;Berkeley Institute for Data Sciences&lt;/a&gt; (BIDS) and the &lt;a href="https://dse.berkeley.edu/"&gt;Schmidt Center for Data Science and Environment&lt;/a&gt; (DSE) at UC Berkeley and &lt;a href="https://2i2c.org/"&gt;2i2c&lt;/a&gt;, with a focus on Jupyter-based geosciences.&lt;/p&gt;
&lt;h2 id="affiliations"&gt;Affiliations&lt;/h2&gt;
&lt;p&gt;[1] &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt;[2] &lt;a href="https://www.simula.no/"&gt;Simula&lt;/a&gt;[3] &lt;a href="https://www.simula.no/"&gt;Simula&lt;/a&gt;&lt;/p&gt;
</content><category term="collaboration"/><category term="geoscience"/><category term="JupyterGIS"/><category term="science"/></entry><entry><title>Desktop GIS software in the cloud with JupyterHub: A QGreenland workshop success story</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2023/desktop-gis-software-in-the-cloud-with-jupyterhub/" rel="alternate"/><published>2023-08-02T16:23:00+00:00</published><updated>2023-08-02T16:51:00+00:00</updated><author><name>Matt Fisher</name></author><id>tag:jasongrout.github.io,2023-08-02:/medium-archive/pelican/posts/2023/desktop-gis-software-in-the-cloud-with-jupyterhub/</id><summary type="html">&lt;p&gt;A QGreenland workshop success story&lt;/p&gt;
</summary><content type="html">&lt;p&gt;👋 We are Trey Stafford and Matt Fisher, co-authors of the &lt;a href="https://github.com/nsidc/qgreenland"&gt;QGreenland&lt;/a&gt; data package’s source code. This year, we had the pleasure of running a hands-on geospatial data and open science &lt;a href="http://qgreenland-workshop-2023-researcher.github.io/"&gt;QGreenland Researcher Workshop&lt;/a&gt;. It was important for attendees to participate in the workshop in a hands-on way while minimizing the negative impacts of installing software, requiring expensive personal computers, and troubleshooting unique computer configurations. We felt a &lt;a href="https://jupyter.org/hub"&gt;JupyterHub&lt;/a&gt; was a good fit for our workshop for this reason, if it could accommodate our need for running QGIS — a desktop application.&lt;/p&gt;
&lt;p&gt;In this blog post, we will introduce QGreenland, describe our experience using JupyterHub in the cloud for our workshop’s computing environment, and discuss challenges we overcame to enable our attendees to use QGIS in a cloud graphical desktop environment. Finally, we will highlight some workshop outcomes and discuss opportunities for enhancement based on new developments in the Jupyter ecosystem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In our workshop, 25–30 international learners (including from Germany, India, France, Canada, Poland, and the United States) used &lt;em&gt;QGIS&lt;/em&gt; in a &lt;em&gt;JupyterHub&lt;/em&gt;’s browser-based Linux desktop environment to collaboratively test, explore, visualize, and process Earth science data simultaneously with the same user experience they expect from using &lt;em&gt;QGIS&lt;/em&gt; on their personal computers! Better yet, getting started was as simple as logging in.&lt;/strong&gt; Our workshop was a success story not just in education, but also in open source and collaborative development, and we want to share what we learned.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A map depicting Greenland is displayed within QGIS software running in a cloud-based desktop environment. A visualization of September 2012 Arctic sea ice concentration is overlaid." src="https://jasongrout.github.io/medium-archive/pelican/posts/2023/desktop-gis-software-in-the-cloud-with-jupyterhub/images/001-1_ZG76hcKdS3-4PppQ6lSnuQ.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Note the browser tabs at the top of this screenshot; this is a full desktop-based GIS environment running QGreenland in the cloud!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The JupyterHub used by the QGreenland 2023 Researcher Workshop was generously provided by the &lt;a href="https://cryointhecloud.com/"&gt;NASA CryoCloud&lt;/a&gt; team, whose mission is to help researchers transition to cloud-based collaboration.&lt;/p&gt;
&lt;h2 id="about-qgreenland"&gt;About QGreenland&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://qgreenland.org/"&gt;QGreenland&lt;/a&gt; is an open-source Greenland-focused geospatial data package for &lt;a href="https://qgis.org/en/site/"&gt;QGIS&lt;/a&gt;, a community-owned graphical Geographic Information System (GIS) platform. Researchers and members of the public leverage QGreenland’s ready-to-use interdisciplinary datasets to do field planning, teach about glaciers, and much more.&lt;/p&gt;
&lt;p&gt;QGreenland’s MIT-licensed &lt;a href="https://github.com/nsidc/qgreenland/"&gt;source code&lt;/a&gt; uses community-maintained open software like &lt;a href="https://gdal.org/index.html"&gt;GDAL&lt;/a&gt; and &lt;a href="https://qgis.org/pyqgis/latest"&gt;PyQGIS&lt;/a&gt; to automate data normalization and populate the QGIS project with important information like data provenance and the order of layers in the QGIS Layers Panel. Check out &lt;a href="https://qgreenland.readthedocs.io"&gt;our documentation&lt;/a&gt; to learn more! QGreenland also has a &lt;a href="https://www.youtube.com/@qgreenland/videos"&gt;YouTube channel&lt;/a&gt; with tutorials produced by &lt;a href="https://cires.colorado.edu/outreach/programs/qgreenland"&gt;CIRES Education and Outreach&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A map depicting Greenland is displayed within QGIS software running in a cloud-based desktop environment. Visualizations of bathymetric depth, Greenland ice sheet thickness, and Arctic sea routes are overlaid." src="https://jasongrout.github.io/medium-archive/pelican/posts/2023/desktop-gis-software-in-the-cloud-with-jupyterhub/images/002-0__t2MDU659mlYEvxD.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;&lt;em&gt;Once QGIS is installed, opening QGreenland is as easy as double-clicking the included “.qgs” file. Here, a representative view of QGreenland v3 alpha in QGIS is displayed with newly updated layers: Arctic sea routes (National Geospatial Intelligence Agency), bathymetric depth (General Bathymetric Chart of the Oceans (GEBCO)), and ice thickness (IceBridge BedMachine Greenland v5) layers.&lt;/em&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Based on user research, QGreenland has enabled:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the public to more easily access data gathered by researchers visiting Greenland: &lt;em&gt;“In Greenland, people are often asking, ‘how can we find the data the foreign scientists bring back from Greenland?’ Now we can directly utilize much of it.”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;researchers to plan field work: &lt;em&gt;“Being able to use QGreenland at our field station was critical to our research process!”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;educators to develop interactive lessons about Greenland and climate change: &lt;em&gt;“…using QGreenland for presentations because it is presentation quality already.”&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="qgreenlands-2023-researcher-workshop"&gt;QGreenland’s 2023 researcher workshop&lt;/h2&gt;
&lt;p&gt;One of the QGreenland team’s most important forms of direct user interaction and support is facilitating workshops. Most recently, we hosted a 3-day (total of 9 hours) virtual workshop for researchers focused on working with geospatial data in an open science framework. All of the &lt;a href="https://qgreenland-workshop-2023-researcher.github.io/content/materials.html"&gt;materials&lt;/a&gt; covered in the workshop were built &lt;a href="https://qgreenland-workshop-2023-researcher.github.io/content/built-with-open-source.html"&gt;using open-source tools&lt;/a&gt; and are MIT-licensed and &lt;a href="https://github.com/qgreenland-workshop-2023-researcher/qgreenland-workshop-2023-researcher.github.io"&gt;published on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="a-personal-computer-in-the-cloud"&gt;A “personal computer” in the cloud&lt;/h3&gt;
&lt;p&gt;We decided early on that we wanted to use JupyterHub to solve the diverse problems that come with “bring your own device” workshops. We experimented with administering our own &lt;a href="http://z2jh.jupyter.org"&gt;JupyterHub on Kubernetes&lt;/a&gt;, but the setup overhead was too high for our short workshop. CryoCloud’s JupyterHub enabled us to avoid this overhead and focus on serving our participants. Because the software that comprises CryoCloud is open-source and developed in collaboration with the communities CryoCloud serves, we could directly contribute to curating a computing environment ideal for our participants.&lt;/p&gt;
&lt;p&gt;JupyterHub is known for providing access to Jupyter Notebooks via JupyterLab, but it turns out it can also be used to host pretty much any interactive web based application! The &lt;a href="https://github.com/jupyterhub/jupyter-server-proxy/"&gt;jupyter-server-proxy&lt;/a&gt; project enables this, and there are additional packages that make running specific applications easier. &lt;a href="https://github.com/jupyterhub/jupyter-rsession-proxy"&gt;jupyter-rsession-proxy&lt;/a&gt; makes it easy to run &lt;a href="https://posit.co/download/rstudio-server/"&gt;RStudio&lt;/a&gt; inside JupyterHub, &lt;a href="https://github.com/betatim/vscode-binder/"&gt;jupyter-vscode-proxy&lt;/a&gt; allows running code-server (fully open source self-hosted version of Visual Studio Code) inside a JupyterHub, etc. Pertinent to our use case is &lt;a href="https://github.com/jupyterhub/jupyter-remote-desktop-proxy"&gt;jupyter-remote-desktop-proxy&lt;/a&gt;, which lets you run a complete Linux desktop environment inside your JupyterHub! This was critical for our workshop, as it allowed us to use QGIS — purely desktop software, not adapted for the web — from inside a web browser. Workshop participants did not need to install anything. This enabled participants to focus on the &lt;em&gt;content&lt;/em&gt; of our workshop rather than the logistics of setting up and debugging tools on their varied machines.&lt;/p&gt;
&lt;p&gt;The CryoCloud JupyterHub enabled each of our workshop participants to provision their own compute environment (JupyterLab + Linux Desktop) with all of our workshop’s dependencies pre-installed. It also set everyone on equitable footing — someone accessing the workshop on a 10 year old laptop would get the same computing resources as someone on a brand new MacBook Pro.&lt;/p&gt;
&lt;h3 id="challenges-scaling-qgreenland"&gt;Challenges scaling QGreenland&lt;/h3&gt;
&lt;p&gt;The CryoCloud JupyterHub already had &lt;em&gt;jupyter-remote-desktop-proxy&lt;/em&gt; and &lt;em&gt;QGIS&lt;/em&gt; installed, so we could validate this approach to our workshop quickly. However, to use &lt;em&gt;QGreenland&lt;/em&gt; at this scale, we needed to solve a couple of usability problems. The first issue was a user experience problem: the operating system did not have appropriate file type associations for &lt;em&gt;QGIS&lt;/em&gt;, so files like the &lt;em&gt;QGreenland&lt;/em&gt; project file would not open in &lt;em&gt;QGIS&lt;/em&gt; when double-clicked in the desktop file browser. We quickly discovered a solution and integrated it with a &lt;a href="https://github.com/CryoInTheCloud/hub-image/pull/59"&gt;simple pull request&lt;/a&gt; to the Docker image we were using.&lt;/p&gt;
&lt;p&gt;The second problem was a performance problem: QGIS would take several minutes to open QGreenland from the hub’s shared storage drive. After some investigation, it turned out this was due to us loading multiple GB of data from an NFS share! While a long term solution might involve getting QGIS to load data directly from cloud object storage (like S3), we instead decided to go a different route — provision each user a small, fast and temporary &lt;a href="https://aws.amazon.com/ebs/"&gt;Elastic Block Store&lt;/a&gt; disk. At the start of the workshop, we provided all users a small script that would copy the dataset from NFS to this faster disk once, and this drastically reduced load times from about 5 minutes to under 3 seconds! You can follow our debugging process &lt;a href="https://github.com/CryoInTheCloud/hub-image/issues/60"&gt;on this issue&lt;/a&gt;, and find the JupyterHub config used to provision these disks &lt;a href="https://github.com/2i2c-org/infrastructure/blob/5078e5b6e2115930468f910f3095a9ffd1261eb3/helm-charts/basehub/values.yaml#L616"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By overcoming these challenges, we created a smooth, intuitive, and performant computing experience for all of our participants, most of whom had never been exposed to this sort of collaborative computing environment.&lt;/p&gt;
&lt;h3 id="outcomes"&gt;Outcomes&lt;/h3&gt;
&lt;p&gt;The workshop participants engaged in small group work to complete various exercises, group discussions, and data scenarios. Each group produced Jupyter Notebooks and GitHub Discussions posts as deliverables. We created an &lt;a href="https://qgreenland-workshop-2023-researcher.github.io/outcomes/"&gt;outcomes&lt;/a&gt; webpage to summarize our participants’ accomplishments. One highlight was &lt;a href="https://github.com/orgs/qgreenland-workshop-2023-researcher/discussions/categories/fair-care"&gt;participants’ insightful commentary on FAIR &amp;amp; CARE principles.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Based on these outcomes, we consider our workshop a success. While we put in a significant amount of time creating our materials, CryoCloud’s cloud costs and our time investment in preparing computing resources were relatively small. For approximately 25 people, our cloud costs break down to roughly &lt;strong&gt;$1/person/day&lt;/strong&gt;!&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;The CryoCloud JupyterHub met our workshop needs and provided a delightful experience for administrators and participants alike, and we are excited for what’s next. JupyterLab 4 and jupyter_collaboration v1.0.0, a real-time collaboration extension, were &lt;a href="/posts/2023/jupyterlab-4-0-is-here/"&gt;just announced&lt;/a&gt;, and the CryoCloud team is currently working to integrate these new releases into their hub. Real-time collaboration will enable exciting cloud use cases, like small groups working together on the same notebook without a screen share, or organizers providing technical support in a live notebook. We anticipate running this workshop again. We are excited to use JupyterHub again and look forward to experimenting with these new features!&lt;/p&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;h3 id="reviewers"&gt;Reviewers&lt;/h3&gt;
&lt;p&gt;In alphabetical order, thanks to Twila Moon, Yuvi Panda, Tasha Snow, and Alyse Thurber for their time contributing to this post!&lt;/p&gt;
&lt;h3 id="cryocloud"&gt;CryoCloud&lt;/h3&gt;
&lt;p&gt;Snow, Tasha, Millstein, Joanna, Scheick, Jessica, Sauthoff, Wilson, Leong, Wei Ji, Colliander, James, Pérez, Fernando, James Munroe, Felikson, Denis, Sutterley, Tyler, &amp;amp; Siegfried, Matthew. (2023). CryoCloud JupyterBook (2023.01.26). Zenodo.&lt;a href="https://doi.org/10.5281/zenodo.7576602"&gt;https://doi.org/10.5281/zenodo.7576602&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="2i2c"&gt;2i2c&lt;/h3&gt;
&lt;p&gt;2i2c is a non-profit organization that runs open-source &lt;a href="https://github.com/2i2c-org/infrastructure"&gt;infrastructure&lt;/a&gt; for collaborative computing, and maintains the CryoCloud JupyterHub used in this workshop. You can see the complete configuration of this JupyterHub in this &lt;a href="https://github.com/CryoInTheCloud/hub-image"&gt;public repository&lt;/a&gt;.&lt;/p&gt;
</content><category term="accessibility"/><category term="cloud computing"/><category term="education"/><category term="events"/><category term="geoscience"/><category term="JupyterHub"/><category term="science"/><category term="workshops"/></entry><entry><title>Jupyter meets the Earth: EarthCube Community Meeting</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyter-meets-the-earth-earthcube-community-meeting/" rel="alternate"/><published>2020-08-17T19:42:00+00:00</published><updated>2020-09-11T00:32:00+00:00</updated><author><name>Lindsey Heagy</name></author><id>tag:jasongrout.github.io,2020-08-17:/medium-archive/pelican/posts/2020/jupyter-meets-the-earth-earthcube-community-meeting/</id><summary type="html">&lt;p&gt;Summary of the EarthCube community meeting on July 27, 2020&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyter-meets-the-earth-earthcube-community-meeting/images/001-0_h1CnyqyQk9K9crjW.jpg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;By: Lindsey Heagy, Fernando Pérez, Joe Hamman and the Jupyter meets the Earth team&lt;/em&gt; (cross-posted on the &lt;a href="https://medium.com/pangeo/jupyter-meets-the-earth-earthcube-community-meeting-ab32f5c91caf"&gt;Pangeo Blog&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;As a part of the &lt;a href="https://www.earthcube.org/EC2020"&gt;2020 EarthCube annual meeting&lt;/a&gt;, we held a &lt;a href="/posts/2019/jupyter-meets-the-earth/"&gt;&lt;em&gt;Jupyter meets the Earth&lt;/em&gt;&lt;/a&gt; community discussion session on July 27. The Jupyter meets the Earth project is an EarthCube funded effort that combines research use cases in geosciences with technical developments within the Jupyter and Pangeo ecosystems. In this model of equal partners, scientific questions help drive software infrastructure development, and new technologies expand the horizons of viable research. This online workshop was an opportunity to gather members of the community, welcome newcomers, provide updates on the Jupyter and Pangeo ecosystems, and have time for discussion.&lt;/p&gt;
&lt;p&gt;The goals for the meeting were to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Provide an overview of the Jupyter &amp;amp; Pangeo ecosystems for researchers from the EarthCube community.&lt;/li&gt;
&lt;li&gt;Outline avenues for getting involved.&lt;/li&gt;
&lt;li&gt;Gather input for what advancements would best serve your research needs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Over 100 participants registered, and we had contributions from 9 speakers. The meeting was a mix of presentations and Q&amp;amp;A from the community. The full recording of the meeting is available on &lt;a href="https://youtu.be/Zj3Gm4LNfwo"&gt;youtube&lt;/a&gt;, and we encourage continued discussion on the &lt;a href="https://discourse.pangeo.io/t/jupyter-meets-the-earth-earthcube-meeting-july-27/689"&gt;associated discourse post&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="presentations-google-drive-folder"&gt;Presentations (&lt;a href="https://drive.google.com/drive/folders/1lyIJcqHKqhstrnQU5ZWEgSsTRbVjpkZn?usp=sharing"&gt;google drive folder&lt;/a&gt;)&lt;/h2&gt;
&lt;p&gt;Fernando Pérez (&lt;a href="https://docs.google.com/presentation/d/1oR-LmqSkUsFUZBWH4qz1TDnRzd2oWHxUXgYxqjUb3LY/edit?usp=sharing"&gt;slides&lt;/a&gt;) started off the meeting by introducing the &lt;em&gt;Jupyter meets the Earth&lt;/em&gt; project — an effort aimed at driving forward technological developments in the Jupyter and Pangeo ecosystems in partnership with researchers in the geosciences. The motivation is to advance research and the software that supports it by combining domain expertise with methods in data science, software &amp;amp; data engineering practices. He provided an overview of Project Jupyter, highlighting the interplay between software and content, services, standards, community and governance that is necessary for broad-impact scientific open source software projects. He presented the extensible &lt;a href="https://jupyterlab.readthedocs.io/en/stable/"&gt;JupyterLab&lt;/a&gt; platform, that can be adapted to domain-specific needs as illustrated by the &lt;a href="http://www.bionet.ee.columbia.edu/research/ffbo/fbl"&gt;FlyBrainLab&lt;/a&gt; and &lt;a href="/posts/2020/jupyterlab-ros/"&gt;Cloud Robotics Command Station&lt;/a&gt; efforts. The &lt;em&gt;Jupyter meets the Earth&lt;/em&gt; team aims to similarly develop tools and extensions that will support interactive computing workflows in the geosciences.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Overview of Jupyter and Jupyter meets the Earth from Fernando Pérez" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyter-meets-the-earth-earthcube-community-meeting/images/002-1_SmsFWNwWDW9-8jtDOa6_RQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Overview of Jupyter and Jupyter meets the Earth from Fernando Pérez&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Next up, Scott Henderson (&lt;a href="https://docs.google.com/presentation/d/1pdlUGRrX46kJYZHTkGA6HuOYHQ_Yt2NNxQlLpRFB9jo/edit?usp=sharing"&gt;slides&lt;/a&gt;) provided an overview of Pangeo and associated community events, including Hackweeks. “Pangeo is first and foremost a community promoting open, reproducible, and scalable science.” In terms of technology, this involves developing fully open source tools that can be deployed on shared computational infrastructure, such as HPC centers or the cloud, and hosting several forums to foster communication between scientists and software developers. Software is an important avenue for connection, but the overarching goals are a rallying point for a community. The critical mass of enthusiastic people has been key to the success of the Pangeo model.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Overview of Pangeo and Hackweeks from Scott Henderson" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyter-meets-the-earth-earthcube-community-meeting/images/003-1_VOlTcY7mi7kIKT22Kc2_bw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Overview of Pangeo and Hackweeks from Scott Henderson&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The Pangeo model is intended for use both on the cloud and on High Performance Computing (HPC) infrastructure. Kevin Paul gave the third talk on Pangeo on HPC (&lt;a href="https://docs.google.com/presentation/d/1eKDCK25jxjSFixwQX9GW56w84ZpaxRywEvMMYuX3Tg8/edit?usp=sharing"&gt;slides&lt;/a&gt;, &lt;a href="https://binder.pangeo.io/v2/gh/pangeo-data/pangeo-tutorial-agu-2018/master?filepath=notebooks%2Fgmet_ensemble.ipynb"&gt;notebook&lt;/a&gt;). HPC and cloud computing environments present technical differences in terms of usage patterns, file access, and resource allocations, however, the goals of Jupyter and Pangeo are similar in both cases — to enable interactive computing and simplify the user experience on both. Tools such as &lt;a href="https://dask.org/"&gt;dask&lt;/a&gt; and &lt;a href="https://kubernetes.dask.org/en/latest/"&gt;dask-kubernetes&lt;/a&gt;/&lt;a href="https://jobqueue.dask.org/en/latest/index.html"&gt;dask-jobqueue&lt;/a&gt; are targeted at enabling parallel computing on both infrastructures.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Kevin Paul giving us a demo of Pangeo on the Cheyenne supercomputer" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyter-meets-the-earth-earthcube-community-meeting/images/004-1_ofmEc1YhrAqvCs3FXhuI2g.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Kevin Paul giving us a demo of Pangeo on the Cheyenne supercomputer&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;After a Q&amp;amp;A session that included questions on the computational cost of running Pangeo Infrastructure and efficient use of tools including Zarr, we moved on to a series of lightning talks.&lt;/p&gt;
&lt;h2 id="lightning-talks"&gt;Lightning Talks&lt;/h2&gt;
&lt;p&gt;Six speakers presented short lightning talks on aspects of the Jupyter and Pangeo ecosystems ranging from technologies to scientific applications to opportunities to engage with the Pangeo community.&lt;/p&gt;
&lt;p&gt;Anderson Banihirwe (&lt;a href="https://gist.github.com/andersy005/e08891883d91c01ab0ce963046d86343#file-intake-jupyter-meets-earth-ipynb"&gt;notebook&lt;/a&gt; and details in &lt;a href="https://github.com/earthcube2020/ec20_banihirwe_etal"&gt;intake-esm&lt;/a&gt;) kicked off the lightning talks by giving a demo and overview of Intake — a project to streamline loading and sharing of data. He showed a demo that included both Optimum Interpolation Sea Surface Temperature (OISST) data, as well as data from the Coupled Model Intercomparison Project (CMIP) running interactively on Cheyenne, the supercomputer at NCAR and using Dask for distributing the workload across nodes, with real-time diagnostics of the distributed computation provided by &lt;a href="https://github.com/dask/dask-labextension"&gt;Dask’s JupyterLab extension&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Demo from Anderson Banihirwe using intake to access OSSIT and CMIP data" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyter-meets-the-earth-earthcube-community-meeting/images/005-0_cCp6QLc_60xWGsAN.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Demo from Anderson Banihirwe using intake to access OSSIT and CMIP data&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Next up, Scott Dale Peckham (&lt;a href="https://github.com/peckhams/balto_gui"&gt;notebook&lt;/a&gt;) gave a presentation that demonstrated the use of ipywidgets and ipyleaflet to create an interactive interface for fast access to geoscience data on servers that support the OpenDAP protocol. The project he champions is called &lt;a href="https://cires.colorado.edu/research/research-groups/project/balto-earthcube-brokered-alignment-long-tail-observations"&gt;BALTO, the Brokered Alignment of Long Tail Observations&lt;/a&gt; (also a famous Siberian Husky and sled dog). These graphical interface elements can be used in a programmatic workflow such as a Jupyter Notebook, but they conveniently encapsulate many details of accessing the data and resources provided by BALTO. This allows the scientists to focus on their research questions, without having to break their workflow to access data with external tools.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="BALTO GUI demo from Scott Peckham" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyter-meets-the-earth-earthcube-community-meeting/images/006-1_Esr4Ec_RKwqx2la7G9eDFg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;BALTO GUI demo from Scott Peckham&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;We then had a talk from Edom Moges (&lt;a href="https://docs.google.com/presentation/d/1QUdRZEI84jq9PoBEucnrdHkReghYrEg-jjGJZWzVvJA/edit?usp=sharing"&gt;slides&lt;/a&gt;) who presented work he is conducting with Laurel Larsen’s research group in hydrology as one use case in the Jupyter meets the Earth project. The presentation focused on a data synthesis work that aims to build a Jupyter based interactive platform that transforms raw hydrometeorological data to a gap-filled ready to use data for several intensively monitored watersheds across the US. The platform will be a basis for future community initiatives to benchmark data processing approaches, support comparative hydrological studies and comprehensive data-driven forecasts.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Lightning talk from Edom Moges and Laurel Larsen on the hydrology use-case in the Jupyter meets the Earth project" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyter-meets-the-earth-earthcube-community-meeting/images/007-1_HPOqGuk9hRBV2WCl5QATIg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Lightning talk from Edom Moges and Laurel Larsen on the hydrology use-case in the Jupyter meets the Earth project&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Georgiana Dolocan (&lt;a href="https://drive.google.com/file/d/1yu7gnRkHXkNhefVoBiho_Sl-C_7f0l85/view"&gt;video&lt;/a&gt;) impressed us next with an animated video accompanied with her narration to explain JupyterHub, its components (authenticator, spawner, proxy) as well as deployment options. The littlest JupyterHub (TLJH) is designed to make it simple to deploy multi-user Jupyter infrastructure on a single machine, and the more sophisticated Zero 2 JupyterHub Kubernetes (Z2JH) option is meant to scale to many users and large computational needs.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Animations from Georgiana Dolocan on JupyterHub" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyter-meets-the-earth-earthcube-community-meeting/images/008-1_c1JTc_WrA5t1oUgnvvtcKA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Animations from Georgiana Dolocan on JupyterHub&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Presenting from the perspective of an enthusiastic user, Erik Sundell (&lt;a href="https://docs.google.com/presentation/d/1TafZRXouz57SRBonHGt6bogwQp5_kVrTP1RkpkO0xB8/edit?usp=sharing"&gt;slides&lt;/a&gt;) gave us an overview of &lt;a href="http://jupyterbook.org"&gt;Jupyter Book&lt;/a&gt;: a tool to quickly create beautiful websites from notebooks and markdown. He walked through how to host them for free online in a time efficient way, and highlighted features including connections to Binder, which enable users to run content interactively.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Overview of JupyterBook from Erik Sundell" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyter-meets-the-earth-earthcube-community-meeting/images/009-1_YfKDEmbHLgt-3eJlRqClaw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Overview of JupyterBook from Erik Sundell&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Joe Hamman (&lt;a href="https://docs.google.com/presentation/d/1GKVLUsa971FHZkPDhdTSgxZQralWyy-292aIg1tFY64/edit?usp=sharing"&gt;slides&lt;/a&gt;) finished off our lightning talk session by outlining avenues for connecting with the Pangeo community. These include day-to-day communication on GitHub, Gitter, discourse and twitter, as well as more recent coffee-breaks. Depending on your topic of interest, there are also working groups that you can join on topics including data, machine learning, education, cloud computing, or you can suggest your own!&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Connecting with the Pangeo community — an overview from Joe Hamman" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyter-meets-the-earth-earthcube-community-meeting/images/010-1_OOkrUZhvWq5ywRPlaQ8QDA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Connecting with the Pangeo community — an overview from Joe Hamman&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="follow-up-and-further-discussion"&gt;Follow up and further discussion&lt;/h2&gt;
&lt;p&gt;To continue the discussion afterwards, we posed (&lt;a href="https://docs.google.com/presentation/d/1UqRd34zeOa5cW3aXFsjjh3TprgEHDl1cf4n1_BZezls/edit?usp=sharing"&gt;slides&lt;/a&gt;) a few questions where we hope to learn from the community’s needs, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What does your interactive computing workflow look like today? What do you envision it will be in 5 years?&lt;/li&gt;
&lt;li&gt;How would you like to publish and share your computational research and where can improvements be made?&lt;/li&gt;
&lt;li&gt;How do you stay up to date with the evolving open-source ecosystem? How would you like to be keeping up-to-date?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We are looking for your input and ideas! Please add your thoughts to the &lt;a href="https://discourse.pangeo.io/t/jupyter-meets-the-earth-earthcube-meeting-july-27/689"&gt;discourse post&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="thanks"&gt;Thanks&lt;/h2&gt;
&lt;p&gt;Thank you to the participants, speakers, and especially Lynne Schreiber and Ouida Meier from the EarthCube office for all of their support and work (even with very last-minute requests!).&lt;/p&gt;
&lt;p&gt;This work is part of the &lt;em&gt;Jupyter meets the Earth&lt;/em&gt; project, supported by the NSF EarthCube program under awards &lt;a href="https://www.nsf.gov/awardsearch/showAward?AWD_ID=1928406"&gt;1928406&lt;/a&gt;, &lt;a href="https://www.nsf.gov/awardsearch/showAward?AWD_ID=1928374"&gt;1928374&lt;/a&gt;.&lt;/p&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/Zj3Gm4LNfwo" title="Jupyter Meets the Earth - Community Forum" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
</content><category term="geoscience"/><category term="open science"/><category term="science"/></entry><entry><title>Interactive GIS in Jupyter with ipyleaflet</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/" rel="alternate"/><published>2019-09-24T22:54:00+00:00</published><updated>2019-09-25T15:19:00+00:00</updated><author><name>QuantStack</name></author><id>tag:jasongrout.github.io,2019-09-24:/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/</id><summary type="html">&lt;p&gt;As Jupyter grew in popularity, a broad ecosystem of data visualization packages based on Jupyter widgets has arisen, bringing even more…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;As Jupyter grew in popularity, a broad ecosystem of visualization packages based on Jupyter widgets has been developed, bringing even more interactivity to the Jupyter world.&lt;/p&gt;
&lt;p&gt;In this article, we dive into Jupyter Interactive Widgets and the &lt;a href="https://github.com/jupyter-widgets/ipyleaflet"&gt;ipyleaflet&lt;/a&gt; package, an interactive maps visualization system for Jupyter.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A non-interactive map." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/images/001-1_YA26aVkLDM1KXjNtGu5-Hw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A non-interactive map.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="jupyter-widgets"&gt;Jupyter Widgets&lt;/h2&gt;
&lt;p&gt;Jupyter Interactive Widgets are “special objects” that can be instantiated by the user in their code and result in a counterpart component being created in the front-end.&lt;/p&gt;
&lt;p&gt;The core &lt;code&gt;ipywidgets&lt;/code&gt; package provides a collection of controls that Jupyter users can use to build simple UIs as part of their notebooks (sliders, buttons, dropdowns, layout components).&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Basic ipywidgets controls." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/images/002-1_a8s90I7Kj3DyBjmh_LjAaw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Basic ipywidgets &lt;strong&gt;controls&lt;/strong&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;More than a collection of controls, it provides a framework upon which a large ecosystem of components has been built, allowing notebook authors to capture user inputs in very diverse ways.&lt;/p&gt;
&lt;p&gt;Popular libraries built upon interactive widgets include&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bloomberg/bqplot"&gt;&lt;strong&gt;bqplot&lt;/strong&gt;&lt;/a&gt;, a 2-D plotting system for Jupyter,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/maartenbreddels/ipyvolume/"&gt;&lt;strong&gt;ipyvolume&lt;/strong&gt;&lt;/a&gt;, a 3-D plotting package based on WebGL and ThreeJS,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyter-widgets/pythreejs"&gt;&lt;strong&gt;PythreeJS&lt;/strong&gt;&lt;/a&gt;, a 3-D scene description package exposing a large part of the ThreeJS API to Jupyter,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/mariobuikhuizen/ipyvuetify"&gt;&lt;strong&gt;ipyvuetify&lt;/strong&gt;&lt;/a&gt;, a large collection of VuetifyJS components exposed to Jupyter,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/maartenbreddels/ipywebrtc"&gt;&lt;strong&gt;ipywebrtc&lt;/strong&gt;&lt;/a&gt;, a library exposing the features of the WebRTC protocol to Jupyter kernels,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/twosigma/beakerx"&gt;&lt;strong&gt;beakerx&lt;/strong&gt;&lt;/a&gt;, a collection of widgets, extensions, and kernels for Jupyter,&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;and many more… This list is not comprehensive and dozens of other widget packages have been developed.&lt;/p&gt;
&lt;h3 id="key-aspects-of-jupyter-widgets-include"&gt;Key aspects of Jupyter widgets include:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bidirectionality&lt;/strong&gt;Widgets are not just meant for display but can also be used to capture user inputs, which can then trigger new computation. Notebook authors can compose sophisticated applications including a variety of components from different packages.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Language Agnosticism&lt;/strong&gt;Built upon the Jupyter ecosystem, the interactive widget protocol used for the synchronization between the kernel and the front-end is well-specified and can be implemented for any kernel.&lt;br&gt;
Back-ends for other languages than Python already exist, such as for C++ (with the &lt;a href="https://github.com/QuantStack/xeus-cling"&gt;xeus-cling&lt;/a&gt; Jupyter kernel), and languages of the JVM such as Clojure or Groovy (with the &lt;a href="http://beakerx.com/"&gt;beakerx&lt;/a&gt; kernels).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extensibility&lt;/strong&gt;Jupyter widgets are not meant as a monolithic system with one and only one way to achieve a specific task. We strive to provide a foundational layer allowing third-party widget authors to be as inventive as possible.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;A common pattern for Jupyter widget packages has been to bring the capabilities of popular JavaScript visualization frameworks to Jupyter with a bridge based on ipywidgets. This is the case for the ipyleaflet package, as well as pythreejs and ipyvuetify.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Another use case is the development of &lt;em&gt;ad hoc&lt;/em&gt; controls that are not necessarily relevant for a mainstream visualization package, but may be specific to a scientific field. An example is the &lt;a href="https://github.com/erdc/ipymesh"&gt;ipymesh&lt;/a&gt; project by Chris Kees which can be used to draw PSLG (planar straight-line graphs) in the Jupyter notebook.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="ipyleaflet"&gt;ipyleaflet&lt;/h2&gt;
&lt;p&gt;ipyleaflet is a Jupyter - LeafletJS bridge, bringing mapping capabilities to the notebook and JupyterLab.&lt;/p&gt;
&lt;p&gt;Built as a bridge between the LeafletJS package and Jupyter, the ipyleaflet API maps to that of LeafletJS, bringing most of the core features of the package to Jupyter, and enabling a few popular LeafletJS extensions. A small difference is that following the Python coding style, ipyleaflet makes use of &lt;em&gt;snake_case&lt;/em&gt; instead of &lt;em&gt;CamelCase&lt;/em&gt; for attribute names.&lt;/p&gt;
&lt;h3 id="ipyleaflet-features"&gt;ipyleaflet features&lt;/h3&gt;
&lt;p&gt;The main components to the library are layers and controls, respectively items to be displayed on the map, and interactive widgets overlayed on the map area for greater interactivity.&lt;/p&gt;
&lt;p&gt;The first thing for which you may want to change the default value are the zoom level, the position, or the base layer for the map.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Changing the basemap layer in an ipyleaflet map." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/images/003-1_02DmPnByfXtPkeYnytNvfA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Changing the basemap layer in an ipyleaflet map.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Maps can be interactively edited in the Jupyter notebook, by dynamically changing or adding layers. In this screenshot, we add a custom layer including a GeoJSON dataset.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: An alternative layer to GeoJSON is GeoData, which lets the user load the data in the form of a GeoPandas dataframe instead of raw GeoJSON.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;
&lt;img alt="Adding a GeoJSON dataset to an interactive map." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/images/004-1_3t7T3EGIeA10R0XrrM9ZVw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Adding a GeoJSON dataset to an interactive map.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;A number of simple primitives are available such as markers and heatmaps. In the following screencast, we show how primitive properties can be linked with other widgets, and used as means to take user input on a map:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Linking properties of ipyleaflet primitives to other Jupyter widgets." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/images/005-1_31XAuFgaeln-mrjxxRzdxA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Linking properties of ipyleaflet primitives to other Jupyter widgets.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;em&gt;splitmap&lt;/em&gt; control can be used to compare to different set of ipyleaflet layers at the same location.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The splitmap control." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/images/006-1_lZT_nX-jH3jcMLFdhTUxXw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The &lt;strong&gt;splitmap&lt;/strong&gt; control.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Another interesting layer is the &lt;em&gt;velocity&lt;/em&gt; layer which can be used to display wind velocity data. This control can take data in the form of an &lt;a href="https://github.com/pydata/xarray"&gt;xarray&lt;/a&gt; dataset.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The velocity layer." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/images/007-1_u2J2aJy6FfBaFytG0ppruw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The &lt;strong&gt;velocity&lt;/strong&gt; layer.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;More classical visualization tools are also available, such as &lt;em&gt;choropleths&lt;/em&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A choropleth layer." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/images/008-1_MbLnLa_LsugvYdBNjGhhQQ.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A &lt;strong&gt;choropleth&lt;/strong&gt; layer.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="jupyterlab-integration-with-the-sidecar-and-theming-support"&gt;JupyterLab Integration with the Sidecar and Theming Support&lt;/h3&gt;
&lt;p&gt;ipyleaflet is well integrated with JupyterLab&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ipyleaflet controls make use of the &lt;strong&gt;JupyterLab themes&lt;/strong&gt; for coloring so that they don’t stand out when using e.g. a dark theme.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="The support for JupyterLab themes in ipyleaflet." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/images/009-1_6tCnE8oedSXuEtiGKA1fAA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The support for JupyterLab &lt;strong&gt;themes&lt;/strong&gt; in ipyleaflet.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;ipyleaflet can be used in combination with the &lt;a href="https://github.com/jupyter-widgets/jupyterlab-sidecar/"&gt;&lt;strong&gt;JupyterLab sidecar&lt;/strong&gt;&lt;/a&gt; widget.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="Using the sidecar widget in JupyterLab to display a map aside of the notebook." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/images/010-1_eUr0hcPcBInlp125yA7sHg.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Using the &lt;strong&gt;sidecar&lt;/strong&gt; widget in JupyterLab to display a map aside of the notebook.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Together with the sidecar, a map can be programmatically added to the right-side toolbar of the JupyterLab application, and interactively edited in the notebook. This prevents the back-and-forth scrolling often required to see how changes are reflected visually.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The workflow enabled by ipyleaflet in combination with the sidecar is similar to that of the &lt;a href="https://github.com/OpenGeoscience/geonotebook"&gt;geonotebook&lt;/a&gt; project by Christopher Kotfila, Jonathan Beezley, and Dan LaManna from &lt;a href="https://www.kitware.com/"&gt;Kitware&lt;/a&gt;).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure&gt;
&lt;img alt="The geonotebook (which was based on the classic notebook) provided a similar workflow to the lab sidecar." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/images/011-1_u2dMqR9n5Vwl1ELtpTbVCg.jpg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The &lt;strong&gt;geonotebook&lt;/strong&gt; (which was based on the classic notebook) provided a similar workflow to the lab sidecar.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="a-more-advanced-example"&gt;A more advanced example&lt;/h3&gt;
&lt;p&gt;Combined with other widget libraries such as bqplot or the core ipywidget package, ipyleaflet users can easily compose more complex applications and dashboards. In the following screencast, we explore the wealth-of-nations dataset with a leafletmap, a bqplot line chart and a dropdown widget:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Exploring the wealth-of-nations dataset with ipyleaflet, bqplot and core ipywidgets." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/images/012-1_0SvmdK7ykkDXZ4oU-x6QzA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Exploring the wealth-of-nations dataset with ipyleaflet, bqplot and core ipywidgets.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="trying-ipyleaflet-online-with-mybinder"&gt;Trying ipyleaflet online with mybinder&lt;/h3&gt;
&lt;p&gt;If you would like to try out ipyleaflet &lt;em&gt;now&lt;/em&gt;, it is possible thanks to the binder project. Just click on the image below!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mybinder.org/v2/gh/jupyter-widgets/ipyleaflet/stable?filepath=examples"&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/images/013-1_AsxYLD3dKd9Vej3SII_eLg.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="interactive-gis-in-c-xleaflet"&gt;Interactive GIS in C++: xleaflet&lt;/h3&gt;
&lt;p&gt;As mentioned earlier, interactive widgets back-ends for other programming languages have be implemented. There is a C++ back-end for ipywidgets: &lt;a href="https://github.com/QuantStack/xwidgets"&gt;xwidgets&lt;/a&gt; which is the building block for creating other C++ widgets back-ends.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/images/014-0_aPvM-7TR9IbP_NXO.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/QuantStack/xleaflet"&gt;xleaflet&lt;/a&gt; is the C++ - LeafletJS bridge that exposes almost the same API as ipyleaflet, only that you use it from a C++ interpreter! It is based upon xwidgets which brings the bidirectional communication with the front-end.&lt;/p&gt;
&lt;p&gt;You can learn more about the &lt;a href="https://github.com/QuantStack/xeus-cling"&gt;xeus-cling&lt;/a&gt; Jupyter kernel, xwidgets and xleaflet by reading the following &lt;a href="/posts/2018/interpreted-c-for-gis-with-jupyter/"&gt;blogpost&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="xleaflet is the C++ backend to the jupyter-leaflet integration." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/images/015-1_m2ElLEj6r-6uDqXmA0tqRw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;&lt;strong&gt;xleaflet&lt;/strong&gt; is the C++ backend to the jupyter-leaflet integration.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="deploying-ipyleaflet-based-dashboards-with-voila"&gt;Deploying ipyleaflet-based dashboards with Voilà&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/images/016-1_36JTV2RMHwg0DEW6V00d2A.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/QuantStack/voila"&gt;Voilà&lt;/a&gt; is a tool that turns Jupyter notebooks into standalone dashboards. Built upon the Jupyter stack, it inherits the language agnosticism of the ecosystem, and can be used to produce standalone applications based on ipyleaflet.&lt;/p&gt;
&lt;p&gt;A companion project to Voilà is the Voilà gallery project, a public facing set up of JupyterHub serving Voilà dashboard. It is kindly hosted by &lt;a href="https://www.ovh.com/fr/"&gt;OVH&lt;/a&gt;. You can check out the Voilà gallery at URL &lt;a href="https://voila-gallery.org/services/gallery/"&gt;https://voila-gallery.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more resources about &lt;em&gt;voilà&lt;/em&gt;, check out&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the original announcement of the project: &lt;a href="https://blog.jupyter.org/and-voil%C3%A0-f6a2c08a4a93,"&gt;&lt;em&gt;And Voilà!&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;and for the gallery: &lt;a href="/posts/2019/a-gallery-of-voila-examples/"&gt;&lt;em&gt;A Gallery of Voilà Examples&lt;/em&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you check out the Voilà gallery, don’t miss Jeremy Tuloup’s GPX loader demo!&lt;/p&gt;
&lt;h2 id="jupyter-for-geo-sciences"&gt;Jupyter for Geo Sciences&lt;/h2&gt;
&lt;p&gt;Jupyter’s adoption is exploding in the GeoScience space. Notable projects building upon Jupyter include&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jeodpp.jrc.ec.europa.eu/home/"&gt;&lt;em&gt;&lt;strong&gt;JEODPP&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt; (JRC Earth Observation Data and Processing Platform) is a EU project providing petabyte scale storage and high-throughput computing capacities to facilitate large scale analysis of Earth Observation data. The main front-end to the platform is base on Jupyter. The mapping capability is based on &lt;strong&gt;ipyleaflet&lt;/strong&gt;. End users can request custom visualization that are returned to them in the form of lazily computed tile layers.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pangeo.io"&gt;&lt;em&gt;&lt;strong&gt;Pangeo&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt; is a community platform providing open, reproducible, and scalable sciences. The Pangeo software ecosystem involves open source tools such as xarray, Iris, Dask, Jupyter, and many other packages.&lt;/li&gt;
&lt;li&gt;It was &lt;a href="/posts/2019/jupyter-meets-the-earth/"&gt;recently announced&lt;/a&gt; that the NSF would be funding the UC Berkeley + NCAR “&lt;em&gt;&lt;strong&gt;EarthCube&lt;/strong&gt;&lt;/em&gt;” proposal “Jupyter meets the Earth: Enabling discovery in geoscience through interactive computing at scale”. The plan involves the development of interactive dashboards with &lt;strong&gt;Voilà&lt;/strong&gt; and contributions to the Voilà codebase.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="related-projects"&gt;Related Projects&lt;/h2&gt;
&lt;h3 id="jupyter-gmaps"&gt;Jupyter-gmaps&lt;/h3&gt;
&lt;p&gt;We should mention the &lt;a href="https://github.com/pbugnion/gmaps"&gt;jupyter-gmaps&lt;/a&gt; project by Pascal Bugnion. Jupyter-gmaps is a bridge between Google maps and Jupyter. Just like ipyleaflet, jupyter-gmaps is built upon the jupyter interactive widgets framework but relies on Google maps for the display instead of LeafletJS library.&lt;/p&gt;
&lt;p&gt;This is a high-quality widget by another core developer of ipywidgets. Pascal is also one of the people behind Voilà and the Voilà gallery.&lt;/p&gt;
&lt;h3 id="folium"&gt;Folium&lt;/h3&gt;
&lt;p&gt;The &lt;a href="https://github.com/python-visualization/folium"&gt;Folium&lt;/a&gt; project enables maps visualization in the Jupyter notebook. Just like ipyleaflet, it is based on LeafletJS. Folium was created by Rob Story and is now maintained by Frank Conengmo and Filipe Fernandes.&lt;/p&gt;
&lt;p&gt;A key difference between Folium and ipyleaflet is that ipyleaflet is built upon ipywidgets and allows bidirectional communication between the front-end and the backend enabling the use of the map to capture user input, while Folium is meant for displaying static data only. Folium enables many LeafletJS extensions, some of which may not be available in ipyleaflet at the moment.&lt;/p&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;The ipyleaflet project was started in 2015 by &lt;a href="https://twitter.com/ellisonbg?lang=en"&gt;Brian Granger&lt;/a&gt;, and funded by the &lt;a href="https://www.erdc.usace.army.mil/"&gt;ERDC&lt;/a&gt;. The further development by Sylvain Corlay and Martin Renou was supported by &lt;a href="https://quantstack.net/"&gt;QuantStack&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We are grateful to &lt;a href="https://www.ovh.com"&gt;OVH&lt;/a&gt; for kindly hosting the &lt;a href="http://voila-gallery.org"&gt;Voilà gallery&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Other key contributors to Voilà and ipyleaflet that should be thanked here are Maarten Breddels, Pascal Bugnion, and Yuvi Panda. We should also mention the recent contributions by &lt;a href="https://twitter.com/VasavanT"&gt;Vasavan Thirusittampalam&lt;/a&gt; who worked on the full-screen control and better interoperability with geopandas.&lt;/p&gt;
&lt;h2 id="about-the-authors"&gt;About the Authors&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/SylvainCorlay"&gt;Sylvain Corlay&lt;/a&gt;, and &lt;a href="https://twitter.com/martinRenou"&gt;Martin Renou&lt;/a&gt; are Scientific Software Developers at &lt;a href="https://github.com/QuantStack/"&gt;QuantStack&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="sylvain-corlay"&gt;Sylvain Corlay&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/images/017-1_6-g_O5JJQn4uSoAreSq9Pw_2x.jpeg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sylvain Corlay&lt;/strong&gt; is the founder and CEO of QuantStack.&lt;/p&gt;
&lt;p&gt;As an Open Source Developer, Sylvain contributes to Project Jupyter in the areas of interactive widgets and language kernels and is a steering committee member of the Project. Beyond QuantStack, Sylvain serves as a member of the board of directors of the NumFOCUS foundation. He also co-organizes the PyData Paris Meetup.&lt;/p&gt;
&lt;h3 id="martin-renou"&gt;Martin Renou&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/interactive-gis-in-jupyter-with-ipyleaflet/images/018-1_eZ36LOdroOy_-KBEN8TLlg_2x.jpeg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Martin Renou&lt;/strong&gt; is a Scientific Software Developer at QuantStack. Prior to joining QuantStack, Martin also worked as a Software developer at Enthought. He studied at the French Aerospace Engineering School ISAE-Supaero, with major in autonomous systems and programming.&lt;/p&gt;
&lt;p&gt;As an open source developer, Martin has worked on a variety of projects, such as SciviJS (a JavaScript 3-D mesh visualization library), Xtensor, and Xeus.&lt;/p&gt;
</content><category term="geoscience"/><category term="science"/><category term="visualization"/></entry><entry><title>Jupyter meets the Earth</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2019/jupyter-meets-the-earth/" rel="alternate"/><published>2019-09-09T17:48:00+00:00</published><updated>2020-08-07T17:34:00+00:00</updated><author><name>Lindsey Heagy</name></author><id>tag:jasongrout.github.io,2019-09-09:/medium-archive/pelican/posts/2019/jupyter-meets-the-earth/</id><summary type="html">&lt;p&gt;By Lindsey Heagy and Fernando Pérez&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/jupyter-meets-the-earth/images/001-1_s3i12gpdCYyM0srHQkPZnw.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;By Lindsey Heagy and Fernando Pérez&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We are thrilled to announce that the NSF is funding our EarthCube proposal &lt;em&gt;“Jupyter meets the Earth: Enabling discovery in geoscience through interactive computing at scale”&lt;/em&gt; (&lt;a href="https://doi.org/10.5281/zenodo.3369938"&gt;pdf&lt;/a&gt;). The team working on this project consists of Fernando Pérez [1, 2, 3], Joe Hamman [4], Laurel Larsen [5], Kevin Paul [6], Lindsey Heagy [1], Chris Holdgraf [1, 2] and Yuvi Panda [7]. Our project team includes members from the &lt;a href="https://jupyter.org"&gt;Jupyter&lt;/a&gt; and &lt;a href="http://pangeo.io/"&gt;Pangeo&lt;/a&gt; communities, with representation across the geosciences including climate modeling, water resource applications, and geophysics. Three active research projects, one in each domain, will motivate developments in the Jupyter and Pangeo ecosystems. Each of these research applications demonstrates aspects of a research workflow which requires scalable, interactive computational tools.&lt;/p&gt;
&lt;p&gt;In this project we intend to follow the patterns that have made Jupyter an effective and successful platform: we will drive the development of computational machinery by concrete use cases from our own experience and research needs, and then find the appropriate points for extension, abstraction, and generalization. We are motivated to advancing research of contemporary importance in geoscience, and are equally committed to producing work that leads to broad impact, general use infrastructure that benefits scientists, educators, industry, and the general community.&lt;/p&gt;
&lt;p&gt;The adoption of open languages such as Python and the coalescence of communities of practice around open-source tools, is visible in nearly every domain of science. This is a fundamental shift in how science is conducted and shared. In recent years, there have been several high-profile examples in which open tools from the Python and Jupyter ecosystems played an integral role in the research, from data analysis to the dissemination of results. These include the first image of a black hole from the &lt;a href="https://eventhorizontelescope.org/"&gt;Event Horizon Telescope team&lt;/a&gt; and the detection of gravitational waves by the &lt;a href="https://www.caltech.edu/about/news/gravitational-waves-detected-100-years-after-einstein-s-prediction-49777"&gt;LIGO collaboration&lt;/a&gt;. The utility of open-source software in projects like these and the success of open communities such as Pangeo, provide evidence of the force-multiplying impact of investing in an ecosystem of open, community-driven tools. Through this project, we will advance this open paradigm in geoscience research, while strengthening and improving the infrastructure that supports it. We made this argument when discussing the intended impacts of our proposal, and we are pleased that the NSF is investing in this vision.&lt;/p&gt;
&lt;h2 id="geoscience-use-cases"&gt;Geoscience use cases&lt;/h2&gt;
&lt;p&gt;Given our project’s aims and approach, participating actively in domain research is crucial to our success. The following descriptions are meant to offer a flavour of the research questions we are tackling, each led by a geoscientist in the team.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CMIP6 climate data analysis (Hamman).&lt;/strong&gt; The &lt;a href="https://www.wcrp-climate.org/wgcm-cmip"&gt;World Climate Research Program’s Coupled Model Intercomparison Project&lt;/a&gt; is now in its sixth phase and is expected to provide the most comprehensive and robust projections of future climate predictions. When complete, the archive is expected to exceed 18 PB in size. In the coming years, this collection of climate model experiments will form the basis for fundamental research, climate adaptation studies, and policy initiatives. While the CMIP6 dataset is likely to hold new answers to many pressing climate questions, the sheer volume of data is likely to present significant challenges to researchers. Indeed, new tools for scalable data analysis, machine learning, and inference are required to make the most out of these data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Large-Scale Hydrologic Modeling (Larsen).&lt;/strong&gt; Streamflow forecasts are a valuable tool for flood mitigation and water management. Creating these forecasts requires that a variety of data types be brought together including model-generated streamflow estimates, sensor-based observations of water discharge, and hydrometeorological forcing factors, such as precipitation, temperature, relative humidity, and snow-water equivalent. The integration of simulated and observed data over disparate spatial and temporal scales creates new avenues for exploring data science techniques for effective water management.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Geophysical inversions (Heagy).&lt;/strong&gt; Geophysical inversions construct models of the subsurface by combining simulations of the governing physics with optimization techniques. These models are critical tools for locating and managing natural resources, such as groundwater, or for assessing the risk from natural hazards, such as volcanoes. Today, we need models applicable to increasingly complex scenarios, such as the socially delicate task of developing groundwater management policies in water-limited regions. This will require the development of new techniques for combining multiple geophysical data sets in a joint inversion, as well as the use of statistical and data science methods for including geologic and hydrologic data in the construction of 3D models.&lt;/p&gt;
&lt;p&gt;These scientific problems exhibit, each with its own flavour, similar technical challenges with respect to handling large volumes of data, performing expensive computations, and doing both of these as a part of the interactive, exploratory workflow that is necessary for scientific discovery.&lt;/p&gt;
&lt;h2 id="jupyter-pangeo-empowering-scientists"&gt;Jupyter &amp;amp; Pangeo: empowering scientists&lt;/h2&gt;
&lt;p&gt;Jupyter and Pangeo are both open communities that share the goal of developing tools and practices for interactive scientific workflows; these tools aim to deliver practical value to scientists who, in the course of everyday research, face a combination of big data and large-scale computing needs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Project Jupyter&lt;/strong&gt; creates open-source tools and standards for interactive computing. These span the spectrum from low-level protocols for running code interactively up to &lt;a href="/posts/2018/jupyterlab-is-ready-for-users/"&gt;the web-based JupyterLab interface&lt;/a&gt; that a researcher uses. Jupyter is agnostic of programming language: over &lt;a href="https://github.com/jupyter/jupyter/wiki/Jupyter-kernels"&gt;130 different Jupyter kernels exist&lt;/a&gt;, and they provide support for most programming languages in widespread use today. Jupyter can be run on a laptop, in an HPC center, or in the cloud. Shared-infrastructure deployments (e.g. HPC / cloud) are enabled by JupyterHub, a component in the Jupyter toolbox that supports the deployment and management of Jupyter sessions for multiple users. The development process of tools in the Jupyter ecosystem is community-oriented and includes a diverse set of stakeholders across research, education, and industry. The project has a strong tradition of building tools that are first designed to solve specific problems, and then generalized to other users and applications.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;Pangeo Platform&lt;/strong&gt; is a modular composition of open, community-driven projects, tailored to the scientific needs of a specific scientific domain. In its simplest form, it is based on the following generic components: a browser-based user interface (&lt;a href="https://jupyter.org"&gt;Jupyter&lt;/a&gt;), a data model and analytics toolkit (&lt;a href="http://xarray.pydata.org"&gt;Xarray&lt;/a&gt;), a parallel job distribution system (&lt;a href="https://dask.org/"&gt;Dask&lt;/a&gt;), a resource management system (either &lt;a href="https://kubernetes.dask.org/en/latest/"&gt;Kubernetes&lt;/a&gt; or a job queuing system such as &lt;a href="https://jobqueue.dask.org/"&gt;PBS&lt;/a&gt;), and a storage system (either cloud object store or traditional HPC file system). These are complemented by problem- and domain-specific libraries.&lt;/p&gt;
&lt;p&gt;This modular design allows for individual components to be readily exchanged and the system to be applied in new use cases. &lt;a href="https://medium.com/pangeo/announcing-pangeo-earthcube-award-fefbe54acbec"&gt;Pangeo was created by, and for, geoscientists&lt;/a&gt; faced with large-scale data and computation challenges, but such problems are now common in science. Researchers in a variety of disciplines including neuroscience and astrophysics are working to adapt the Pangeo design pattern for their communities. Beyond the initial Pangeo deployments supported by the NSF EarthCube grant for Pangeo, the platform has been adopted internationally, including by the &lt;a href="https://medium.com/pangeo/whats-so-cool-about-pangeo-974598f4bafc"&gt;UK Met office&lt;/a&gt;. It has also supported new research and education efforts from other federal agencies, such as NASA’s HackWeek focused on the analysis of &lt;a href="https://medium.com/pangeo/icesat-2-hackweek-mix-70-scientists-and-1-pangeo-jupyterhub-for-5-days-and-what-do-you-get-85f5267a4dfa"&gt;ICESat-2 data&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="user-centered-development"&gt;User-Centered Development&lt;/h2&gt;
&lt;p&gt;Pushing the boundaries of any toolset unveils areas for improvement and opportunities for developments that streamline and upgrade the user experience. We aim to take a holistic view of the scientific discovery process, from initial data acquisition through computational analysis to the dissemination of findings. Our development efforts will make technological improvements within the Jupyter and Pangeo ecosystems in order to reduce pain-points along the discovery lifecycle and to advance the infrastructure that serves scientists. Following established patterns in Jupyter’s development, we take a user-first, needs-driven approach and then generalize these ideas to work across related fields. Broadly, there are 4 areas along the research lifecycle where we will invest development efforts, which we discuss next.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Data discovery.&lt;/strong&gt; An early step in the research process is locating and acquiring data of interest. Data catalogs provide a way to expose datasets to the community in a way that is structured. Within the geosciences, there are a number of emerging community standards for data catalogs (e.g. THREDDS, STAC). To streamline access to such data sets, we plan to develop JupyterLab extensions which provide a user-interface that exposes these catalogs to researchers. This work will build upon the &lt;a href="https://github.com/jupyterlab/jupyterlab/issues/5548"&gt;JupyterLab Data Registry,&lt;/a&gt; which will provide a consistent set of standards for how data can be consumed and displayed by extensions in the Jupyter ecosystem, as well as &lt;a href="https://intake.readthedocs.io/en/latest/index.html"&gt;Intake&lt;/a&gt;, a lightweight library for finding, loading, and sharing data which is already serving the Pangeo community. Our communities are already &lt;a href="https://github.com/jupyterlab/jupyterlab-data-explorer/issues/51"&gt;discussing potential avenues for integration&lt;/a&gt; between these tools.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scientific discovery through interactive computing.&lt;/strong&gt; The Jupyter Notebook has been adopted by many scientists because it supports an iterative, exploratory workflow combining code and narrative. Beyond code, text, and images, Jupyter supports the creation of Graphical User Interfaces (GUIs) with minimal programming effort on the part of the scientist. The &lt;a href="https://jupyter.org/widgets"&gt;Jupyter widgets framework&lt;/a&gt; lets scientists create a “Research GUI” that combines scientific code with interactive elements such as sliders, buttons and menus in just a single line of code, while still allowing for extensive customization and more complex interfaces when required. In this project, we will develop custom widgets tailored at the specific scientific needs of each of our driving use cases.&lt;/p&gt;
&lt;p&gt;Beyond their utility in the exploratory phase of research, interactive interfaces, or “dashboards” provide a mechanism for delivering custom scientific displays to collaborators, stakeholders, and students for whom the details of the code may not be pertinent. &lt;a href="/posts/2019/and-voila/"&gt;Voilà&lt;/a&gt; is a project, led by the &lt;a href="http://quantstack.net"&gt;QuantStack&lt;/a&gt; team, that enables dashboards to be generated from Jupyter notebooks. We plan to develop interactive dashboards using Voilà for our geoscience use-cases, contribute generic improvements to the Voilà codebase, and provide a demonstration of how researchers can deploy dashboards to share their research.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Research GUIs to explore Maxwell’s equations in research and education. Photo credit: SEOGI KANG" src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/jupyter-meets-the-earth/images/002-1_djLNdz13Z4kickGSQFCNUQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;&lt;em&gt;Research GUIs to explore Maxwell’s equations in research and education. Photo credit: SEOGI KANG&lt;/em&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Established tools and data visualization.&lt;/strong&gt; Many widely-used tools, particularly for visualization (e.g. Ncview, Paraview), are desktop-based applications and therefore cannot easily be used in cloud or HPC workflows. In some cases, modern, open-source alternatives are available. But often for specialized tasks, modern tools may not yet have functionality equivalent to the desktop version. JupyterHub can readily serve non-Jupyter web-native software applications such as RStudio, Shiny applications, and Stencila to users; under this project we aim to extend JupyterHub to also be able to serve desktop-native applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Using and managing shared computational infrastructure.&lt;/strong&gt; JupyterHub makes it possible to manage computing resources, user accounts, and provide access to computational environments online. Currently, JupyterHubs in the Pangeo project are deployed and maintained using the &lt;a href="http://z2jh.jupyter.org/en/latest/"&gt;Zero to JupyterHub guide&lt;/a&gt; alongside the &lt;a href="https://hubploy.readthedocs.io/en/latest/"&gt;HubPloy library&lt;/a&gt;. Together, these libraries have simplified the initial setup and automated upgrades to the Hubs. There are still many improvements that can make JupyterHub more suitable for larger, more complex deployments, both in terms of managing users and efficiently allocating resources. Under this project, we plan to build tools which collect metrics such as CPU and memory usage and expose these to both users and administrators so they can make more efficient use of the Hub. For shared deployments, we will improve user management so that user-groups can be used to manage permissions and allocations, and so that usage can be tracked and appropriately billed to the relevant grants. Within the HubPloy library, we also plan to make improvements to streamline continuous deployments so that installation and upgrade processes are repeatable and reliable.&lt;/p&gt;
&lt;h2 id="an-opportunity-for-meaningful-impact-join-us"&gt;An opportunity for meaningful impact — join us!&lt;/h2&gt;
&lt;p&gt;The impacts of climate change and the need for data-driven management of resources are some of the most critical and complex challenges facing society today. In recent years, we have experienced severe droughts in California and are in the midst of water management crises in the Central Valley, while devastating wildfires have destroyed entire communities. Through this partnership between researchers and Jupyter developers, we hope to contribute to the advancement of science-based solutions to these challenges, both by contributing directly to the research and by improving the open ecosystem of tools available to researchers and the stakeholders impacted by these issues.&lt;/p&gt;
&lt;p&gt;If developing open-source tech to advance research in geoscience and beyond excites you, then please &lt;a href="mailto:lheagy@berkeley.edu;fernando.perez@berkeley.edu"&gt;get in touch&lt;/a&gt;! At UC Berkeley, we will be hiring in 2 positions: a dev-ops position focussed on JupyterHub and shared infrastructure deployments, and a JupyterLab-oriented role focussed on extensions, dashboards, and interactivity. There will also be a position opening up at NCAR for a software engineer targeting improvements to improving the user experience of Xarray and Dask workflows.&lt;/p&gt;
&lt;p&gt;Even if you aren’t looking for a new job, there are other ways to get involved with both the Jupyter and Pangeo communities. We welcome new participants to the &lt;a href="https://pangeo.io/meeting-notes.html"&gt;weekly Pangeo meetings&lt;/a&gt; (on Wednesdays alternating between 4p GMT and 8p GMT) and there are &lt;a href="https://discourse.jupyter.org/t/jupyter-community-calls/668"&gt;monthly Jupyter community calls&lt;/a&gt;, which are open and meant to be accessible to a wide audience. Outside of calls, general Jupyter conversations happen on the &lt;a href="https://discourse.jupyter.org"&gt;Jupyter discourse&lt;/a&gt; and Pangeo conversations are typically on the &lt;a href="https://github.com/pangeo-data/pangeo"&gt;Pangeo GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="in-closing-a-step-toward-sustainable-open-science"&gt;In closing: a step toward sustainable open science&lt;/h2&gt;
&lt;p&gt;This project provides our team with $2 Million in funding over 3 years as a part of the NSF &lt;a href="https://earthcube.org/"&gt;EarthCube&lt;/a&gt; program. It also represents the first time federal funding is being allocated for the development of core Jupyter infrastructure.&lt;/p&gt;
&lt;p&gt;The open source ecosystem that Jupyter and Pangeo belong to has become part of the backbone that supports much of today’s computation in science, from astronomy and cosmology to microbiology and subatomic physics. Such broad usage represents a victory for this open and collaborative model of building scientific tools. Much of this success has come through the efforts of scientists and engineers who are committed to an open model of science, but who have had to work with little direct funding, minimal institutional support, and few viable career paths within science.&lt;/p&gt;
&lt;p&gt;There is real strategic risk to continuing with the implicit assumption that scientific open-source tools can be developed and maintained “for free.” If open, community-driven tools are to sustainably grow into the computational backbone of science, we need to recognize this role and support those who create them as regular members of the scientific community (we recently talked about this in more detail in a &lt;a href="http://www.tvworldwide.com/events/nsf/190815"&gt;talk at NSF headquarters&lt;/a&gt;). Projects like ours, where funding and resources are explicitly allocated toward this goal, are a step in the right direction. We hope that our experiences will contribute to ongoing conversations in the scientific community around these complex issues.&lt;/p&gt;
&lt;p&gt;In the past, we have tried to maintain a close relationship between domain problems and software development in Jupyter. However, this has typically been done in an ad-hoc manner, either by “hiding” the software development under the cover of science or by having funding to Jupyter alone. This is the first project where we explicitly partner with a team of domain scientists to simultaneously drive forward domain research and the development of Jupyter infrastructure.&lt;/p&gt;
&lt;p&gt;We are excited about this opportunity and hope to be able to demonstrate that investing in open tools can be a force-multiplier of resources. As always, our work will be done openly, transparently, and with constant community engagement. We look forward to your critiques, ideas, and contributions to make this effort as successful as possible.&lt;/p&gt;
&lt;h2 id="acknowledgments"&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;Thanks to Joe Hamman, Chris Holdgraf, and Doug Oldenburg for constructive feedback and edits on this blog post.&lt;/p&gt;
&lt;p&gt;Many thanks to &lt;a href="https://www.ldeo.columbia.edu/user/rpa"&gt;Ryan Abernathey (Columbia)&lt;/a&gt;, &lt;a href="https://www.usgs.gov/staff-profiles/paul-a-bedrosian?qt-staff_profile_science_products=3#qt-staff_profile_science_products"&gt;Paul Bedrosian (USGS)&lt;/a&gt;, &lt;a href="https://quantstack.net/sylvain.html"&gt;Sylvain Corlay (QuantStack)&lt;/a&gt;, &lt;a href="https://www.usgs.gov/staff-profiles/richard-p-signell?qt-staff_profile_science_products=0#qt-staff_profile_science_products"&gt;Rich Signell (USGS)&lt;/a&gt;, and &lt;a href="https://www.nersc.gov/about/nersc-staff/data-analytics-services/rollin-thomas/"&gt;Rollin Thomas (NERSC)&lt;/a&gt;, who provided us with letters of support for this project; we look forward to working with you all! We are also grateful to &lt;a href="https://www.nsf.gov/staff/staff_bio.jsp?lan=sumishra"&gt;Shree Mishra&lt;/a&gt;, our NSF Program Director on this project, and to Dave Stuart for their support as we move forward with the project. This project is a part of the to the EarthCube program and we look forward to engaging with its working group.&lt;/p&gt;
&lt;p&gt;Finally, the sustained growth of Jupyter to the large-scale project that it has become would not have happened without the generous support of the Alfred P. Sloan, the Gordon and Betty Moore, and the Helmsley Foundations, as well as the leadership of Josh Greenberg and Chris Mentzel respectively at Sloan and Moore.&lt;/p&gt;
&lt;p&gt;This work is supported by the NSF EarthCube program under awards 1928406, 1928374&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Affiliations&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;[1] UC Berkeley, Statistics Department&lt;/p&gt;
&lt;p&gt;[2] UC Berkeley, Berkeley Institute for Data Science&lt;/p&gt;
&lt;p&gt;[3] Lawrence Berkeley National Lab, Computational Research Division&lt;/p&gt;
&lt;p&gt;[4] National Center for Atmospheric Research, Climate and Global Dynamics Laboratory&lt;/p&gt;
&lt;p&gt;[5] UC Berkeley, Department of Geography&lt;/p&gt;
&lt;p&gt;[6] National Center for Atmospheric Research, Computational Information Systems Laboratory&lt;/p&gt;
&lt;p&gt;[7] UC Berkeley, Division of Data Sciences&lt;/p&gt;
</content><category term="geoscience"/><category term="open science"/><category term="science"/></entry><entry><title>Interpreted C++ for GIS with Jupyter</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2018/interpreted-c-for-gis-with-jupyter/" rel="alternate"/><published>2018-04-24T08:35:00+00:00</published><updated>2019-09-30T07:04:00+00:00</updated><author><name>Martin Renou</name></author><id>tag:jasongrout.github.io,2018-04-24:/medium-archive/pelican/posts/2018/interpreted-c-for-gis-with-jupyter/</id><summary type="html">&lt;p&gt;The recent release of the Jupyter kernel for C++, based on the Cling interpreter enabled a number of new workflows for the users of the C++…&lt;/p&gt;
</summary><content type="html">&lt;figure&gt;
&lt;img alt="A live interactive map in a C++ Jupyter notebook" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/interpreted-c-for-gis-with-jupyter/images/001-1_FzUw4j635uJgWHZzc8_QiQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A live interactive map in a C++ Jupyter notebook&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;a href="/posts/2017/interactive-workflows-for-c-with-jupyter/"&gt;recent release&lt;/a&gt; of the Jupyter kernel for C++, based on the Cling interpreter enabled a number of new workflows for the users of the C++ programming language.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/interpreted-c-for-gis-with-jupyter/images/002-1_vrE1i_8405140XOHfx77LA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Features of the &lt;a href="https://github.com/QuantStack/xeus-cling"&gt;xeus-cling&lt;/a&gt; C++ kernel for Project Jupyter include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Showing quick-help pages for functions and classes of the STL and user-defined types, by prefixing them with a question mark:&lt;/em&gt;&lt;br&gt;
For example, typing &lt;code&gt;?std::vector&lt;/code&gt; results in a pager displaying the page from &lt;a href="http://en.cppreference.com/w/"&gt;cppreference&lt;/a&gt; on &lt;code&gt;std::vector&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="Quick-help page for classes and functions of the STL" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/interpreted-c-for-gis-with-jupyter/images/003-1_B77yBeBtyeIs3CqA2jlxKg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Quick-help page for classes and functions of the STL&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Making use of the rich display features of the Jupyter stack, for user-defined types.&lt;/em&gt;&lt;br&gt;
This can be enabled simply by overloading &lt;code&gt;mime_bundle_repr&lt;/code&gt; in the namespace of the class for which we wish to have a rich representation in the front-end. The overload is picked up by the display system through argument-dependent lookup (ADL).&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="Using Jupyter’s rich display mechanism in C++" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/interpreted-c-for-gis-with-jupyter/images/004-1_GZkL0WWGqeuBDrs-INUkgg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Using Jupyter’s rich display mechanism in C++&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Another aspect of the newly released C++ kernel is the implementation of the Jupyter widgets protocol, enabling bi-directional communication between the front-end and the kernel.&lt;/em&gt;The &lt;a href="https://github.com/QuantStack/xwidgets/"&gt;xwidgets&lt;/a&gt; package, built upon xeus provides a complete implementation of the protocol, together with the implementation of most of the controls available in the reference &lt;a href="https://github.com/jupyter-widgets/ipywidgets"&gt;ipywidgets&lt;/a&gt; Python package.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="Bidirectional communication with the front-end using Jupyter interactive widgets" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/interpreted-c-for-gis-with-jupyter/images/005-1_GDwfwdQyqprIcHbXCCkDhA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Bidirectional communication with the front-end using Jupyter interactive widgets&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;More than a limited set of base controls, Jupyter widgets are a framework upon which one can build arbitrarily complex interactions. A large number of interactive widget libraries has been built upon ipywidgets. Popular examples include &lt;a href="https://github.com/jupyter-widgets/pythreejs"&gt;pythreejs&lt;/a&gt; (a Jupyter-threejs bridge), &lt;a href="https://github.com/bloomberg/bqplot"&gt;bqplot&lt;/a&gt; (an interactive plotting library for Jupyter), and &lt;a href="https://github.com/jupyter-widgets/ipyleaflet"&gt;ipyleaflet&lt;/a&gt; (a Jupyter-leafletjs bridge) allowing rich interactive maps in the Jupyter notebook.&lt;/p&gt;
&lt;p&gt;A common trait of most of these packages is that most of the logic is implemented in the front-end, while the back-end only involves synchronization of data attributes.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A fully-specified communication protocol and a thin back-end architecture facilitate the job of kernel authors willing to bring the power of these visualization libraries to their language of choice.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hence, we have taken on the endeavor of providing a C++ implementation of the most popular Jupyter interactive widget libraries. These packages can be used in the C++ kernel, as well as in compiled application making use of the Jupyter kernel protocol.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/interpreted-c-for-gis-with-jupyter/images/006-1_U88dDupn4NP1MVVvE30Twg.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Today, we are proud to announce the first release of &lt;code&gt;xleaflet&lt;/code&gt;, the C++ counterpart to the popular &lt;code&gt;ipyleaflet&lt;/code&gt; package, and which makes use of the same front-end component.&lt;/p&gt;
&lt;p&gt;You can get started by simply creating a map inline in the Jupyter notebook.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Specifying a center location and zoom level&lt;/li&gt;
&lt;li&gt;Specifying the tile layers to be displayed among the predefined base maps&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="A simple map with a specified center and zoom level, displaying the default tiles" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/interpreted-c-for-gis-with-jupyter/images/007-1_BcnHhEfFYFPgBdQ6eyeKrA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A simple map with a specified center and zoom level, displaying the default tiles&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;A number of other attributes can be set in the map widget. To mimic named parameters, all widgets of &lt;code&gt;xwidgets&lt;/code&gt; and &lt;code&gt;xleaflet&lt;/code&gt; are provided with a generator class which can be used to initialize attributes using method-chaining syntax.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Making use of the generator class to specify any number of attributes of the map upon construction" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/interpreted-c-for-gis-with-jupyter/images/001-1_FzUw4j635uJgWHZzc8_QiQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Making use of the generator class to specify any number of attributes of the map upon construction&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In addition to the base map feature, a broad number of features of the leaflet JavaScript library are exposed to the C++ backend directly. This includes markers, marker clusters, image overlays, a variety of controls.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Using the marker widget" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/interpreted-c-for-gis-with-jupyter/images/008-1_BA8-dMRaOf4ikrYqBLnIjA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Using the marker widget&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Whenever an attribute of a widget is modified in the front-end or in the back-end, the other side will properly reflect the data change.&lt;/p&gt;
&lt;p&gt;For example, setting &lt;code&gt;marker.location&lt;/code&gt; to a new value in the previous example will actually move the marker on the map. Reversely, if the &lt;code&gt;draggable&lt;/code&gt; attribute was set to &lt;code&gt;true&lt;/code&gt;, whenever the marker position changes in the front-end, the value is reflected in the C++ model.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Observer on the marker position" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/interpreted-c-for-gis-with-jupyter/images/009-1_Acd0sgShjoe40M-Ust-aKQ.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Observer on the marker position&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Another example is the support of the GeoJSON format, which allows one to load a JSON file locally and display its content on the map.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Support for the GeoJSON format" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/interpreted-c-for-gis-with-jupyter/images/010-1_ok5lH9V9NUwxMy-I5sey8A.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Support for the GeoJSON format&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;The bidirectional communication between the front-end and the C++ back-end makes it easier for the end user to create interactive web applications without having to write any JavaScript.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Using the rich features of xleaflet, one can start building fully-fledged GIS application in C++.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/interpreted-c-for-gis-with-jupyter/images/011-1_E2blHOSA9Gah1DZe1t8tKA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;If you are interested in trying xleaflet right now in your web browser, we provided a &lt;a href="https://mybinder.org/"&gt;binder&lt;/a&gt; for you.&lt;/p&gt;
&lt;p&gt;Simply click on the following binder link and start playing with interactive GIS in C++ in your web browser:&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://mybinder.org/v2/gh/QuantStack/xleaflet/0.2.0?filepath=notebooks"&gt;&lt;img alt="Click on the image to launch the live demo." src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/interpreted-c-for-gis-with-jupyter/images/012-1_DodrT-K2jBSmbAbEhmfbEg.webp" loading="lazy" data-body-image=""&gt;&lt;/a&gt;
&lt;figcaption&gt;Click on the image to launch the live demo.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Check out the &lt;a href="http://xleaflet.readthedocs.io"&gt;documentation&lt;/a&gt; for more detailed information about xleaflet.&lt;/p&gt;
&lt;h3 id="aknowledgements"&gt;Aknowledgements&lt;/h3&gt;
&lt;p&gt;The software presented in this post was built upon the work of a large number of people including the &lt;strong&gt;Jupyter&lt;/strong&gt; team, the &lt;strong&gt;Cling&lt;/strong&gt; developers, the developers of &lt;strong&gt;xeus&lt;/strong&gt; and &lt;strong&gt;xwidgets&lt;/strong&gt;, and the developers of &lt;a href="http://leafletjs.com/"&gt;&lt;strong&gt;leafletjs&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We are especially grateful to &lt;a href="https://twitter.com/SylvainCorlay"&gt;Sylvain Corlay&lt;/a&gt;, &lt;a href="https://twitter.com/lgouarin"&gt;Loic Gouarin&lt;/a&gt;, &lt;a href="https://twitter.com/JohanMabille"&gt;Johan Mabille&lt;/a&gt;, and &lt;a href="https://github.com/wolfv"&gt;Wolf Vollprecht&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The development of xeus, xwidgets and related packages at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; is sponsored by &lt;a href="http://www.techatbloomberg.com"&gt;&lt;strong&gt;Bloomberg&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="about-the-author"&gt;About the Author&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/martinRenou"&gt;Martin Renou&lt;/a&gt; is a Scientific Software developer at &lt;a href="https://github.com/QuantStack/"&gt;QuantStack&lt;/a&gt;. Prior to joining QuantStack, Martin studied at the &lt;a href="https://www.isae-supaero.fr/en"&gt;French Institute of Aeronautics and Space&lt;/a&gt;. As an open source developer, he worked on a variety of projects, notably &lt;a href="https://demo.logilab.fr/SciviJS/"&gt;SciviJS&lt;/a&gt;, a JavaScript library for 3-D mesh visualization.&lt;/p&gt;
</content><category term="C++"/><category term="geoscience"/><category term="science"/></entry></feed>