<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - science</title><link href="https://jasongrout.github.io/medium-archive/pelican/" rel="alternate"/><link href="https://jasongrout.github.io/medium-archive/pelican/feeds/tag-science.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>Exploring Petabytes of the Night Sky — Jupyter Notebooks at NOIRLab’s Astro Data Lab Science Platform</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/exploring-petabytes-of-the-night-sky-jupyter-notebooks/" rel="alternate"/><published>2026-04-20T18:04:00+00:00</published><updated>2026-04-20T18:04:00+00:00</updated><author><name>Robert Nikutta</name></author><id>tag:jasongrout.github.io,2026-04-20:/medium-archive/pelican/posts/2026/exploring-petabytes-of-the-night-sky-jupyter-notebooks/</id><summary type="html">&lt;p&gt;By Robert Nikutta &amp;amp; Stéphanie Juneau (NSF NOIRLab)&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;By Robert Nikutta &amp;amp; Stéphanie Juneau (NSF NOIRLab)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Imagine querying 420+ billion rows of astronomical catalog data — spanning 30 major sky surveys, observed over decades with telescopes on three continents — from a Jupyter notebook in your browser in seconds. No download. No HPC allocation request. No waiting.&lt;/p&gt;
&lt;p&gt;That is what 4,800+ astronomers in over 90 countries can do every day at the &lt;a href="https://datalab.noirlab.edu"&gt;Astro Data Lab&lt;/a&gt; science platform. Data Lab is operated by &lt;a href="https://noirlab.edu"&gt;NSF NOIRLab&lt;/a&gt;, the National Optical-Infrared Astronomy Research Laboratory, headquartered in Tucson, Arizona, with observatories in Arizona, Hawai’i, and Chile. Since its public launch in June 2017, Astro Data Lab has quietly become one of the largest deployments of Jupyter notebooks in professional science — and a case study in what happens when you bring the compute to the data instead of the other way around.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="World map of 2024 number of data queries at Astro Data Lab by country (log-scale color): 64.2 million queries from 72 countries that year." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/exploring-petabytes-of-the-night-sky-jupyter-notebooks/images/001-1_bllZBblDcMeLN2fxIS9PsA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;World map of 2024 number of data queries at Astro Data Lab by country (log-scale color): 64.2 million queries from 72 countries that year.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="the-data-problem-astronomy-had-to-solve"&gt;The Data Problem Astronomy Had to Solve&lt;/h2&gt;
&lt;p&gt;Modern sky surveys are data machines. The &lt;a href="https://www.darkenergysurvey.org/"&gt;Dark Energy Survey&lt;/a&gt; cataloged 690 million objects. &lt;a href="https://www.esa.int/Science_Exploration/Space_Science/Gaia_overview"&gt;Gaia&lt;/a&gt; measured positions and motions for 1.8 billion stars. The &lt;a href="https://www.legacysurvey.org"&gt;DESI Legacy Surveys&lt;/a&gt; cover 20,000 square degrees, nearly half of the full sky, in three optical bands. And the upcoming Rubin Observatory’s &lt;a href="https://rubinobservatory.org/explore/how-rubin-works/lsst"&gt;Legacy Survey of Space and Time&lt;/a&gt; (LSST) will generate roughly 10 million transient alerts &lt;em&gt;per night&lt;/em&gt; starting later this year.&lt;/p&gt;
&lt;p&gt;Traditional astronomy workflows begin with downloading relevant data to a local computer and to use locally installed specialized software tools to process and analyze the data. However, downloading these catalogs to a local machine is now often physically impossible. A single survey’s measurements table can exceed the combined disk space of an entire research group. And even if you could download it, the computing resources needed to query it efficiently at scale requires infrastructure most astronomers don’t have.&lt;/p&gt;
&lt;p&gt;The answer the community converged on, like many industries dealing with big data: bring the compute to the data. Host the catalogs in databases, co-locate a computing environment next door, and give scientists a familiar interface to work in. That interface, increasingly, is a Jupyter notebook.&lt;/p&gt;
&lt;h2 id="astro-data-lab-jupyter-at-the-observatory"&gt;Astro Data Lab: Jupyter at the Observatory&lt;/h2&gt;
&lt;p&gt;Astro Data Lab was conceived in 2014 and went public in June 2017, originally built to support data releases from the Dark Energy Survey — a few terabytes of catalogs and tens of terabytes of images. We imagined a ceiling of roughly 500 users. We were wrong, in the best way.&lt;/p&gt;
&lt;p&gt;Today the platform hosts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;About 420 billion catalog rows&lt;/strong&gt; across 30+ major astronomical surveys (DES, Legacy Surveys, DESI, NOIRLab Source Catalog, SDSS, Gaia, unWISE, SMASH, S-PLUS, VHS, 2MASS, and dozens more)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;31 million spectra&lt;/strong&gt; via SPARCL, our spectral access service (DESI DR1+EDR, SDSS/BOSS DR17)&lt;/li&gt;
&lt;li&gt;Petabytes of images, accessible through a &lt;a href="https://www.ivoa.net/documents/SIA/"&gt;Simple Image Access&lt;/a&gt; service and cutout API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Over 4,800 registered users&lt;/strong&gt; from over 90 countries, who submit tens of millions of data queries each year&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every registered user gets a persistent JupyterHub environment with the full astronomy Python stack pre-loaded — Astropy, NumPy, SciPy, Matplotlib, Pandas, Scikit-learn — and our own astro-datalab client library. The library provides core services, for instance auth and DB queries:&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;dl&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;authClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queryClient&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;getpass&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;getpass&lt;/span&gt;

&lt;span class="c1"&gt;# Log in&lt;/span&gt;
&lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;authClient&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;username: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;getpass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;password: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Query 10 objects from the NOIRLab Source Catalog near a sky position&lt;/span&gt;
&lt;span class="c1"&gt;# Right Ascension (RA) = 150.12 degrees&lt;/span&gt;
&lt;span class="c1"&gt;# Declination (Dec) = 2.21 degrees&lt;/span&gt;
&lt;span class="c1"&gt;# Search radius = 0.05 degrees&lt;/span&gt;
&lt;span class="c1"&gt;# q3c (Quad Tree Cube) is a spatial indexing scheme for Postgres&lt;/span&gt;
&lt;span class="c1"&gt;# gmag and rmag are the g-band and r-band magnitudes of objects&lt;/span&gt;
&lt;span class="c1"&gt;# in the NOIRLab Source Catalog Data Release 2, ‘object’ table.&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;queryClient&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;SELECT ra, dec, gmag, rmag FROM nsc_dr2.object&lt;/span&gt;
&lt;span class="sd"&gt;       WHERE q3c_radial_query(ra, dec, 150.12, 2.21, 0.05) LIMIT 10&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pandas&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;It’s as simple as that. The query runs on the database server next to the data; only the result set crosses the network.&lt;/p&gt;
&lt;h2 id="use-case-1-seeing-the-sky-inside-a-notebook-with-aladinlite"&gt;Use Case 1 — Seeing the Sky Inside a Notebook with AladinLite&lt;/h2&gt;
&lt;p&gt;One of the most immediate joys of working with astronomical data is visualization: not just numbers in a table, but &lt;em&gt;where things are in the sky&lt;/em&gt;, what the images look like, and how your query results relate to the underlying survey footprint.&lt;/p&gt;
&lt;p&gt;We’ve integrated &lt;a href="https://aladin.cds.unistra.fr/AladinLite/"&gt;AladinLite v3&lt;/a&gt; — the interactive sky atlas from Centre de Données Astronomiques de Strasbourg (CDS) — directly into the notebook environment via the &lt;a href="https://github.com/cds-astro/ipyaladin"&gt;ipyaladin&lt;/a&gt; widget. With a handful of lines, astronomers can embed a fully interactive sky viewer in a notebook cell or next to their notebook in a “sidecar”, and overlay their own data on top of real survey imagery:&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;time&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;astropy&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;units&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;u&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;astropy.table&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;Table&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;astropy.coordinates&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;SkyCoord&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;ipyaladin&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;Aladin&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;sidecar&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;Sidecar&lt;/span&gt;

&lt;span class="c1"&gt;# Instantiate the Aladin interactive sky viewer &lt;/span&gt;
&lt;span class="n"&gt;aladin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Aladin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;full_screen&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;Sidecar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;aladin_output&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;split-right&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;aladin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# globular cluster NGC 1851 (RA, Dec)&lt;/span&gt;
&lt;span class="n"&gt;aladin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SkyCoord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;78.52809&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;40.04656&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;aladin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;coo_frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;ICRSd&amp;quot;&lt;/span&gt;  &lt;span class="c1"&gt;# set coordinate frame to ICRS, angles in deg&lt;/span&gt;
&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&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="c1"&gt;# race condition&lt;/span&gt;
&lt;span class="n"&gt;aladin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fov&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;  &lt;span class="c1"&gt;# set field of view to 0.4 degrees&lt;/span&gt;

&lt;span class="c1"&gt;# Overlay catalog query results as circle markers&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Table&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_pandas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# e.g., from a previous query around NGC 1851&lt;/span&gt;
&lt;span class="n"&gt;aladin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;circle&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;source_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;green&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The result is a pannable, zoomable sky viewer — right in the notebook — with your query results overlaid as green circles on the actual sky image of a globular cluster (see figure below). Users can overlay MOCs (Multi-Order Coverage maps, which encode survey footprints), user-generated catalogs from a prior query, or any Virtual Observatory-standard data source.&lt;/p&gt;
&lt;p&gt;This capability turns what was once a static plot into an exploratory tool: zoom into a cluster, click on a source, cross-match on the fly. For students and scientists unfamiliar with a dataset, it is often the fastest path from “I have a list of objects” to “I understand where they are and what I’m looking at.”&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/astro-datalab/notebooks-latest/blob/master/04_HowTos/Aladin/ipyaladin_MOC.ipynb"&gt;AladinLite integration is now active in our notebook library&lt;/a&gt;, with full deployment into the new Data Lab Web Portal on the roadmap for later this year.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="AladinLite v3 sky viewer inside a Jupyter notebook, showing a globular cluster with catalog query results in the outskirts of the cluster overlaid as green circles." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/exploring-petabytes-of-the-night-sky-jupyter-notebooks/images/002-1_3kJd4UCGCp0IpTrcL7fxqA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;&lt;a href="https://github.com/astro-datalab/notebooks-latest/blob/master/04_HowTos/Aladin/ipyaladin_globular_cluster.ipynb"&gt;&lt;em&gt;AladinLite v3 sky viewer inside a Jupyter notebook&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, showing a globular cluster with catalog query results in the outskirts of the cluster overlaid as green circles.&lt;/em&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="use-case-2-stacking-galaxy-spectra-with-sparcl"&gt;Use Case 2 — Stacking Galaxy Spectra with SPARCL&lt;/h2&gt;
&lt;p&gt;Spectroscopy — measuring how much light a star or a galaxy emits at each wavelength — is one of astronomy’s most powerful tools. But individual spectra are often noisy. The signal-to-noise ratio of a single optical spectrum for a faint galaxy can be too low to measure the emission lines that encode star formation rate, gas chemical content (Oxygen, Nitrogen, etc.) or the even more subtle absorption lines that create small wiggles in the shape of the spectrum, yet encapsulate crucial information such as the mass and age of the stars making up a galaxy.&lt;/p&gt;
&lt;p&gt;One trick that astronomers have used for decades: combining or “stacking” spectra. Average hundreds of spectra together, and the noise level reduces while the signal builds up. What was invisible in a single spectrum becomes unmistakable in the stack. While the concept is simple, reading and manipulating large numbers of spectra can be time consuming or cumbersome.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://astrosparcl.datalab.noirlab.edu"&gt;SPARCL&lt;/a&gt; (SPectra Analysis and Retrievable Catalog Lab) makes this possible at scale directly in a notebook. With &lt;code&gt;sparclclient&lt;/code&gt;, users can currently search 31 million spectra by redshift range, target type, and survey, then retrieve flux arrays and wavelength grids ready for stacking:&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;sparcl.client&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;SparclClient&lt;/span&gt;

&lt;span class="c1"&gt;# Instantiate the SPARCL client (connected to production server)&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SparclClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Find SDSS spectra of galaxies in a redshift slice 0.1&amp;lt;z&amp;lt;0.3&lt;/span&gt;
&lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;outfields&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;sparcl_id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ra&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dec&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;redshift&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;spectype&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;constraints&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;spectype&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;GALAXY&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                 &lt;span class="s1"&gt;&amp;#39;redshift&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                 &lt;span class="s1"&gt;&amp;#39;data_release&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;SDSS-DR17&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Retrieve flux, wavelength, and inverse-variance arrays&lt;/span&gt;
&lt;span class="n"&gt;retrieved&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;include&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;flux&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;wavelength&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ivar&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In our &lt;a href="https://github.com/astro-datalab/notebooks-latest/blob/master/03_ScienceExamples/SpectralStacking/SpectralStacking_SDSS.ipynb"&gt;SpectralStacking_SDSS&lt;/a&gt; science example notebook, users first stack a small number of galaxy spectra (N=5) in eight bins of astrophysical color &lt;em&gt;g&lt;/em&gt;−&lt;em&gt;r&lt;/em&gt; (green and red filters), revealing trends from blue spectra with emission lines to red spectra with absorption lines but with noisy spectra. Then users stack hundreds of galaxy spectra for the same bins of color &lt;em&gt;g&lt;/em&gt;−&lt;em&gt;r&lt;/em&gt; and obtain much cleaner spectra where the small wiggles are now real astrophysical features and no longer buried in the noise.&lt;/p&gt;
&lt;p&gt;The spectral rainbows below — N=5 then N=200 stacked galaxy spectra color-coded in bins of astrophysical color &lt;em&gt;g&lt;/em&gt;−&lt;em&gt;r&lt;/em&gt; — are each a single output cell from this notebook, generated entirely within the Data Lab environment.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="SPARCL spectral rainbows: top panel shows N=5 galaxy spectra stacked and color-coded by g−r color, spanning wavelengths 3750–6450 Ångstrom. Bottom panel shows the same exercise but with N=200 galaxy spectra per bin, greatly enhancing the signal-to-noise ratio." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/exploring-petabytes-of-the-night-sky-jupyter-notebooks/images/003-1_NZpW8VO92rpjjqyR47BywQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;SPARCL spectral rainbows: top panel shows N=5 galaxy spectra stacked and color-coded by g−r color, spanning wavelengths 3750–6450 Ångstrom. Bottom panel shows the same exercise but with N=200 galaxy spectra per bin, greatly enhancing the signal-to-noise ratio.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="use-case-3-variable-stars-and-the-coming-flood-of-time-domain-data"&gt;Use Case 3 — Variable Stars and the Coming Flood of Time-Domain Data&lt;/h2&gt;
&lt;p&gt;Not all astronomical data is a static snapshot of the sky. Many of the most scientifically rich phenomena — pulsating stars, transiting exoplanets, exploding supernovae, gravitational lensing events — reveal themselves through &lt;em&gt;change&lt;/em&gt; over time.&lt;/p&gt;
&lt;p&gt;Among the most useful calibration tools in astrophysics are RR Lyrae stars: old, low-mass stars that pulsate with periods of 0.2–1 day and a brightness variation that traces their distance. Finding and characterizing them across millions of square degrees of sky requires querying multi-epoch photometry catalogs, computing period statistics, and folding light curves — all tasks that fit naturally in a notebook workflow.&lt;/p&gt;
&lt;p&gt;Our &lt;a href="https://github.com/astro-datalab/notebooks-latest/blob/master/03_ScienceExamples/TimeSeriesAnalysisRrLyraeStar/TimeSeriesAnalysisOfRrLyraeStar.ipynb"&gt;TimeSeriesAnalysisRrLyraeStar&lt;/a&gt; notebook demonstrates the full pipeline: query the SMASH DR2 catalog for stars with high photometric variability, run a Lomb-Scargle periodogram on the light curve, identify the dominant period, and phase-fold the observations to reveal the characteristic sawtooth pulsation profile:&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;astropy.timeseries&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;LombScargle&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;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;ls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LombScargle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# time and magnitude from a previous query&lt;/span&gt;
&lt;span class="n"&gt;frequency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;power&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;autopower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;period&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frequency&lt;/span&gt; &lt;span class="c1"&gt;# period is the inverse of frequency&lt;/span&gt;
&lt;span class="n"&gt;best_period&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;power&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;phase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;best_period&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="c1"&gt;# folded timeseries = light curve&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The resulting phase-folded light curve shown in the figure below is clean, precise, and immediately recognizable to any variable-star astronomer — produced entirely from archival survey data without a single new observation.&lt;/p&gt;
&lt;p&gt;This kind of workflow is also a proving ground for the upcoming &lt;a href="https://rubinobservatory.org/"&gt;Vera C. Rubin Observatory&lt;/a&gt;’s &lt;a href="https://rubinobservatory.org/explore/how-rubin-works/lsst"&gt;Legacy Survey of Space and Time&lt;/a&gt; (LSST). When Rubin begins operations and delivers 10 million nightly alerts, the only workflows that will scale are ones already designed to run against large databases or specialized file systems, in shared computing environments, with notebook-native tooling. Astro Data Lab users are building those workflows today.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Phase-folded RR Lyrae light curve from the TimeSeriesAnalysisRrLyraeStar notebook, showing characteristic sawtooth pulsation with a 0.65 day period." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/exploring-petabytes-of-the-night-sky-jupyter-notebooks/images/004-1_JDuoMo_2SgPJ-b_md9nslg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Phase-folded RR Lyrae light curve from the TimeSeriesAnalysisRrLyraeStar notebook, showing characteristic sawtooth pulsation with a 0.65 day period.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="the-notebook-ecosystem"&gt;The Notebook Ecosystem&lt;/h2&gt;
&lt;p&gt;The three use cases above are drawn from our library of &lt;strong&gt;80+ open-source Jupyter notebooks&lt;/strong&gt; at &lt;a href="https://github.com/astro-datalab/notebooks-latest"&gt;github.com/astro-datalab/notebooks-latest&lt;/a&gt;. The library is organized into six sections:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Directory                      Contents
---------------------------------------------------------------------------
01_GettingStartedWithDataLab/  Authentication, dataset discovery, first
                               queries

02_DataAccessOverview/         More advanced queries, image searches, etc.

03_ScienceExamples/            Many complete science cases (stellar
                               streams, dwarf galaxies, large-scale
                               structure, SED fitting, ...)

04_HowTos/                     Service-specific tutorials (SPARCL, SIA
                               image cutouts, cross-matching, file storage)

05_Contrib/                    Community-contributed notebooks (ANTARES
                               alert broker, user science cases, etc.)

06_EPO/                        Education &amp;amp; public outreach (Teen Astronomy
                               Cafe, La Serena School for Data Science)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;All notebooks are open-source and community contributions are welcome via pull request. We use them as living teaching materials in workshops at Astronomical Data Analysis Software &amp;amp; Systems (ADASS) and American Astronomical Society (AAS) conferences, summer schools, and university courses around the world. We have also recently translated most of our notebooks to the &lt;a href="https://github.com/astro-datalab/notebooks-latest-es"&gt;Spanish language&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the coming months we will launch a &lt;strong&gt;tagged, searchable notebook gallery&lt;/strong&gt; — filterable by science topic, &lt;a href="https://astrothesaurus.org/"&gt;Unified Astronomy Thesaurus&lt;/a&gt; (UAT) keywords, target audience, and difficulty level. The pilot framework was developed by two summer students working with the team.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Footprints of 24 sky survey datasets hosted at Astro Data Lab. This montage shows the wide variety of astronomical surveys, with some that cover the full sky, others focusing on the Milky Way (central plane), and yet others studying the extragalactic regions beyond the Milky Way. We ensure that each survey is represented in at least one of our example notebooks." src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/exploring-petabytes-of-the-night-sky-jupyter-notebooks/images/005-1_SvI9n6mkoQ5th35aClATWQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Footprints of 24 sky survey datasets hosted at Astro Data Lab. This montage shows the wide variety of astronomical surveys, with some that cover the full sky, others focusing on the Milky Way (central plane), and yet others studying the extragalactic regions beyond the Milky Way. We ensure that each survey is represented in at least one of our &lt;a href="https://github.com/astro-datalab/notebooks-latest/"&gt;&lt;em&gt;example notebooks&lt;/em&gt;&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="looking-ahead"&gt;Looking Ahead&lt;/h2&gt;
&lt;p&gt;Nine years in, the Astro Data Lab science platform is evolving on several fronts simultaneously.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GPU computing.&lt;/strong&gt; We are deploying a GPU node, which will be connected to the Jupyter notebook service. This opens deep learning and large-scale ML workflows in the same notebook environment where the data lives.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;An AI assistant.&lt;/strong&gt; Our first-ever user survey, conducted in September 2025, ranked an in-notebook AI assistant as one of the top requested features. We are actively exploring what responsible, science-aware AI assistance looks like in this context — helping users construct SQL/ADQL queries, navigate datasets, and debug notebook code, without hallucinating catalog column names. jupyter-ai might come in very handy here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New integrated Web Portal.&lt;/strong&gt; Our Data Explorer — an integrated web interface combining catalog browsing, query execution, image cutouts, spectral search, and job status monitoring — was rolled out last year. Some of the next milestones include integration of AladinLite into the portal, bringing the sky-visualization capability described above out of the notebook and into the browser-native interface, and a new integrated positional cross-matching service.&lt;/p&gt;
&lt;h2 id="try-it"&gt;Try It&lt;/h2&gt;
&lt;p&gt;The full notebook library is open-source: &lt;a href="https://github.com/astro-datalab/notebooks-latest/"&gt;github.com/astro-datalab/notebooks-latest&lt;/a&gt;. Community notebook contributions are welcome — see &lt;a href="https://github.com/astro-datalab/notebooks-latest/CONTRIBUTING.md"&gt;CONTRIBUTING.md&lt;/a&gt; in the repository. You can also run all notebooks locally, after installing the Data Lab command-line client and Python module: &lt;code&gt;pip install astro-datalab&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Astro Data Lab also offers a JupyterLab environment as a service to the broad astronomy community — students, researchers, educators, and citizen scientists. &lt;a href="https://datalab.noirlab.edu/account/register/"&gt;Registration&lt;/a&gt; takes just a moment at &lt;a href="https://datalab.noirlab.edu"&gt;datalab.noirlab.edu&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Questions and feedback: &lt;a href="mailto:datalab@noirlab.edu"&gt;datalab@noirlab.edu&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;a href="mailto:robert.nikutta@noirlab.edu"&gt;&lt;em&gt;Robert Nikutta&lt;/em&gt;&lt;/a&gt; &lt;em&gt;is a scientist at NSF NOIRLab’s Community Science and Data Center, and lead of the Astro Data Lab science platform.&lt;/em&gt; &lt;a href="mailto:stephanie.juneau@noirlab.edu"&gt;&lt;em&gt;Stéphanie Juneau&lt;/em&gt;&lt;/a&gt; &lt;em&gt;is an associate astronomer at CSDC and lead of the SPARCL spectroscopy initiative. The platform is the work of the full&lt;/em&gt; &lt;a href="https://datalab.noirlab.edu/about/people"&gt;&lt;em&gt;Astro Data Lab team&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, past and present.&lt;/em&gt;&lt;/p&gt;
</content><category term="open science"/><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>Genomic data visualization in Jupyter</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2021/genomic-data-representation-in-jupyter/" rel="alternate"/><published>2021-02-08T13:29:00+00:00</published><updated>2021-02-11T11:36:00+00:00</updated><author><name>Jean-David Harrouet</name></author><id>tag:jasongrout.github.io,2021-02-08:/medium-archive/pelican/posts/2021/genomic-data-representation-in-jupyter/</id><summary type="html">&lt;p&gt;If there is one thing that recent events tell us, it is that genomic is a large source of data, and that its manipulation and…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;If there is one thing that recent events tell us, it is that genomics is a large source of data, and that its manipulation and understanding allow for the quick development of new drugs and… vaccines.&lt;/p&gt;
&lt;p&gt;We decided to build upon the Jupyter ecosystem and enrich its capabilities in this space, with a genomics data visualization widget.&lt;/p&gt;
&lt;p&gt;In doing so, we chose to leverage the &lt;a href="https://github.com/igvteam/igv.js/"&gt;&lt;code&gt;igv.js&lt;/code&gt;&lt;/a&gt; JavaScript library, developped by the &lt;a href="https://igv.org/"&gt;Integrative Genomics Viewer (IGV)&lt;/a&gt; team, and used by &lt;a href="https://igv.org/app/"&gt;the web app of the same name&lt;/a&gt;. This is all done thanks for the power of &lt;code&gt;ipywidgets&lt;/code&gt; , which helps linking the JS genomic representation object to our Jupyter notebook.&lt;/p&gt;
&lt;p&gt;Hence, we are proud to announce the release of &lt;a href="https://github.com/QuantStack/ipyigv"&gt;&lt;code&gt;ipyigv&lt;/code&gt;&lt;/a&gt;, a Jupyter widget to render genomics data, based on &lt;code&gt;igv.js&lt;/code&gt;!&lt;/p&gt;
&lt;h2 id="installing-ipyigv"&gt;Installing ipyigv&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ipyigv&lt;/code&gt; is available on PyPI and conda-forge. It can be installed with both pip and &lt;a href="https://github.com/mamba-org/mamba"&gt;mamba&lt;/a&gt; / &lt;a href="https://github.com/conda/conda"&gt;conda&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mamba install -c conda-forge ipyigv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can find additional installation instruction on the &lt;a href="https://github.com/QuantStack/ipyigv"&gt;project’s page on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="rendering-genomic-data"&gt;Rendering genomic data&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;igv.js&lt;/code&gt; consumes genomic data in two chunks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the genome itself as documented &lt;a href="https://github.com/igvteam/igv.js/wiki/Reference-Genome"&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;specificities of the genome underlined as &lt;code&gt;Tracks&lt;/code&gt;, which are displayed alongside or on top of the genome&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;ipyigv&lt;/code&gt; uses the same logic, with a helper function to use the public genomes available. Data is then displayed in an &lt;code&gt;IgvBrowser&lt;/code&gt; widget, a wrapper for the &lt;code&gt;igv.js&lt;/code&gt; browser.&lt;/p&gt;
&lt;p&gt;To make things easier, there are a few public genomes made directly available via a helper &lt;code&gt;Bunch&lt;/code&gt; , &lt;code&gt;PUBLIC_GENOMES&lt;/code&gt; .&lt;/p&gt;
&lt;p&gt;Here is what it looks like:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Creating a genome browser with data from a public genome" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/genomic-data-representation-in-jupyter/images/001-1_fxJcZt6CBqZodRKm-k9vBA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Creating a genome browser with data from a public genome&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Now that we have created a genome browser, we may add tracks to it. Tracks may be of different sorts, about ten according to &lt;a href="https://github.com/igvteam/igv.js/wiki/Tracks-2.0"&gt;the &lt;code&gt;igv.js&lt;/code&gt; documentation&lt;/a&gt;. Describing all the kinds of tracks is out of the scope of this article, but it should be noted that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a common &lt;code&gt;Track&lt;/code&gt; class is defined with all the common properties. Each track type corresponds to a subclass inheriting &lt;code&gt;Track&lt;/code&gt; .&lt;/li&gt;
&lt;li&gt;in order to ease things out, some class introspection was introduced in order to identify the type of &lt;code&gt;Track&lt;/code&gt; based on the extension of the containing file. As shown below, this allows for instantiating a track by just using the &lt;code&gt;Track&lt;/code&gt; constructor, without knowing the name of the actual subclass being instantiated (e.g. &lt;code&gt;AnnotationTrack&lt;/code&gt; in the example below). Type inference is made through the type of file, or by specifying a &lt;code&gt;type&lt;/code&gt; property.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, let’s add a &lt;code&gt;Track&lt;/code&gt; to our browser, then remove it:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Adding and removing a track to/from our browser" src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/genomic-data-representation-in-jupyter/images/002-1_681fIddZAaQc8w72MmmIiw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Adding and removing a track to/from our browser&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In this first version, two other functions come in as handy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;browser.search('chr3:1-190,100,300')&lt;/code&gt; would position the browser at the requested position in the genome;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;browser.dump_json()&lt;/code&gt; prepares a JSON representing the configuration of the browser. Handy if you would like to reinstantiate another browser with the same configuration without redoing it manually. Use &lt;code&gt;browser.out&lt;/code&gt; to output the JSON content.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We hope you’ll have fun manipulating genome data in Jupyter, and sharing visual knowledge thanks to &lt;code&gt;ipyigv&lt;/code&gt;!&lt;/p&gt;
&lt;h2 id="acknowledgments"&gt;Acknowledgments&lt;/h2&gt;
&lt;p&gt;The development of ipyigv by &lt;a href="https://twitter.com/Harr0uet"&gt;Jean-David Harrouet&lt;/a&gt; at &lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; was funded as part of the &lt;a href="https://twitter.com/PlasmaBio"&gt;PLASMA&lt;/a&gt; project, led by &lt;a href="https://twitter.com/CVandiedonck"&gt;Claire Vandiedonck&lt;/a&gt;, &lt;a href="https://twitter.com/pierrepo"&gt;Pierre Poulain&lt;/a&gt;, and &lt;a href="https://twitter.com/SCaburet"&gt;Sandrine Caburet&lt;/a&gt;, associate professors at Université de Paris.&lt;/p&gt;
&lt;p&gt;Sponsors to the PLASMA initiative include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/iledefrance"&gt;Région Île-de-France&lt;/a&gt;, via the “Trophées franciliens de l’innovation numérique dans le supérieur” (&lt;a href="https://www.iledefrance.fr/trophees-franciliens-de-linnovation-numerique-dans-le-superieur-les-laureats-2018"&gt;EdTech 2018&lt;/a&gt;) grant program,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/Univ_Paris"&gt;Université de Paris&lt;/a&gt;, via the &lt;a href="https://u-paris.fr/en/the-initiative-of-excellence-idex-label/"&gt;Initiative of Excellence (IdEx) Label&lt;/a&gt; and its “inovating teaching” grant program,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/EURGENEPARIS"&gt;EUR G.E.N.E.&lt;/a&gt;, the graduate school on Genetics and Epigenetics,&lt;/li&gt;
&lt;li&gt;the university training “Création, analyse et valorisation de données biologiques omiques” (&lt;a href="https://omics-school.net/"&gt;DU Omiques&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&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/harrouet/"&gt;Jean-David Harrouet&lt;/a&gt; is an innovator helping companies with their digital transformation.&lt;/p&gt;
&lt;p&gt;He believes that the right mix of coding and business acumen is a way to make life better for many people.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2021/genomic-data-representation-in-jupyter/images/003-1_wACAwVx0PZAsEH8myXyUqg.jpeg" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="science"/><category term="visualization"/></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>SlicerJupyter: a 3D Slicer kernel for interactive publications</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2020/slicerjupyter-a-3d-slicer-kernel-for-interactive/" rel="alternate"/><published>2020-07-08T16:29:00+00:00</published><updated>2020-07-08T16:58:00+00:00</updated><author><name>Jean-Christophe Fillion-Robin</name></author><id>tag:jasongrout.github.io,2020-07-08:/medium-archive/pelican/posts/2020/slicerjupyter-a-3d-slicer-kernel-for-interactive/</id><summary type="html">&lt;p&gt;Use Jupyter and 3D Slicer kernel to implement biomedical data processing workflows in a notebook&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The Jupyter ecosystem is a powerful platform for exploratory computational science, and now it can connect with some of the deep and rich domain-specific desktop applications that have decades of feature development already invested in them. With the integration of &lt;a href="https://www.slicer.org/"&gt;3D Slicer&lt;/a&gt; with Jupyter through the &lt;a href="https://github.com/jupyter-xeus/xeus-python"&gt;xeus-python&lt;/a&gt;’s interpreter, we demonstrate how a &lt;a href="https://www.qt.io/"&gt;Qt-based&lt;/a&gt; graphical desktop application with 3D visualization provided by &lt;a href="https://vtk.org/"&gt;Visualization Toolkit (VTK)&lt;/a&gt;, image processing provided by the &lt;a href="https://itk.org/"&gt;Insight Toolkit (ITK)&lt;/a&gt;, can be used through a Jupyter notebook. This approach is available on the &lt;a href="https://github.com/Slicer/SlicerJupyter"&gt;SlicerJupyter&lt;/a&gt; GitHub repository and could be extended to other applications that embed Python, such as Blender, FreeCAD, or ParaView.&lt;/p&gt;
&lt;p&gt;This xeus-python integration is beneficial both for the Jupyter ecosystem and desktop applications. Features that have been developed for decades for desktop applications become readily available for Jupyter users without learning a new working environment or redeveloping features. For a desktop application, the Jupyter notebook can serve as a way to create reproducible data processing workflows, scientific publications, and maintainable tutorials without requiring local software installation. From Jupyter, you can now quickly create simple medical imaging applications with extremely rich interactivity from 3D Slicer. Read below for a discussion of the features available and the history of the project.&lt;/p&gt;
&lt;h2 id="powerful-medical-imaging-capabilities-available-through-jupyter"&gt;Powerful Medical Imaging Capabilities Available Through Jupyter&lt;/h2&gt;
&lt;p&gt;3D Slicer (or Slicer for short) is a C++ desktop application that uses Qt, ITK, and VTK libraries for visualization and medical image analysis. Slicer’s embedded Python interpreter makes all its features accessible with the Python programming language. Slicer has a simple built-in console to run Python commands interactively and can run Python scripts from files, but these are not as convenient as cell-base interactive notebooks, which have become popular among data scientists and researchers in recent years.&lt;/p&gt;
&lt;p&gt;By integrating the xeus-python kernel, we can use a Slicer process as a Jupyter kernel. xeus-python leverages the &lt;a href="https://github.com/jupyter-xeus/xeus"&gt;xeus&lt;/a&gt; C++ implementation of the Jupyter kernel protocol. xeus-python is &lt;a href="/posts/2019/a-new-python-kernel-for-jupyter/"&gt;an alternative to ipykernel&lt;/a&gt;, which can be used with a vanilla CPython interpreter, interfacing to standard CPython Jupyter widgets like &lt;a href="https://github.com/InsightSoftwareConsortium/itkwidgets"&gt;itkwidgets&lt;/a&gt;, but it can also be coupled with custom interpreters and GUI event loops, like the Slicer interpreter and its Qt event loop. This allows you to represent a complete scene in Medical Reality Markup Language, MRML, Slicer’s internal data structure. The kernel exposes the full medical imaging API and representation of your data in a meaningful way for Python developers, allowing access through standard Python ecosystem formats such as pandas dataframes and NumPy arrays in the Notebook.&lt;/p&gt;
&lt;h3 id="interactivity-levels"&gt;Interactivity Levels&lt;/h3&gt;
&lt;p&gt;You can also use Jupyter interactive widgets (sliders, buttons, etc.) to control Slicer, modify data, or adjust processing and visualization parameters. Interactivity can be implemented at different levels.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Level 1&lt;/strong&gt;: Standard Jupyter widgets display application specific objects by automatic conversion of application-specific data objects to standard Python objects. For example, Slicer markup fiducial lists are displayed as a nicely formatted table and model nodes are rendered as 3D objects.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level 2&lt;/strong&gt;: Static image widgets display content that the desktop application renders. These widgets can be made interactive by modifying data and rendering parameters using additional standard widgets. This makes rich visualization capabilities — sophisticated rendering various data types, rendering of very large data sets, etc. directly available in Jupyter.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level 3&lt;/strong&gt;: Dynamic viewer widgets display 2D and 3D views rendered by the desktop application. Mouse and keyboard events are forwarded to the desktop application that allows zooming/rotating views, and to utilize all 3D interactions implemented in the desktop such as placing annotations, making measurements, or segmenting images the same way as if it was done on the desktop appication’s screen. This is implemented in the Slicer Jupyter kernel using &lt;a href="https://ipycanvas.readthedocs.io/en/latest/"&gt;ipycanvas&lt;/a&gt; and &lt;a href="https://github.com/mwcraig/ipyevents"&gt;ipyevents&lt;/a&gt; packages.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Level 4&lt;/strong&gt;: Full desktop graphical user interface integration. Users can see parts of the application window rendered in notebook cells, including standard desktop widgets (sliders, menus, etc.). It is implemented using noVNC and TigerVNC in Slicer Jupyter. This is particularly useful when the application runs on a remote server.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/oZ3_cRXX2QM" title="Medical image processing in your web browser using Jupyter notebooks and 3D Slicer" 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;Video demonstrating how to run 3D Slicer using Binder&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;These interactive tools allow developers to implement complete data processing workflows in a notebook, even if certain steps require manual user inputs such as segmenting 3D regions or setting seed points.&lt;/p&gt;
&lt;h3 id="try-it-online"&gt;Try it online!&lt;/h3&gt;
&lt;p&gt;Since Jupyter notebooks can be used from any web browser, it can essentially turn any desktop application to a web application. By setting up a remote Jupyter server, users do not have to install anything on their computers. We have set up a demonstration of this using Binder (&lt;a href="http://www.mybinder.org"&gt;www.mybinder.org&lt;/a&gt;) that anybody can try at &lt;a href="https://mybinder.org/v2/gh/Slicer/SlicerNotebooks/master"&gt;https://mybinder.org/v2/gh/Slicer/SlicerNotebooks/master&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://mybinder.org/v2/gh/Slicer/SlicerNotebooks/master"&gt;&lt;img alt="Click on the binder image to launch the demo" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/slicerjupyter-a-3d-slicer-kernel-for-interactive/images/001-0_powLrWNrbtb0dRWs.webp" loading="lazy" data-body-image=""&gt;&lt;/a&gt;
&lt;figcaption&gt;Click on the binder image to launch the demo&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The docker image that installs and configures Slicer and all dependencies (ipycanvas, ipyevents, VNC, etc.) is available at &lt;a href="https://github.com/Slicer/SlicerDocker/tree/master/slicer-notebook"&gt;https://github.com/Slicer/SlicerDocker/tree/master/slicer-notebook&lt;/a&gt;. For deployment to non-technical users, applications can be deployed using Voilà (&lt;a href="https://voila.readthedocs.io/"&gt;https://voila.readthedocs.io/&lt;/a&gt;), which only shows relevant content and interactive widgets, so the notebook looks like a simple dynamic web page.&lt;/p&gt;
&lt;p&gt;The current implementation is already stable and offers a wide range of features, but there is still room for design and performance improvements. For example, we could not implement fully automatic conversion of application-specific data objects to displayable Python objects (due to complex implementation of display hooks); xeus-python debugger’s threading model needs to be improved to allow using it without locking the application’s main thread; and dynamic viewer widget’s performance (level 3 interaction) could be optimized to achieve higher refresh rates.&lt;/p&gt;
&lt;h2 id="history-of-slicer-and-this-integration"&gt;History of Slicer and this integration&lt;/h2&gt;
&lt;p&gt;Built over two decades with support from the NIH and a worldwide open source developer community, 3D Slicer is a unique, multi-platform desktop application for analysis, integration, and visualization of medical images that is heavily used by researchers globally for basic and applied research in a wide range of topics. The 3D Slicer Community includes physician-scientists with disease-specific knowledge of clinical challenges, computer scientists and physicists who develop novel algorithms, imaging informatics researchers, software engineers with the ability to understand clinical problems and create reliable tools, and application engineers with the multidisciplinary skills to deploy these tools in a range of cancer research settings. Slicer is maintained by Kitware, Inc., and the NAMIC consortium, and has an active open source software community. Slicer is used in hospitals and by researchers, with more than 10k academic citations and more than 150k downloads in the last year alone.&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://download.slicer.org"&gt;&lt;img alt="Click on the image to download 3D Slicer" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/slicerjupyter-a-3d-slicer-kernel-for-interactive/images/002-1_ePhHKkjqV-AW0mvDkaeurw.webp" loading="lazy" data-body-image=""&gt;&lt;/a&gt;
&lt;figcaption&gt;Click on the image to download 3D Slicer&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;It can be used for image processing workflows on 2D, 3D, and 4D images. What makes Slicer so useful is its huge set of community contributed modules that extend its functionality, as well as its ability to read DICOM and a wide array of exotic file formats.&lt;/p&gt;
&lt;p&gt;Slicer has been scriptable in Python for well over a decade, but a robust &lt;a href="https://github.com/Slicer/SlicerJupyter"&gt;SlicerJupyter&lt;/a&gt; extension is born from significant development effort by the community. The idea for this integration dates back to SciPy in 2014, when Jean-Christophe Fillion-Robin of Kitware organized a sprint intended to integrate Slicer and an IPython notebook, motivated by the dream of creating interactive and fun tutorials for Slicer. Mike Sarahan and Jean-Christophe created this proof of concept &lt;a href="https://github.com/commontk/QEmbedIPython#qt-embed-ipython"&gt;https://github.com/commontk/QEmbedIPython#qt-embed-ipython&lt;/a&gt;, but it was far from usable. In 2015 Matt McCormick of Kitware, created the &lt;a href="https://github.com/Slicer/SlicerDocker"&gt;SlicerDocker&lt;/a&gt; repository to support headless builds and rendering in a Docker image. Then in June 2018, while attending the Slicer Project Week, Andras Lasso (Queen’s University) and Jean-Christophe learned about Xeus, a C++ implementation of the Jupyter kernel protocol developed by QuantStack that would help streamline the integration of Slicer with Jupyter. To support this effort, Andras and Jean-Christophe created the &lt;a href="https://github.com/Slicer/SlicerJupyter"&gt;Slicer/SlicerJupyter&lt;/a&gt; GitHub repository. They also contributed changes to Xeus to support this new integration paradigm where the event loop of the kernel is driven by a Qt-based Desktop application (see &lt;a href="https://github.com/jupyter-xeus/xeus/pull/63"&gt;here&lt;/a&gt;). Building on this foundation, Isaiah Norton, then working at Brigham and Women’s Hospital, contributed additional improvements like a better auto-completion using jedi (see &lt;a href="https://github.com/Slicer/SlicerJupyter/pull/12"&gt;https://github.com/Slicer/SlicerJupyter/pull/12&lt;/a&gt;) as well as integration with Binder. More recently, Jean-Christophe and Sylvain Corlay (QuantStack) met after the Slicer project week while attending SciPy in Austin. Following the creation of a new project called xeus-python (started by Martin Renou at QuantStack), we took the integration of Jupyter and Slicer to the next level by adding support for improved interactive use and MRML data node visualization directly in the notebook.&lt;/p&gt;
&lt;h2 id="about-the-authors"&gt;About the authors&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Alphabetically ordered&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sylvain Corlay&lt;/strong&gt; is the founder and CEO of QuantStack, and a core Jupyter developer. He co-authored xeus and xeus-python.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Sylvain Corlay" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/slicerjupyter-a-3d-slicer-kernel-for-interactive/images/003-1_DKAhOe_Y4JdGYkgi9jHBSQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Sylvain Corlay&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Jean-Christophe Fillion-Robin&lt;/strong&gt; is an open-source enthusiast, original author of the SlicerJupyter extension and a principal engineer at Kitware Inc where he leads the development of “3D Slicer” based commercial applications. J-Christophe also maintains &lt;a href="https://scikit-build.org"&gt;scikit-build&lt;/a&gt;, an improved build system generator for CPython C/C++/Fortran/Cython extensions.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Jean-Christophe Fillion-Robin" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/slicerjupyter-a-3d-slicer-kernel-for-interactive/images/004-1_slg9clPxU3DhL4W2pE2kCA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Jean-Christophe Fillion-Robin&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Mike Grauer&lt;/strong&gt; is a Technical Leader on the data and analytics team at Kitware. He is specialized in building scalable server-side processing frameworks that enable scientific workflows over web platforms.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Mike Grauer" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/slicerjupyter-a-3d-slicer-kernel-for-interactive/images/005-1_SuBw-BD8efPla8tfd98RUg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Mike Grauer&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Andras Lasso&lt;/strong&gt; is an original author of the SlicerJupyter extension, Senior Research Engineer and Associate Director of the Laboratory for Percutaneous Surgery at Queen’s University.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Andras Lasso" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/slicerjupyter-a-3d-slicer-kernel-for-interactive/images/006-1_kINpFRIt94iHaxTA90zncQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Andras Lasso&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Matt McCormick&lt;/strong&gt; is an open source, medical imaging researcher working at Kitware Inc. Matt is an active, contributing member of scientific open source software efforts such as the Insight Toolkit (ITK) and scientific Python (SciPy) communities, and maintains the Jupyter 3D widget, &lt;a href="https://github.com/InsightSoftwareConsortium/itkwidgets"&gt;itkwidgets&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Matt McCormick" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/slicerjupyter-a-3d-slicer-kernel-for-interactive/images/007-1_Pm17Os2v8Kf_GiZQw1G_ZQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Matt McCormick&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Isaiah Norton&lt;/strong&gt; is a Senior Software Developer at TileDB, Inc. with experience in digital pathology and image-guided surgical navigation.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Isaiah Norton" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/slicerjupyter-a-3d-slicer-kernel-for-interactive/images/008-1_eR4Y9MX-2lcRsXEKodCJrQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Isaiah Norton&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Steve Pieper&lt;/strong&gt; is a Chief Architect and active developer of the 3D Slicer application for well over a decade. He is CEO of Isomics, Inc, where he uses a range of software technologies to perform medical imaging research with leading universities and companies.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Steve Pieper" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/slicerjupyter-a-3d-slicer-kernel-for-interactive/images/009-1_aNwZz5TLENXuS2WQRb_N9w.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Steve Pieper&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Martin Renou&lt;/strong&gt; is a scientific software developer at QuantStack. He is the original author of xeus-python, the xeus-based Python kernel, and contributed to the new concurrency model used for the debugger.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Martin Renou" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/slicerjupyter-a-3d-slicer-kernel-for-interactive/images/010-1_Cy9QfZytimqXQut2-bdcIA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Martin Renou&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Mike Sarahan&lt;/strong&gt; is a software engineer at RStudio, PBC working on bringing language ecosystems together. He is passionate about making software work for data scientists in ways that are easy to maintain and improve.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Mike Sarahan" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/slicerjupyter-a-3d-slicer-kernel-for-interactive/images/011-1_YKNdPIBH39iFBIL9nD_kfg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Mike Sarahan&lt;/figcaption&gt;
&lt;/figure&gt;
</content><category term="kernels"/><category term="science"/><category term="visualization"/></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>National Scale Interactive Computing</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2019/national-scale-interactive-computing/" rel="alternate"/><published>2019-08-22T19:06:00+00:00</published><updated>2019-08-22T20:06:00+00:00</updated><author><name>James Colliander</name></author><id>tag:jasongrout.github.io,2019-08-22:/medium-archive/pelican/posts/2019/national-scale-interactive-computing/</id><summary type="html">&lt;p&gt;Delivering interactive computing to universities at a national scale with a Jupyter stack.&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;This is an invited post from Jim Colliander, Professor of Mathematics at UBC and Director of the&lt;/em&gt; &lt;a href="http://www.pims.math.ca/"&gt;&lt;em&gt;Pacific Institute for the Mathematical Sciences&lt;/em&gt;&lt;/a&gt;.¹&lt;/p&gt;
&lt;p&gt;In 2017, the &lt;a href="http://www.pims.math.ca/"&gt;Pacific Institute for the Mathematical Sciences (PIMS)&lt;/a&gt;, in partnership with &lt;a href="https://www.computecanada.ca/featured/compute-canada-and-pims-launch-jupyter-service-for-researchers/"&gt;Compute Canada&lt;/a&gt; and &lt;a href="https://www.cybera.ca/services/jupyter-all-in-one-science-platform/"&gt;Cybera&lt;/a&gt;, launched &lt;a href="https://syzygy.ca"&gt;Syzygy&lt;/a&gt;, a cloud-hosted interactive computing platform that delivers &lt;a href="https://jupyter.org/"&gt;JupyterHub deployments&lt;/a&gt; for &lt;a href="https://www.google.com/maps/d/embed?mid=1nzSAGLSn8eWdfQ6K7zTw-31h82I&amp;amp;hl=en"&gt;universities across Canada&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Syzygy has been used by over 16,000 students at 20 universities. The main results of the Syzygy experiment so far are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Demand for interactive computing is ubiquitous² and growing strongly at universities.&lt;/li&gt;
&lt;li&gt;The Jupyter ecosystem is an effective way to deliver interactive computing.&lt;/li&gt;
&lt;li&gt;A scalable, sustainable, and cost-effective interactive computing service for universities is needed as soon as possible.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="demand-for-interactive-computing"&gt;Demand for interactive computing&lt;/h2&gt;
&lt;p&gt;Both research and teaching at universities are adapting to major societal changes driven by explosions in data and computational tools. New educational programs that prepare students to think computationally are emerging, while research strategies are changing in ways that are more open, reproducible, collaborative, and interdisciplinary. These transformations are inextricably linked and are accelerating demand for interactive computing. The Syzygy experiment has shown that using Jupyter in educational programs drives interest in using Jupyter for research (and vice versa). For example, students in mathematics, statistics, and computer science &lt;a href="https://medium.com/pims-math/saving-lives-with-data-and-math-b697667d1cd7"&gt;collaborated with a researcher from St. Paul’s Hospital in Vancouver using Syzygy&lt;/a&gt; to identify new pathways to prevent death from sepsis. Research communities typically need access to deeper computational resources and often span multiple universities, but the common thread is the need to expand access to interactive computing.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="A map of JupyterHub deployments deployed by Syzygy." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/national-scale-interactive-computing/images/001-1_L8MzmheO2NZQBH0t-BGpFg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;A map of JupyterHub deployments deployed by Syzygy.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="technical-milestone-achieved"&gt;Technical milestone achieved&lt;/h2&gt;
&lt;p&gt;The Syzygy project has demonstrated that it’s possible to deploy tools for interactive computation at a national scale rapidly and efficiently using an entirely open source technology stack. Students, faculty and staff across Canada use Syzygy to access Jupyter through their browsers with their university single-sign-on credentials. The JupyterHubs range from a “standard” configuration to bespoke environments with specially curated tools and data integrations. This richness is possible because of the architecture of the Syzygy and Jupyter projects and the flexibility of the underlying cloud resources. As a case-study, Syzygy demonstrates that the Jupyter community has achieved a significant technical milestone: interactive computing &lt;em&gt;can be delivered&lt;/em&gt; at national scale using cloud technologies.&lt;/p&gt;
&lt;h2 id="service-level-requirements"&gt;Service level requirements&lt;/h2&gt;
&lt;p&gt;The validation that interactive computing can be technically delivered at national scale prompts universities to ask a variety of questions. Can interactive computing service be delivered robustly? How will users be supported? What are the uptime expectations? What is the data security policy? How is privacy protected? Can the robustness of the service be clarified in a service level agreement? Syzygy, as an experimental service offered to universities at no charge and without a service level agreement, does not properly address these questions. To advance on their education-research-service mission and address growing demand, universities need a reliable interactive computing service with a service level agreement.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;How should universities address their needs for interactive computing over the next five years? Right now, universities are following two primary approaches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🙏 &lt;em&gt;&lt;strong&gt;Ad hoc&lt;/strong&gt;&lt;/em&gt;: faculty figure out how to meet their own needs for interactive computing; IT staff deploys JupyterHub on local or commercial cloud servers; this approach gives universities control over their deployments and hardware, though requires time and expertise that many may not have.&lt;/li&gt;
&lt;li&gt;🎩 &lt;em&gt;&lt;strong&gt;Use a cloud provider’s service&lt;/strong&gt;&lt;/em&gt;: Google Colab, Amazon Sagemaker, Microsoft Azure Notebooks, IBM Watson Studio; this approach allows universities to quickly launch interactive computing services, with a loss of flexibility and some risks by becoming reliant upon a particular vendor’s closed-source and proprietary software.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These approaches are not sustainable over the long term. If universities all deploy their own JupyterHub services, many will need technical expertise they do not currently have and will involve a significant duplication of effort. If universities rely on hosted cloud notebook services, the reliance on proprietary technology will impair their ability to switch between different cloud vendors, change hardware, customize software, etc. Vendor lock-in will limit the ability of universities to respond to changes in price for the service. Universities will lose agility in responding to changes in faculty, staff, and student computing needs.&lt;/p&gt;
&lt;p&gt;There is a third option that addresses the issues with these two approaches and generates other benefits for universities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🤔 &lt;em&gt;&lt;strong&gt;Form an interactive computing consortium&lt;/strong&gt;&lt;/em&gt;: universities collaborate to &lt;em&gt;build&lt;/em&gt; an interactive computing service provider aligned with their missions to better serve their students, facilitate research, and avoid risks associated with vendor lock-in.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To retain control over their interactive computing stacks, avoid dependence⁴ on cloud providers, and accelerate the emergence of new programs, universities should work together to deploy interactive computing environments in a vendor-agnostic manner. This might take the form of a consortium — an organization dedicated to serving the needs of universities through customized shared infrastructure for interactive computing. The consortium would also ensure that universities will continue to play a leadership role in the development of the interactive computing tools used for education and research.&lt;/p&gt;
&lt;p&gt;The Syzygy experiment confirmed that growing demand for interactive computation within universities can be supplied with the available technologies advanced by the Jupyter open source community. In the coming year, we aim to build upon the success of the Syzygy experiment and seed an initial node of a consortium in Canada with the intention of fostering a global network of people invested in advanced interactive computing. If you are interesting in partnering, &lt;a href="https://ten.blue/2i2c/#/3/4"&gt;please get in touch!&lt;/a&gt; See &lt;a href="https://discourse.jupyter.org/t/creating-national-infrastructure-for-jupyter-environments/1966"&gt;this Jupyter Community Forum post&lt;/a&gt; to continue the discussion.&lt;/p&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li&gt;The author gratefully acknowledges feedback on this piece from Ian Allison, Lindsey Heagy, Chris Holdgraf, Fernando Perez, and Lindsay Sill.&lt;/li&gt;
&lt;li&gt;Interactive computing needs have been identified in agriculture, applied mathematics, astronomy, chemistry, climate science, computer science, data science, digital humanities, ecology, economics, engineering, genomics, geoscience, health sciences, K-12 education, neuroscience, political science, physics, pure mathematics, statistics, and sociology.&lt;/li&gt;
&lt;li&gt;Relying on commercial cloud vendors to provide the interactive computing service for universities risks recreating the problems associated with scientific publishing that emerged with the internet.&lt;/li&gt;
&lt;/ol&gt;
</content><category term="cloud computing"/><category term="science"/></entry><entry><title>Jupyter for Science User Facilities and High Performance Computing</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2019/jupyter-for-science-user-facilities-and-high/" rel="alternate"/><published>2019-07-09T23:53:00+00:00</published><updated>2019-07-09T23:53:00+00:00</updated><author><name>Rollin Thomas</name></author><id>tag:jasongrout.github.io,2019-07-09:/medium-archive/pelican/posts/2019/jupyter-for-science-user-facilities-and-high/</id><summary type="html">&lt;p&gt;Jupyter is the “Google Docs” of data science. It provides that same kind of easy-to-use ecosystem, but for interactive data exploration…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Jupyter is the &lt;a href="https://www.nature.com/articles/d41586-018-07196-1"&gt;“Google Docs” of data science.&lt;/a&gt; It provides that same kind of easy-to-use ecosystem, but for interactive data exploration, modeling, and analysis. Just as people have come to expect to be able to use Google Docs everywhere, scientists assume that Jupyter is there for them whenever and wherever they open their laptops.&lt;/p&gt;
&lt;p&gt;But what if the data you want to interact with through Jupyter doesn’t fit on your laptop or is excruciating to move? What if the model you want to build and test requires more computing power and storage than you have right in front of you? As a scientist, you want the same interactive experience and all the benefits of Jupyter, but you also need to “reach out” to put something big into your science process: A supercomputer, a telescope data archive, a beam-line at a synchrotron. Can Jupyter help you do that big science? What efforts are in motion already to make this a reality, what work still needs to be done, and who needs to do it?&lt;/p&gt;
&lt;p&gt;Doing this right will take a community: New collaborations between core Jupyter developers, engineers from high-performance computing (HPC) centers, staff from large-scale experimental and observational data (EOD) facilities, users and other stakeholders. Many facilities have figured out how to deploy, manage, and customize Jupyter, but have done it while focused on their unique requirements and capabilities. Still others are just taking their first steps and want to avoid reinventing the wheel. With some initial critical mass, we can start contributing what we’ve learned separately into a shared body of knowledge, patterns, tools, and best practices.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="40+ participants from universities, national labs, industry, and science user facilities. Credit: Fernando Perez." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/jupyter-for-science-user-facilities-and-high/images/001-1_VqdM1ZzoT6oepd6UZCRIyA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;40+ participants from universities, national labs, industry, and science user facilities. Credit: Fernando Perez.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In June, a &lt;a href="/posts/2019/jupyter-community-workshop-jupyter-for-scientific-user/"&gt;Jupyter Community Workshop&lt;/a&gt; held at the National Energy Research Scientific Computing Center (NERSC) and the Berkeley Institute for Data Science (BIDS) brought about 40 members of this community together to start distilling. Over &lt;a href="https://jupyter-workshop-2019.lbl.gov/agenda"&gt;three days&lt;/a&gt; in talks and breakout sessions, we addressed pain points and best practices in Jupyter deployment, infrastructure, and user support; securing Jupyter in multi-tenant environments; sharing notebooks; HPC/EOD-focused Jupyter extensions; and strategies for communication with stakeholders.&lt;/p&gt;
&lt;p&gt;Here are just a few highlights from the meeting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Michael Milligan from the Minnesota Supercomputing Center perfectly set the tone for the workshop with his keynote, &lt;a href="https://drive.google.com/a/lbl.gov/file/d/1YXuwwHSM1NqUKBkutv1YrJ3Fzsj2UnFN/view?usp=sharing"&gt;“Jupyter is a One-Stop Shop for Interactive HPC Services.”&lt;/a&gt; Michael is the creator of &lt;a href="https://github.com/jupyterhub/batchspawner"&gt;BatchSpawner&lt;/a&gt; and &lt;a href="https://github.com/jupyterhub/wrapspawner"&gt;WrapSpawner&lt;/a&gt;, JupyterHub Spawners that let HPC users run notebooks on compute nodes supporting a variety of batch queue systems. Contributors to both packages met in an afternoon-long breakout to build consensus around some technical issues, start managing development and support in a collaborative way, and gel as a team.&lt;/li&gt;
&lt;li&gt;Securing Jupyter is a huge topic. Thomas Mendoza from Lawrence Livermore National Laboratory talked about &lt;a href="https://github.com/jupyterhub/jupyterhub/pull/2055"&gt;his work&lt;/a&gt; to enable &lt;a href="https://drive.google.com/file/d/16N44SPtKZyPKlcDWp8G_mJcQq-g_G0e2/view"&gt;end-to-end SSL in JupyterHub and best practices for securing Jupyter&lt;/a&gt;. Outcomes from two breakouts on security include a plan to more prominently document security best practices, and a future meeting (perhaps another Jupyter Community Workshop?) focused specifically on security in Jupyter.&lt;/li&gt;
&lt;li&gt;Speakers from Lawrence Livermore and Oak Ridge National Laboratories, the European Space Agency showed off a variety of beautiful JupyterLab extensions, integrations, and plug-ins for climate science, complex physical simulations, astronomical images and catalogs, and atmospheric monitoring. People at a variety of facilities are finding ways to adapt Jupyter to meet the specific needs of their scientists.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Really, there’s just too much to pack into a blog post so we encourage you to look at the &lt;a href="https://jupyter-workshop-2019.lbl.gov/agenda"&gt;talk slides&lt;/a&gt; and &lt;a href="https://discourse.jupyter.org/t/notes-from-breakout-sessions/1338"&gt;notes on Discourse&lt;/a&gt; — all the breakout notes have been posted there to &lt;a href="https://discourse.jupyter.org/c/jupyterhub/hpc-meeting-2019"&gt;this topic.&lt;/a&gt; We’re working on getting videos of the slide presentations up on the workshop website as well. Watch for announcements of future meeting opportunities and documentation on Discourse as well.&lt;/p&gt;
&lt;p&gt;Finally we want to thank Project Jupyter, NumFOCUS, and Bloomberg for their help making this meeting happen. We all came away with a better sense of who is doing what in our community, and how we can work together on this new area of growth for the Jupyter community. The organizers also want to thank their respective institutions’ administrative staff (Seleste Rodriguez at NERSC, and Stacy Dorton at BIDS) for helping with workshop logistics.&lt;/p&gt;
</content><category term="JupyterHub"/><category term="science"/></entry><entry><title>Kellie Ottoboni Receives Award for Post-Election Auditing Notebook</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2019/kellie-ottoboni-receives-award-for-post-election/" rel="alternate"/><published>2019-04-02T17:01:00+00:00</published><updated>2019-04-02T17:01:00+00:00</updated><author><name>Kellie Ottoboni</name></author><id>tag:jasongrout.github.io,2019-04-02:/medium-archive/pelican/posts/2019/kellie-ottoboni-receives-award-for-post-election/</id><summary type="html">&lt;p&gt;On Thursday, March 14th at their annual conference in Washington DC, Kellie Ottoboni received the Innovation Award from the Election…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;On Thursday, March 14th at their annual conference in Washington DC, Kellie Ottoboni received the Innovation Award from the Election Verification Network (EVN) for her work with Professor Philip Stark developing the Stratified Union-Intersection Tests of Elections (SUITE) tool for use in the pilot of risk-limiting audits. &lt;a href="/posts/2019/jupyter-notebooks-for-post-election-audits/"&gt;The SUITE tool is a Jupyter notebook that encompasses all steps of a post-election risk-limiting audit:&lt;/a&gt; risk calculations, an estimate of the number of ballots to examine, and a procedure to sample and locate ballots. An &lt;a href="/posts/2019/jupyter-notebooks-for-post-election-audits/"&gt;earlier post&lt;/a&gt; on the blog describes the tool in greater detail and how it was used in Michigan’s 2018 pilot risk-limiting audits.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://electionverification.org/"&gt;Election Verification Network&lt;/a&gt; is a professional society of election officials, researchers, and advocates committed to accurate, accessible, transparent, reliable, and verifiable elections. The &lt;strong&gt;Innovation Award&lt;/strong&gt; is given annually for path-breaking product development that greatly facilitates robust election verification and auditing.&lt;/p&gt;
</content><category term="science"/></entry><entry><title>Jupyter notebooks for post-election audits</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2019/jupyter-notebooks-for-post-election-audits/" rel="alternate"/><published>2019-01-22T16:01:00+00:00</published><updated>2019-01-22T16:01:00+00:00</updated><author><name>Kellie Ottoboni</name></author><id>tag:jasongrout.github.io,2019-01-22:/medium-archive/pelican/posts/2019/jupyter-notebooks-for-post-election-audits/</id><summary type="html">&lt;p&gt;The following is a guest blog post authored by Kellie Ottoboni, describing her recent work where they used Jupyter to support statistical…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;em&gt;The following is a guest blog post authored by&lt;/em&gt; &lt;a href="https://medium.com/@knottoboni"&gt;&lt;em&gt;Kellie Ottoboni&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, describing her recent work where they used Jupyter to support statistical audits of election results.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In December 2018, I facilitated &lt;a href="https://www.michigan.gov/som/0,4669,7-192-26847-481829--,00.html"&gt;pilot post-election risk-limiting audits in three cities in Michigan&lt;/a&gt;. This was the first time that SUITE, a new method for “hybrid” risk-limiting audits that I helped develop, has been used in practice. I wrote a &lt;a href="https://mybinder.org/v2/gh/pbstark/CORLA18/master?filepath=code%2Fsuite_toolkit.ipynb"&gt;Jupyter notebook tool&lt;/a&gt; to do the SUITE risk calculations, to determine the necessary sample size, and to sample the ballots using a &lt;a href="https://github.com/statlab/cryptorandom"&gt;cryptographically secure pseudo-random number generator&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Twenty 10-sided dice were rolled to select the seed for the pseudo-random number generator." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/jupyter-notebooks-for-post-election-audits/images/001-1_FD23qGCK5K87ZUiqwmNusQ.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Twenty 10-sided dice were rolled to select the seed for the pseudo-random number generator.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="what-are-risk-limiting-audits"&gt;What are risk-limiting audits?&lt;/h2&gt;
&lt;p&gt;A &lt;em&gt;risk-limiting audit&lt;/em&gt; (RLA) is a statistical check that the reported outcome (the reported winner(s), as opposed to exact vote totals) of an election is correct. The procedure limits the chance that an incorrect outcome will go uncorrected, if the reported outcome is in fact wrong. RLAs involve sampling and examining paper ballots. 34 RLA pilots have been done in California, Colorado, Indiana, New Jersey, Ohio, Virginia, and Denmark. Colorado began requiring RLAs by law in 2017, and Rhode Island will begin requiring RLAs in 2019.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://arxiv.org/abs/1809.04235"&gt;SUITE&lt;/a&gt; is a general method for conducting RLAs of &lt;em&gt;stratified samples&lt;/em&gt;, where a population of ballots is divided into non-overlapping &lt;em&gt;strata&lt;/em&gt; and samples are drawn independently from each stratum. We began developing SUITE for Colorado, treating absentee votes and in-precinct votes as two strata. Aside from this special case, &lt;a href="https://arxiv.org/abs/1809.04235"&gt;SUITE&lt;/a&gt; may be useful for auditing states where counties work independently.&lt;/p&gt;
&lt;p&gt;Michigan used the specific two-stratum version of SUITE, which combines two types of RLAs: &lt;em&gt;ballot polling&lt;/em&gt;, which involves “polling” the ballots and recording the proportion of votes for each candidate, and &lt;em&gt;ballot-level comparison&lt;/em&gt;, which involves comparing paper ballots to their electronic record and counting the number of discrepancies. Ballot-level comparison audits require looking at fewer ballots than ballot polling, but can only be done when ballots can be matched to their electronic records. In two of the Michigan cities, absentee ballots could be matched to their electronic record. &lt;a href="https://arxiv.org/abs/1809.04235"&gt;SUITE&lt;/a&gt; allows you to use these two strategies side-by-side for a single RLA.&lt;/p&gt;
&lt;h2 id="the-jupyter-tool"&gt;The Jupyter tool&lt;/h2&gt;
&lt;p&gt;Previous RLA pilots have used &lt;a href="https://www.stat.berkeley.edu/~stark/Vote/ballotPollTools.htm"&gt;HTML pages&lt;/a&gt; with Javascript code, written by Philip Stark, to conduct the audits. With a short timeframe to create a similar SUITE tool, Philip and I decided that the best solution was to build out the Python library we had begun and use a Jupyter notebook for the interface.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The final results of the audit in Kalamazoo were shown in the Jupyter notebook." src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/jupyter-notebooks-for-post-election-audits/images/002-1_QJaAodid6j5QL57iutniEg.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The final results of the audit in Kalamazoo were shown in the Jupyter notebook.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The &lt;a href="https://mybinder.org/v2/gh/pbstark/CORLA18/master?filepath=code%2Fsuite_toolkit.ipynb"&gt;SUITE notebook&lt;/a&gt; made the audits more transparent. In each city, I projected the notebook running locally on my laptop on a screen for about 30 local election officials. They could observe me entering the reported vote totals for each candidate and the 20-digit random seed to initialize the pseudo-random number generator, then see the sampled ballots appear on the screen in a nicely formatted table. These folks are used to working in Excel spreadsheets, so the interactivity of a Jupyter notebook is more familiar interface than simply running an executable file in the terminal. Each step of the audit was interactive and annotated with Markdown.&lt;/p&gt;
&lt;p&gt;Our hope is that the &lt;a href="https://mybinder.org/v2/gh/pbstark/CORLA18/master?filepath=code%2Fsuite_toolkit.ipynb"&gt;SUITE notebook&lt;/a&gt; can serve as a proof of concept for further development. Free &amp;amp; Fair turned the HTML RLA tools into &lt;a href="https://github.com/FreeAndFair/ColoradoRLA"&gt;industrial strength software&lt;/a&gt; and &lt;a href="https://www.democracy.works/"&gt;Democracy Works&lt;/a&gt; built upon it to create the program that Colorado uses for statewide RLAs.&lt;/p&gt;
&lt;h2 id="pitfalls"&gt;Pitfalls&lt;/h2&gt;
&lt;p&gt;One main difference between the &lt;a href="https://www.stat.berkeley.edu/~stark/Vote/auditTools.htm"&gt;HTML RLA tools&lt;/a&gt; and the &lt;a href="https://mybinder.org/v2/gh/pbstark/CORLA18/master?filepath=code%2Fsuite_toolkit.ipynb"&gt;SUITE notebook&lt;/a&gt; is that the webpages hide all the code. While we moved most of the code to modules and limited most code cells to one function, the notebook still contained a lot of code to scroll through. &lt;a href="https://github.com/QuantStack/voila"&gt;Voila&lt;/a&gt;, a tool for hiding code in notebooks with interactive widgets, is one possible solution to display only the crucial input and output pieces of the tool.&lt;/p&gt;
&lt;p&gt;Another issue we faced was the sequential nature of notebooks. RLAs are iterative: if the risk of the ballots from a first round of sampling is too high, then the audit proceeds to more rounds, until either the risk is sufficiently small or all ballots have been counted. A more proficient software developer than I might have come up with an elegant way to make this possible in a Jupyter notebook while tracking the data from each round of sampling. My hack was to assume that in Michigan we would need at most two rounds of sampling and to copy the code for the first round, with some modifications. (In fact, none of the three cities used more than one round.)&lt;/p&gt;
&lt;p&gt;The RLA tools written by &lt;a href="https://github.com/FreeAndFair/ColoradoRLA"&gt;Free &amp;amp; Fair&lt;/a&gt; and &lt;a href="https://www.democracy.works/"&gt;Democracy Works&lt;/a&gt; are written in Java and Clojure. Academics continue to improve the statistics, so it would be helpful to have an API accessible with Python. It would enable the open source community to contribute to the codebase rather than reinvent the wheel to build a tool every time new statistics are developed.&lt;/p&gt;
&lt;h2 id="michigan-pilots"&gt;Michigan pilots&lt;/h2&gt;
&lt;p&gt;Rochester Hills, Lansing, and Kalamazoo participated in the pilots of their November, 2018 election. I traveled to each city with a team of election auditing experts from MIT, the NYU Brennan Center for Justice, the Electoral Assistance Commission, and Democracy Works. We hope that this &lt;a href="https://mybinder.org/v2/gh/pbstark/CORLA18/master?filepath=code%2Fsuite_toolkit.ipynb"&gt;Jupyter notebook&lt;/a&gt; helped demystify the code and math, and illustrate that RLAs are feasible and efficient way to insure election integrity.&lt;/p&gt;
</content><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><entry><title>Interactive Workflows for C++ with Jupyter</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2017/interactive-workflows-for-c-with-jupyter/" rel="alternate"/><published>2017-11-29T16:33:00+00:00</published><updated>2019-12-25T09:42:00+00:00</updated><author><name>QuantStack</name></author><id>tag:jasongrout.github.io,2017-11-29:/medium-archive/pelican/posts/2017/interactive-workflows-for-c-with-jupyter/</id><summary type="html">&lt;p&gt;Scientists, educators and engineers not only use programming languages to build software systems, but also in interactive workflows, using…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Scientists, educators and engineers not only use programming languages to build software systems, but also in interactive workflows, using the tools available to &lt;em&gt;explore&lt;/em&gt; a problem and &lt;em&gt;reason&lt;/em&gt; about it.&lt;/p&gt;
&lt;p&gt;Running some code, looking at a visualization, loading data, and running more code. Quick iteration is especially important during the exploratory phase of a project.&lt;/p&gt;
&lt;p&gt;For this kind of workflow, users of the C++ programming language currently have no choice but to use a heterogeneous set of tools that don’t play well with each other, making the whole process cumbersome, and difficult to reproduce.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;We currently lack a good story for interactive computing in C++&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In our opinion, this hurts the productivity of C++ developers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Most of the progress made in software projects comes from incrementalism. Obstacles to fast iteration hinder progress.&lt;/li&gt;
&lt;li&gt;This also makes C++ more difficult to teach. The first hours of a C++ class are rarely rewarding as the students must learn how to set up a small project before writing any code. And then, a lot more time is required before their work can result in any visual outcome.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="project-jupyter-and-interactive-computing"&gt;Project Jupyter and Interactive Computing&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/interactive-workflows-for-c-with-jupyter/images/001-1_wOHyKy6fl3ltcBMNpCvC6Q.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The goal of Project Jupyter is to provide a consistent set of tools for scientific computing and data science workflows, from the exploratory phase of the analysis to the presentation and the sharing of the results. The Jupyter stack was designed to be agnostic of the programming language, and also to allow alternative implementations of any component of the layered architecture (back-ends for programming languages, custom renderers for file types associated with Jupyter). The stack consists of&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a low-level specification for messaging protocols, standardized file formats,&lt;/li&gt;
&lt;li&gt;a reference implementation of these standards,&lt;/li&gt;
&lt;li&gt;applications built on top of these libraries: the Notebook, JupyterLab, Binder, JupyterHub&lt;/li&gt;
&lt;li&gt;and visualization libraries integrated into the Notebook and JupyterLab.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Adoption of the Jupyter ecosystem has skyrocketed in the past years, with millions of users worldwide, over a million Jupyter notebooks shared on GitHub and large-scale deployments of Jupyter in universities, companies and high-performance computing centers.&lt;/p&gt;
&lt;h2 id="jupyter-and-c"&gt;Jupyter and C++&lt;/h2&gt;
&lt;p&gt;One of the main extension points of the Jupyter stack is the &lt;em&gt;kernel&lt;/em&gt;, the part of the infrastructure responsible for executing the user’s code. Jupyter kernels exist for &lt;a href="https://github.com/jupyter/jupyter/wiki/Jupyter-kernels"&gt;numerous programming languages&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Most Jupyter kernels are implemented in the target programming language: the reference implementation &lt;a href="https://github.com/ipython/ipykernel"&gt;ipykernel&lt;/a&gt; in Python, &lt;a href="https://github.com/JuliaLang/IJulia.jl"&gt;IJulia&lt;/a&gt; in Julia, leading to a duplication of effort for the implementation of the protocol. A common denominator to a lot of these interpreted languages is that the interpreter generally exposes a C API, allowing the embedding into a native application. In an effort to consolidate these commonalities and save work for future kernel builders, we developed &lt;em&gt;xeus&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/interactive-workflows-for-c-with-jupyter/images/002-1_TKrPv5AvFM3NJ6a7VMu8Tw.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/QuantStack/xeus"&gt;Xeus&lt;/a&gt; is a C++ implementation of the Jupyter kernel protocol. It is not a kernel itself but a library that facilitates the authoring of kernels, and other applications making use of the Jupyter kernel protocol.&lt;/p&gt;
&lt;p&gt;A typical kernel implementation using xeus would in fact make use of the target interpreter &lt;em&gt;as a library.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;There are a number of benefits of using xeus over implementing your kernel in the target language:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Xeus provides a complete implementation of the protocol, enabling a lot of features from the start for kernel authors, who only need to deal with the language bindings.&lt;/li&gt;
&lt;li&gt;Xeus-based kernels can very easily provide a back-end for Jupyter interactive widgets.&lt;/li&gt;
&lt;li&gt;Finally, xeus can be used to implement kernels for domain-specific languages such as SQL flavors. Existing approaches use a Python wrapper. With xeus, the resulting kernel won’t require Python at run-time, leading to large performance benefits.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/interactive-workflows-for-c-with-jupyter/images/003-1_Cr_cfHdrgFXHlO15qdNK7w.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interpreted C++&lt;/strong&gt; is already a reality at CERN with the &lt;a href="https://root.cern.ch/cling"&gt;Cling&lt;/a&gt; C++ interpreter in the context of the &lt;a href="https://root.cern.ch/"&gt;ROOT&lt;/a&gt; data analysis environment.&lt;/p&gt;
&lt;p&gt;As a first example for a kernel based on xeus, we have implemented &lt;a href="https://github.com/QuantStack/xeus-cling"&gt;xeus-cling&lt;/a&gt;, a pure C++ kernel.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Redirection of outputs to the Jupyter front-end, with different styling in the front-end." src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/interactive-workflows-for-c-with-jupyter/images/004-1_NnjISpzZtpy5TOurg0S89A.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Redirection of outputs to the Jupyter front-end, with different styling in the front-end.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Complex features of the C++ programming language such as, polymorphism, templates, lambdas, are supported by the cling interpreter, making the C++ Jupyter notebook a great prototyping and learning platform for the C++ users. See the image below for a demonstration:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Features of the C++ programming language supported by the cling interpreter" src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/interactive-workflows-for-c-with-jupyter/images/005-1_lGVLY4fL1ytMfT-eWtoXkw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Features of the C++ programming language supported by the cling interpreter&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Finally, xeus-cling supports live quick-help, fetching the content on &lt;a href="http://en.cppreference.com/w/"&gt;cppreference&lt;/a&gt; in the case of the standard library.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Live help for the C++standard library in the Jupyter notebook" src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/interactive-workflows-for-c-with-jupyter/images/006-1_Igegq0xBebuJV8hy0TGpfg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Live help for the C++standard library in the Jupyter notebook&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;We realized that we started using the C++ kernel ourselves very early in the development of the project. For quick experimentation, or reproducing bugs. No need to set up a project with a cpp file and complicated project settings for finding the dependencies… Just write some code and hit &lt;strong&gt;Shift+Enter&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Visual output can also be displayed using the rich display mechanism of the Jupyter protocol.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Using Jupyter's rich display mechanism to display an image inline in the notebook" src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/interactive-workflows-for-c-with-jupyter/images/007-1_t_9qAXtdkSXr-0tO9VvOzQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Using Jupyter’s rich display mechanism to display an image inline in the notebook&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/interactive-workflows-for-c-with-jupyter/images/008-1_OVfmXFAbfjUtGFXYS9fKRA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Another important feature of the Jupyter ecosystem are the &lt;a href="http://jupyter.org/widgets"&gt;Jupyter Interactive Widgets&lt;/a&gt;. They allow the user to build graphical interfaces and interactive data visualization inline in the Jupyter notebook. Moreover it is not just a collection of widgets, but a framework that can be built upon, to create arbitrary visual components. Popular interactive widget libraries include&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/bloomberg/bqplot"&gt;bqplot&lt;/a&gt; (2-D plotting with d3.js)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jovyan/pythreejs"&gt;pythreejs&lt;/a&gt; (3-D scene visualization with three.js)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ellisonbg/ipyleaflet"&gt;ipyleaflet&lt;/a&gt; (maps visualization with leaflet.js)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/maartenbreddels/ipyvolume"&gt;ipyvolume&lt;/a&gt; (3-D plotting and volume rendering with three.js)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/arose/nglview"&gt;nglview&lt;/a&gt; (molecular visualization)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Just like the rest of the Jupyter ecosystem, Jupyter interactive widgets were designed as a language-agnostic framework. Other language back-ends can be created reusing the front-end component, which can be installed separately.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/QUantStack/xwidgets"&gt;xwidgets&lt;/a&gt;, which is still at an early stage of development, is a native C++ implementation of the Jupyter widgets protocol. It already provides an implementation for most of the widget types available in the core Jupyter widgets package.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="C++ back-end to the Jupyter interactive widgets" src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/interactive-workflows-for-c-with-jupyter/images/009-1_ro5Ggdstnf0DoqhTUWGq3A.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;C++ back-end to the Jupyter interactive widgets&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Just like with ipywidgets, one can build upon xwidgets and implement C++ back-ends for the Jupyter widget libraries listed earlier, effectively enabling them for the C++ programming language and other xeus-based kernels: xplot, xvolume, xthreejs…&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/interactive-workflows-for-c-with-jupyter/images/010-1_yCRYoJFnbtxYkYMRc9AioA.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/QuantStack/xplot"&gt;xplot&lt;/a&gt; is an experimental C++ back-end for the &lt;a href="https://github.com/bloomberg/bqplot"&gt;bqplot&lt;/a&gt; 2-D plotting library. It enables an API following the constructs of the &lt;a href="https://dl.acm.org/citation.cfm?id=1088896"&gt;&lt;em&gt;Grammar of Graphics&lt;/em&gt;&lt;/a&gt; in C++.&lt;/p&gt;
&lt;p&gt;In xplot, every item in a chart is a separate object that can be modified from the back-end, &lt;em&gt;dynamically&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Changing a property of a plot item, a scale, an axis or the figure canvas itself results in the communication of an update message to the front-end, which reflects the new state of the widget visually.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Changing the data of a scatter plot dynamically to update the chart" src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/interactive-workflows-for-c-with-jupyter/images/011-1_Mx2g3JuTG1Cfvkkv0kqtLA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Changing the data of a scatter plot dynamically to update the chart&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; the xplot and xwidgets projects are still at an early stage of development and are changing drastically at each release.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Interactive computing environments like Jupyter are not the only missing tool in the C++ world. Two key ingredients to the success of Python as the &lt;em&gt;lingua franca&lt;/em&gt; of data science is the existence of libraries like &lt;a href="http://www.numpy.org/"&gt;NumPy&lt;/a&gt; and &lt;a href="https://pandas.pydata.org/"&gt;Pandas&lt;/a&gt; at the foundation of the ecosystem.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/interactive-workflows-for-c-with-jupyter/images/012-1_HsU43Jzp1vJZpX2g8XPJsg.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/QuantStack/xtensor/"&gt;xtensor&lt;/a&gt; is a C++ library meant for numerical analysis with multi-dimensional array expressions.&lt;/p&gt;
&lt;p&gt;xtensor provides&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;an extensible expression system enabling lazy NumPy-style broadcasting.&lt;/li&gt;
&lt;li&gt;an API following the &lt;em&gt;idioms&lt;/em&gt; of the C++ standard library.&lt;/li&gt;
&lt;li&gt;tools to manipulate array expressions and build upon xtensor.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;xtensor exposes an API similar to that of NumPy covering a growing portion of the functionalities. A cheat sheet can be &lt;a href="http://xtensor.readthedocs.io/en/latest/numpy.html"&gt;found in the documentation&lt;/a&gt;:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Scrolling the NumPy to xtensor cheat sheet" src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/interactive-workflows-for-c-with-jupyter/images/013-1_PBrf5vWYC8VTq_7VUOZCpA.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Scrolling the NumPy to xtensor cheat sheet&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;However, xtensor internals are very different from NumPy. Using modern C++ techniques (template expressions, closure semantics) xtensor is a lazily evaluated library, avoiding the creation of temporary variables and unnecessary memory allocations, even in the case complex expressions involving broadcasting and language bindings.&lt;/p&gt;
&lt;p&gt;Still, from a user perspective, the combination of xtensor with the C++ notebook provides an experience very similar to that of NumPy in a Python notebook.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Using the xtensor array expression library in a C++ notebook" src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/interactive-workflows-for-c-with-jupyter/images/014-1_ULFpg-ePkdUbqqDLJ9VrDw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Using the xtensor array expression library in a C++ notebook&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In addition to the core library, the xtensor ecosystem has a number of other components&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/QuantStack/xtensor-blas"&gt;&lt;strong&gt;xtensor-blas&lt;/strong&gt;&lt;/a&gt;: the counterpart to the numpy.linalg module.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/egpbos/xtensor-fftw"&gt;&lt;strong&gt;xtensor-fftw&lt;/strong&gt;&lt;/a&gt;: bindings to the &lt;a href="http://www.fftw.org/"&gt;fftw&lt;/a&gt; library.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/QuantStack/xtensor-io"&gt;&lt;strong&gt;xtensor-io&lt;/strong&gt;&lt;/a&gt;: APIs to read and write various file formats (images, audio, NumPy’s NPZ format).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wolfv/xtensor_ros"&gt;&lt;strong&gt;xtensor-ros&lt;/strong&gt;&lt;/a&gt;: bindings for ROS, the robot operating system.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/QuantStack/xtensor-python"&gt;&lt;strong&gt;xtensor-python&lt;/strong&gt;&lt;/a&gt;: bindings for the Python programming language, allowing the use of NumPy arrays in-place, using the NumPy C API and the pybind11 library.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/QuantStack/Xtensor.jl"&gt;&lt;strong&gt;xtensor-julia&lt;/strong&gt;&lt;/a&gt;: bindings for the Julia programming language, allowing the use of Julia arrays in-place, using the C API of the Julia interpreter, and the CxxWrap library.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/QuantStack/xtensor-r"&gt;&lt;strong&gt;xtensor-r&lt;/strong&gt;&lt;/a&gt;: bindings for the R programming language, allowing the use of R arrays in-place.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Detailing further the features of the xtensor framework would be beyond the scope of this post.&lt;/p&gt;
&lt;p&gt;If you are interested in trying the various notebooks presented in this post, there is no need to install anything. You can just use &lt;em&gt;binder&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/interactive-workflows-for-c-with-jupyter/images/015-1_9cy5Mns_I0eScsmDBjvxDQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mybinder.org/"&gt;The Binder project&lt;/a&gt;, which is part of Project Jupyter, enables the deployment of containerized Jupyter notebooks, from a GitHub repository together with a manifest listing the dependencies (as conda packages).&lt;/p&gt;
&lt;p&gt;All the notebooks in the screenshots above can be run online, by just clicking on one of the following links:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mybinder.org/v2/gh/QuantStack/xeus-cling/stable?filepath=notebooks/xcpp.ipynb"&gt;&lt;strong&gt;xeus-cling&lt;/strong&gt;&lt;/a&gt;: the main xeus-cling example notebook,&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mybinder.org/v2/gh/QuantStack/xtensor/stable?filepath=notebooks/xtensor.ipynb"&gt;&lt;strong&gt;xtensor&lt;/strong&gt;&lt;/a&gt;: the C++ N-D array expression library in a C++ notebook,&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mybinder.org/v2/gh/QuantStack/xwidgets/0.11.1?filepath=notebooks/xwidgets.ipynb"&gt;&lt;strong&gt;xwidgets&lt;/strong&gt;&lt;/a&gt;: the C++ back-end for Jupyter interactive widgets,&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mybinder.org/v2/gh/QuantStack/xplot/0.5.0?filepath=notebooks"&gt;&lt;strong&gt;xplot&lt;/strong&gt;&lt;/a&gt;: the C++ back-end to the bqplot 2-D plotting library for Jupyter.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/interactive-workflows-for-c-with-jupyter/images/016-1_JwqhpMxMJppEepj7U4fV-g.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/jupyterhub/jupyterhub"&gt;JupyterHub&lt;/a&gt; is the multi-user infrastructure underlying open wide deployments of Jupyter like Binder but also smaller deployments for authenticated users.&lt;/p&gt;
&lt;p&gt;The modular architecture of JupyterHub enables a great variety of scenarios on how users are authenticated, and what service is made available to them. JupyterHub deployment for several hundreds of users have been done in various universities and institutions, including the Paris-Sud University, where the C++ kernel was also installed for the students to use.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In September 2017, the 350 first-year students at Paris-Sud University who took the “&lt;a href="http://nicolas.thiery.name/Enseignement/Info111/"&gt;Info 111: Introduction to Computer&lt;br&gt;
Science&lt;/a&gt;” class wrote their first lines of C++ in a Jupyter notebook.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The use of Jupyter notebooks in the context of teaching C++ proved especially useful for the first classes, where students can focus on the syntax of the language without distractions such as compiling and linking.&lt;/p&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&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 and the &lt;strong&gt;Cling&lt;/strong&gt; developers.&lt;/p&gt;
&lt;p&gt;We are especially grateful to &lt;a href="https://twitter.com/egpbos"&gt;Patrick Bos&lt;/a&gt; (who authored xtensor-fftw), Nicolas Thiéry, Min Ragan Kelley, Thomas Kluyver, Yuvi Panda, Kyle Cranmer, Axel Naumann and Vassil Vassilev.&lt;/p&gt;
&lt;p&gt;We thank the &lt;a href="http://diana-hep.org"&gt;DIANA/HEP&lt;/a&gt; organization for supporting travel to CERN and encouraging the collaboration between Project Jupyter and the ROOT team.&lt;/p&gt;
&lt;p&gt;We are also grateful to the team at &lt;strong&gt;Paris-Sud University&lt;/strong&gt; who worked on the JupyterHub deployment and the class materials, notably &lt;a href="https://twitter.com/pyviv"&gt;Viviane Pons&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The development of xeus, xtensor, 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-authors-alphabetical-order"&gt;About the Authors (alphabetical order)&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/SylvainCorlay"&gt;&lt;em&gt;Sylvain Corlay&lt;/em&gt;&lt;/a&gt;, Scientific Software Developer at &lt;a href="https://github.com/QuantStack/"&gt;QuantStack&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/lgouarin"&gt;&lt;em&gt;Loic Gouarin&lt;/em&gt;&lt;/a&gt;, Research Engineer at &lt;a href="https://www.math.u-psud.fr"&gt;Laboratoire de Mathématiques at Orsay&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/johanmabille?lang=en"&gt;&lt;em&gt;Johan Mabille&lt;/em&gt;&lt;/a&gt;, Scientific Software Developer at &lt;a href="https://github.com/QuantStack/"&gt;QuantStack&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/wuoulf"&gt;&lt;em&gt;Wolf Vollprecht&lt;/em&gt;&lt;/a&gt;, Scientific Software Developer at &lt;a href="https://github.com/QuantStack/"&gt;QuantStack&lt;/a&gt;&lt;/p&gt;
</content><category term="C++"/><category term="science"/></entry><entry><title>Congratulations to the LIGO and VIRGO Collaborations from Project Jupyter</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2017/congratulations-to-the-ligo-and-virgo-collaborations/" rel="alternate"/><published>2017-11-13T23:03:00+00:00</published><updated>2017-11-13T23:03:00+00:00</updated><author><name>Brian E. Granger</name></author><id>tag:jasongrout.github.io,2017-11-13:/medium-archive/pelican/posts/2017/congratulations-to-the-ligo-and-virgo-collaborations/</id><summary type="html">&lt;p&gt;This blog post was co-authored by Jessica Forde.&lt;/p&gt;
</summary><content type="html">&lt;figure&gt;
&lt;img alt="Aerial view of LIGO Hanford Observatory (image credit to LIGO Lab/Caltech/MIT)." src="https://jasongrout.github.io/medium-archive/pelican/posts/2017/congratulations-to-the-ligo-and-virgo-collaborations/images/001-1_rEqQDVObK1cWHet6MUR8-w.jpeg" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Aerial view of LIGO Hanford Observatory (image credit to LIGO Lab/Caltech/MIT).&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;em&gt;This blog post was co-authored by&lt;/em&gt; &lt;a href="https://github.com/jzf2101"&gt;&lt;em&gt;Jessica Forde&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On behalf of the entire Project Jupyter team, we’d like to say congratulations to Rainer Weiss, Barry C. Barish, Kip S. Thorne and the rest of the LIGO and VIRGO teams for the &lt;a href="https://www.nobelprize.org/nobel_prizes/physics/laureates/2017/press.html"&gt;Nobel Prize in Physics 2017&lt;/a&gt;. Since 2015, the LIGO and VIRGO Collaborations have observed multiple instances of gravitational waves due to colliding black holes (and more recently neutron stars). These observations represent decades of work and confirm what Einstein had theorized a hundred years ago.&lt;/p&gt;
&lt;p&gt;The LIGO and VIRGO Collaborations are exemplars in utilizing open-source software to promote practices of open science through their &lt;a href="https://losc.ligo.org/start/"&gt;Open Science Center&lt;/a&gt;. The Open Science Center is a portal for the sharing of data, software, analysis, and discoveries from the LIGO/VIRGO Collaboration. To communicate to the broader community, the LIGO/VIRGO Collaboration has created tutorials with Jupyter Notebooks that describe how to use LIGO/VIRGO data and reproduce analyses related to their &lt;a href="https://www.lsc-group.phys.uwm.edu/ppcomm/Papers.html"&gt;academic publications&lt;/a&gt;. Most notably, they published a tutorial for working with &lt;a href="https://github.com/losc-tutorial/LOSC_Event_tutorial"&gt;Binary Black Hole Data&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Posting notebooks and data has enabled the Jupyter community, including our own Min Ragan-Kelley, to make these notebooks interactive by putting them on &lt;a href="https://mybinder.org/"&gt;Binder&lt;/a&gt;, a service originally created by Jeremy Freeman and Andrew Osheroff, then at &lt;a href="https://www.janelia.org/"&gt;Janelia&lt;/a&gt;. Binder allows any GitHub repository with Jupyter Notebooks to be turned into a live, runnable notebook instance that anyone in the world can access instantly. Today, LIGO makes interactive tutorials for each new gravitational wave event by posting links to Binder and Azure Notebooks so users can interact with the data and Jupyter Notebooks in an online environment. They are truly some of our best examples of Binder in action to date!&lt;/p&gt;
&lt;p&gt;To visit the LIGO/VIRGO Collaboration’s tutorials, &lt;a href="https://losc.ligo.org/tutorials/"&gt;click here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Watch this blog for some exciting upcoming announcements related to Binder.&lt;/p&gt;
</content><category term="science"/></entry></feed>