[GRASS-dev] grass.jupyter Mini Project Final Report

Caitlin Haedrich caitlin.haedrich at gmail.com
Mon Apr 18 12:20:12 PDT 2022


Hi all,

Last week, we wrapped a final push on grass.jupyter and are excited for its
official release with GRASS 8.2. Here's my final report along with a
summary of grass.jupyter changes introduced as part of the project. Thank
you all for your support, feedback and testing over the past few months!

*The state of the art BEFORE the start of the Mini Project:*
During GSoC 2021, we created “grass.jupyter”, a package that improves the
integration of GRASS GIS and Jupyter with a set of functions for displaying
GRASS data in Jupyter Notebooks. In its previous state, “grass.jupyter”
allows users to create static visuals and simple interactive maps. However,
several additional features are needed to allow Jupyter users to fully and
easily access the power GRASS, including space-time dataset visualization
and more options for interactive mapping.

*Project Goals*:
In preparation for the stable release of grass.jupyter with GRASS 8.2, this
project had three main goals: (1) create space time dataset visualizations
for use in Jupyter Notebooks, (2) improve the integration of GRASS with
folium (leaflet library for Python) and (3) write a function for displaying
vector attributes in nicely-formatted tables (using Pandas or Geopandas).
Along the way, we also wanted to finalize the naming of grass.jupyter
classes and create documentation (thank you Vaclav Petras).

*The state of the art AFTER the Mini Project:*
1. New TimeSeriesMap class that creates ipywidget time sliders of space
time datasets (see attached timeseriesmap.png) and a notebook documenting
it's usage [1]
2. Improved GRASS-folium integration allowing rasters and vectors to be
added to existing folium maps (see attached grass-folium.png) and updated
notebook demonstrating its usage [2]
3. Updated class names:

   - GrassRenderer -> Map
   - Grass3dRenderer -> Map3D
   - InteractiveMap
   - TimeSeries -> TimeSeriesMap

4. Thanks to Vaclav Petras, we also have a manual page for grass.jupyter [3]
5. I didn't end up working to integrate GRASS and Pandas. It seems that it
is quite straightforward to display vector attributes in nicely-formatted
Pandas tables. For example:

>>> import pandas as pd

>>> import sqlite3
>>> sql_path = gs.read_command("db.databases",
driver="sqlite").replace('\n', '')
>>> con = sqlite3.connect(sql_path)
>>> sql_stat="SELECT * FROM field"
>>> df = pd.read_sql_query(sql_stat, con)

>>> con.close()
>>> df

There are other outputs that would be nice to display in nice Pandas
tables, like text output from r.univar, r.stats, or t.vect.list. However,
this is difficult since there is no standard output that is easily
parse-able to pandas. I think the best way would be to create a standard
json or csv output for all modules that return text. Then, it would be
simple to take any module output and convert to a nice-looking Pandas table.

*Next Steps:*
1. Bug: InteractiveMap does not honor use_region=True for vectors.
2. Bug: InteractiveMap for Jupyter does not handle not existing data
properly (https://github.com/OSGeo/grass/issues/2302)
3. InteractiveMap: add legend options for rasters, support simpleCRS for
faster rendering, ToolTip integration for vector attributes
4. Continue Pandas integration by adding standard json or csv output to
modules that return text
5. ... And many others! I think there's still lots of ways we can improve
and expand the integration of GRASS and Jupyter. Ideas welcome.

You can find an archive of all my weekly reports at [4] and follow next
steps for grass.jupyter on our project page on GitHub [5]. Thank you again
to Vaclav Petras and Anna Petrasova for their guidance and contributions to
grass.jupyter. And, another thank you to Vero Andreo, Stefan Blumentrath
and Markus Neteler for their feedback and testing!

Best,
Caitlin

[1]
https://mybinder.org/v2/gh/OSGeo/grass/main?urlpath=lab%2Ftree%2Fdoc%2Fnotebooks%2Ftemporal.ipynb
[2]
https://mybinder.org/v2/gh/OSGeo/grass/main?urlpath=lab%2Ftree%2Fdoc%2Fnotebooks%2Fgrass_jupyter.ipynb
[3] https://grass.osgeo.org/grass81/manuals/libpython/grass.jupyter.html
[4]
https://trac.osgeo.org/grass/wiki/GSoC/2021/JupyterAndGRASS/MiniGrant2022
[5] https://github.com/OSGeo/grass/projects/7
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/grass-dev/attachments/20220418/efa0eec3/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: timeseriesmap.PNG
Type: image/png
Size: 141128 bytes
Desc: not available
URL: <http://lists.osgeo.org/pipermail/grass-dev/attachments/20220418/efa0eec3/attachment-0002.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: grass-folium.PNG
Type: image/png
Size: 606533 bytes
Desc: not available
URL: <http://lists.osgeo.org/pipermail/grass-dev/attachments/20220418/efa0eec3/attachment-0003.png>


More information about the grass-dev mailing list