<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://grasswiki.osgeo.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=29riyasaxena</id>
	<title>GRASS-Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://grasswiki.osgeo.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=29riyasaxena"/>
	<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/wiki/Special:Contributions/29riyasaxena"/>
	<updated>2026-05-25T20:51:49Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_Ideas_2024&amp;diff=27956</id>
		<title>GRASS GSoC Ideas 2024</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_Ideas_2024&amp;diff=27956"/>
		<updated>2024-09-15T08:08:04Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Accepted ideas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.osgeo.org/wiki/Google_Summer_of_Code_2024_Ideas The OSGeo GSoC 2024 main page]&lt;br /&gt;
* [https://summerofcode.withgoogle.com/ Official GSoC page at Google]&lt;br /&gt;
&lt;br /&gt;
== Accepted ideas ==&lt;br /&gt;
=== Add JSON output to different GRASS tools in C ===&lt;br /&gt;
* Student: Kriti Birda&lt;br /&gt;
* Mentors: Corey White and Vaclav Petras&lt;br /&gt;
* [[GRASS_GSoC_2024_Add_JSON_output|Wiki page]]&lt;br /&gt;
&lt;br /&gt;
=== Add EODAG support to GRASS GIS ===&lt;br /&gt;
* Student: Hamed Ashraf&lt;br /&gt;
* Mentors: Luca Delucchi, Veronica Andreo, Stefan Blumentrath&lt;br /&gt;
* [[GRASS_GSoC_2024_EODAG_Support|Wiki page]]&lt;br /&gt;
&lt;br /&gt;
=== Parallelization of existing tools in GRASS GIS ===&lt;br /&gt;
* Student: Chung-Yuan Liang&lt;br /&gt;
* Mentors: Huidae Cho, Vaclav Petras, Maris Nartiss&lt;br /&gt;
* [[GRASS_GSoC_2024_Parallelize_Tools|Wiki page]]&lt;br /&gt;
&lt;br /&gt;
=== Improve GRASS user experience in Jupyter Notebook ===&lt;br /&gt;
* Student: Riya&lt;br /&gt;
* Mentors: Anna Petrasova, Corey White&lt;br /&gt;
* [[GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks|Wiki page]]&lt;br /&gt;
&lt;br /&gt;
== Ideas ==&lt;br /&gt;
If you are a student you can suggest a new idea or pick up an existing one. In any case write about it to [https://lists.osgeo.org/listinfo/grass-dev grass-dev mailing list],[https://github.com/OSGeo/grass/discussions GitHub Discussions], or [https://gitter.im/grassgis/community Gitter].&lt;br /&gt;
&lt;br /&gt;
You are invited as well to have a close look at ideas from previous years ([https://trac.osgeo.org/grass/wiki/GSoC/2014 2014], [https://trac.osgeo.org/grass/wiki/GSoC/2015 2015], [https://trac.osgeo.org/grass/wiki/GSoC/2016 2016],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2017 2017],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2018 2018],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2019 2019],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2020 2020],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2021 2021],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2022 2022],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2023 2023])&lt;br /&gt;
which have not yet been implemented.&lt;br /&gt;
You can also look at accepted GRASS GSoC [https://trac.osgeo.org/grass/wiki/GSoC projects from previous years] for an idea of scope.''&lt;br /&gt;
&lt;br /&gt;
Include &amp;quot;GRASS GIS&amp;quot; in the title of our idea to easily distinguish ideas and projects inside OSGeo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Parallelization of existing tools ===&lt;br /&gt;
&lt;br /&gt;
There are several tools that would benefit from parallelization with OpenMP, e.g. r.texture, r.horizon, r.fill.stats, r/v.surf.idw, r.viewshed, v.to.rast, r.grow.distance, v.surf.bspline, ...&lt;br /&gt;
For overview of current state, see [[Raster_Parallelization_with_OpenMP]].&lt;br /&gt;
&lt;br /&gt;
* Requirements: familiarity with C, OpenMP&lt;br /&gt;
* Mentor: Huidae Cho&lt;br /&gt;
* Co-mentor: Vaclav Petras, Anna Petrasova&lt;br /&gt;
* Project length: 175 or 350 hours (take your pick)&lt;br /&gt;
* Rating: medium&lt;br /&gt;
* Expected Outcomes: parallelized module or modules, depending on complexity&lt;br /&gt;
* Test of skills: suggest/implement solution for https://github.com/OSGeo/grass/issues/2644&lt;br /&gt;
&lt;br /&gt;
=== Improve GRASS user experience in Jupyter Notebook ===&lt;br /&gt;
[[File:Jupyter_interactive_viewshed.png|500px|thumb|right|InteractiveMap in grass.jupyter library]]&lt;br /&gt;
Python package [https://grass.osgeo.org/grass-stable/manuals/libpython/grass.jupyter.html grass.jupyter] was developed during [https://trac.osgeo.org/grass/wiki/GSoC/2021/JupyterAndGRASS GSoC 2021] to simplify running GRASS from Jupyter Notebooks and displaying data. This project could focus on adding features such as adding parallelization for rendering, increasing interactivity of displayed data using ipyleaflet (e.g., capture mouse clicks to show information about vector line, pixel), adding API for managing projects and subprojects (i.e., locations/mapsets), simplifing display of attribute data, ...&lt;br /&gt;
&lt;br /&gt;
* Requirements: Python&lt;br /&gt;
* Mentor: Anna Petrasova&lt;br /&gt;
* Co-mentor: Vaclav Petras, Helena Mitasova&lt;br /&gt;
* Project length: 175 or 350 hours (take your pick)&lt;br /&gt;
* Rating: easy to medium&lt;br /&gt;
* Expected Outcomes: improved user experience when using GRASS through notebooks&lt;br /&gt;
* Test of skills: https://github.com/OSGeo/grass/issues/3276, or write a test for [https://github.com/OSGeo/grass/tree/main/python/grass/jupyter grass.jupyter library] using python unittest or pytest, more info [https://grass.osgeo.org/grass-devel/manuals/libpython/gunittest_testing.html here].&lt;br /&gt;
&lt;br /&gt;
=== Add JSON output to different tools in C ===&lt;br /&gt;
There are several tools in GRASS that would benefit from a JSON-formatted output, see [https://github.com/OSGeo/grass/issues/3020 this issue for a list of tools]. Besides adding the JSON output, the work would also include adding tests and basic documentation.&lt;br /&gt;
* Requirements: C, Python for tests&lt;br /&gt;
* Mentor: Vaclav Petras&lt;br /&gt;
* Co-mentor: Anna Petrasova, Corey White&lt;br /&gt;
* Project length: 175 or 350 hours (take your pick)&lt;br /&gt;
* Rating: easy to medium&lt;br /&gt;
* Expected Outcomes: one or more (depending on project length and complexity of the tool) tools with well tested JSON output&lt;br /&gt;
* Test of skills: Address https://github.com/OSGeo/grass/issues/1044 for r.surf.fractal&lt;br /&gt;
&lt;br /&gt;
=== Support writing tests with pytest ===&lt;br /&gt;
&lt;br /&gt;
* The current testing framework, ''[https://grass.osgeo.org/grass-stable/manuals/libpython/gunittest.html grass.gunittest]'', was written before migration to Git/GitHub and when long free runs in 3rd party services were unthinkable. Additionally, some no longer relevant goals were prioritized, such as independence on the current code, detailed custom HTML reports, success tracking over time, and high specialization towards GRASS-specifics.&lt;br /&gt;
* ''grass.gunittest'' is based on Python ''unittest'' package and many projects since then migrated to //pytest//, e.g., GDAL and Numpy. While ''unittest'' is inspired by Java's JUnit, ''pytest'' is designed to support writing small, readable tests, and uses plain `assert` statements instead of many different assert methods.&lt;br /&gt;
* Using ''pytest'' should lead to tests which feel more like Python scripts and to minimum of testing-specific code.&lt;br /&gt;
* An example issue of ''grass.gunittest'' is that it doesn't work well with tests of the main GRASS executable (prominence of `grass ... --exec` is yet another new thing which changed since ''grass.gunittest'' was designed).&lt;br /&gt;
* Two main things needed:&lt;br /&gt;
** Create general comparison functions from the ''grass.gunittest'' assert methods so that they can be used with pytest.&lt;br /&gt;
** Current grass.script.setup.init function and grass.script.core.create_location function don't work well in the context of a pytest test function. More  &lt;br /&gt;
* Additional things needed:&lt;br /&gt;
** Fixture for pytest to set up and tear down a GRASS session in a temporary mapset.&lt;br /&gt;
&lt;br /&gt;
* Requirements: Python&lt;br /&gt;
* Project length: 175 or 350 hours (take your pick)&lt;br /&gt;
* Mentor: Vaclav Petras&lt;br /&gt;
* Co-mentor: Stefan Blumentrath&lt;br /&gt;
* Proposed by: Vaclav Petras&lt;br /&gt;
* Rating: easy to medium&lt;br /&gt;
* Expected Outcomes: Convenient way of writing tests with pytest&lt;br /&gt;
* Test of skills: Fix failing tests and/or write new tests (more is better). Alternatively, addressing a smaller problem in the testing framework is a good task, too.&lt;br /&gt;
&lt;br /&gt;
=== New easy-to-use CLI and API for GRASS GIS ===&lt;br /&gt;
&lt;br /&gt;
* Make running of GRASS GIS modules as easy as it is to run GDAL commands.&lt;br /&gt;
** `grass run r.slope.aspect elevation=elevation.tiff slope=slope.tiff aspect=aspect.tiff`&lt;br /&gt;
** CLI like GDAL has.&lt;br /&gt;
** No GRASS Database, Location, Mapset to deal with.&lt;br /&gt;
** No import, export from user perspective.&lt;br /&gt;
** Reasonable defaults for things like region.&lt;br /&gt;
** CLI and API still allows user to specify any of the above.&lt;br /&gt;
* Idea page with details: wiki:GSoC/2021/EasyToUseCliAndApiIdea&lt;br /&gt;
* Project length: 350 hours&lt;br /&gt;
* Rating: medium&lt;br /&gt;
* Requirements:&lt;br /&gt;
** Language: Python&lt;br /&gt;
** Proposal: Student needs to show sufficient understanding of the GRASS GIS Database structure and significantly extend on text below in terms of more concrete formulation of ideas and identification of missing and existing parts.&lt;br /&gt;
* Mentors: Vaclav Petras&lt;br /&gt;
* Co-mentors: Stefan Blumentrath&lt;br /&gt;
* Proposed by: Vaclav Petras&lt;br /&gt;
* Expected outcomes: New subcommand which easily runs a GRASS module on GeoTiff and GeoPackage.&lt;br /&gt;
* Test and training tasks:&lt;br /&gt;
** Solve one of the tickets linked at the idea page.&lt;br /&gt;
** Add features to `grass` executable interface:&lt;br /&gt;
*** Make it possible to associate `*.gxw` files with `grass` executable (#1204) or at least add `--gui-workspace` or preferably just recognize it in the command line (distinguish it from database/location/mapset).&lt;br /&gt;
** Extend `--exec` functionality:&lt;br /&gt;
*** Add `--region` to set a temporary computational region for the execution, e.g. `--region=&amp;quot;raster=raster_name&amp;quot;`&lt;br /&gt;
*** Add `--import-raster=some/file.tiff` which imports (r.import) a raster file (same for vector and similarly for export).&lt;br /&gt;
*** Add `--link-raster=some/file.tiff` which links (r.external) a raster file (same for vector and similarly for r.external.out).&lt;br /&gt;
&lt;br /&gt;
=== STAC (SpatioTemporal Asset Catalog) Integration ===&lt;br /&gt;
&lt;br /&gt;
Create new import and export capabilities for GRASS GIS which allow users to easily ingest data from STAC catalogs and export locations and mapsets as STAC specs for data discovery within STAC browsers. &lt;br /&gt;
&lt;br /&gt;
* Requirements: familiar with python, STAC specs&lt;br /&gt;
* Mentor: Corey White&lt;br /&gt;
* Co-mentor: Vaclav Petras, Anna Petrasova&lt;br /&gt;
* Project length: 175 or 350 hours (take your pick)&lt;br /&gt;
* Rating: medium&lt;br /&gt;
* Expected Outcomes: completion of t.in.stac and t.out.stac&lt;br /&gt;
* Test of skills:&lt;br /&gt;
** suggest or implement solution for implementing t.out.stac using the prototype STAC spec https://github.com/tomorrownow/grass-stac-extension &lt;br /&gt;
** suggest/implement solution for completing https://github.com/OSGeo/grass-addons/pull/802&lt;br /&gt;
&lt;br /&gt;
=== Add EODAG support to GRASS GIS ===&lt;br /&gt;
&lt;br /&gt;
[https://eodag.readthedocs.io/en/stable/ EODAG] is a Python library useful to download several satellite datasets from different providers (i.e., USGS, Copernicus, AWS, Planetary Computer, etc.). GRASS has various modules to download satellite data like i.sentinel.download, i.landsat.download, i.modis.download. However, they all use different libraries, some of them no longer maintained. Hence, implementing the use of EODAG as back-end for those tools would be very useful not only in terms of maintenance but also in terms of less code repetition. It would also open the possibility for new tools or a master tool to download other datasets directly from GRASS. &lt;br /&gt;
&lt;br /&gt;
* Requirements: familiar with Python&lt;br /&gt;
* Project length: 175 or 350 hours&lt;br /&gt;
* Mentor: Luca Delucchi&lt;br /&gt;
* Co-mentor: Veronica Andreo&lt;br /&gt;
* Proposed by: Luca Delucchi&lt;br /&gt;
* Rating: medium&lt;br /&gt;
* Expected Outcomes:  175 hours EODAG core library to be able to download products; 350 library + application at least to i.sentinel.download but hopefully also to i.landsat.download&lt;br /&gt;
* Test of skills: https://github.com/OSGeo/grass-addons/issues/1033&lt;br /&gt;
&lt;br /&gt;
=== GUI: Add space-time datasets support in Data Catalog ===&lt;br /&gt;
[[File:GUI_data_tab.png|400px|thumb|right|Data catalog]]&lt;br /&gt;
Currently GRASS Data Catalog shows only raster and vector maps. The goal of this project is to add support for space-time datasets. It is mainly space-time raster datasets. In the next phase of the project support for other types of space-time datasets (vector and 3D raster) could be added. Besides displaying space-time datasets in the layer tree, it is also about adding the equivalent functionality currently available for raster and vector layers from the context menu. &lt;br /&gt;
&lt;br /&gt;
* Requirements: familiar with Python&lt;br /&gt;
* Project length: 175 or 350 hours&lt;br /&gt;
* Mentor: Martin Landa&lt;br /&gt;
* Co-mentor: Anna Petrasova&lt;br /&gt;
* Proposed by: Martin Landa&lt;br /&gt;
* Rating: medium&lt;br /&gt;
* Expected Outcomes:  175 hours basic support for space-time raster datasets; 350 extended support also for other space-time datasets types (vector, 3D raster)&lt;br /&gt;
* Test of skills:&lt;br /&gt;
** suggest/implement solution for completing https://github.com/OSGeo/grass/issues/2599&lt;br /&gt;
&lt;br /&gt;
=== Add {your research idea} to GRASS GIS ===&lt;br /&gt;
&lt;br /&gt;
* In general, you can propose any topic, but you can specifically propose integrating your research or research idea into GRASS GIS.&lt;br /&gt;
* Requirements:&lt;br /&gt;
** Language:&lt;br /&gt;
*** Depends on the project, often Python, sometimes C.&lt;br /&gt;
*** Adding your latest ecological analysis &lt;br /&gt;
** Proposal:&lt;br /&gt;
*** Discuss relevance to GRASS GIS.&lt;br /&gt;
*** Describe technical steps needed for integration.&lt;br /&gt;
*** Describe whether it is an addition of a tool (module) or a change in one of the libraries. If it is a tool, specify if it should be included in the core grass repository or in grass-addons repository and why.&lt;br /&gt;
*** Specify what research was done and what needs to be accomplished in order to have usable product at the end of summer.&lt;br /&gt;
*** Specify who will provide the research expertise.&lt;br /&gt;
* Project length: 175 or 350 hours (take your pick)&lt;br /&gt;
* Rating: from low to hard&lt;br /&gt;
* Mentors:&lt;br /&gt;
** GRASS GIS project will provide technical mentors, but it is up to the applicant to ensure the research part is mentored well. An exception may be granted to applicants which can demonstrate that the research is finished or that they have enough expertise themselves.&lt;br /&gt;
** Possible technical mentors: Vaclav Petras, Anna Petrasova&lt;br /&gt;
** Research mentors: Bring in an expert from your field, e.g., your academic advisor or project principal investigator (if needed).&lt;br /&gt;
* Proposed by: Vaclav Petras&lt;br /&gt;
* Expected outcome: Working feature which is integrated and merged at the end of the project.&lt;br /&gt;
* Test and training tasks:&lt;br /&gt;
** Create a test in Python for an existing tool in the grass-addons repository or in the core grass repository.&lt;br /&gt;
&lt;br /&gt;
=== Title of idea ===&lt;br /&gt;
&lt;br /&gt;
Description here&lt;br /&gt;
&lt;br /&gt;
* Requirements:&lt;br /&gt;
* Project length: (175 or 350 hours) &lt;br /&gt;
* Mentor: &lt;br /&gt;
* Proposed by: &lt;br /&gt;
* Rating: &lt;br /&gt;
* Expected Outcomes:  &lt;br /&gt;
* Test of skills: &lt;br /&gt;
* Other:&lt;br /&gt;
&lt;br /&gt;
== Tips for students ==&lt;br /&gt;
&lt;br /&gt;
* If you have your own ideas we encourage you to propose them. Explain them on the [https://lists.osgeo.org/listinfo/grass-dev grass-dev mailing list].&lt;br /&gt;
* If you like some idea here or from previous yeas, write about it on [https://lists.osgeo.org/listinfo/grass-dev grass-dev mailing list] and any ideas of your own which could improve it.&lt;br /&gt;
* Follow some good practices in your ideas and proposals:&lt;br /&gt;
** Stress why the project would be useful.&lt;br /&gt;
** Show that you know how you will proceed. That is, make sure that you can demonstrate that the proposal is feasible in the given time frame.&lt;br /&gt;
** Be specific in the implementation (or at least as specific as you can).&lt;br /&gt;
** Explain what the final product will look like and how it will work. You can add drawings or mock-ups.&lt;br /&gt;
** Explain how the idea relates to existing GRASS GIS functions, features, and needs.&lt;br /&gt;
** Do not include steps such as &amp;quot;install GRASS&amp;quot;, &amp;quot;compile GRASS libraries (on my machine)&amp;quot;, &amp;quot;read about the API&amp;quot;. You should do this before applying to GSoC.&lt;br /&gt;
* Compile GRASS GIS from source and prepare environment for development:&lt;br /&gt;
** Read [https://github.com/OSGeo/grass/blob/main/CONTRIBUTING.md CONTRIBUTING file] and [https://grasswiki.osgeo.org/wiki/Compile_and_Install compilation instructions].&lt;br /&gt;
** If you get stuck with the setup, feel free to consult the [https://lists.osgeo.org/listinfo/grass-user grass-user mailing list].&lt;br /&gt;
** Familiarize yourself with wiki:Submitting rules.&lt;br /&gt;
* Prove your worth by being active on the GRASS mailing lists ([https://lists.osgeo.org/listinfo/grass-user grass-user], [https://lists.osgeo.org/listinfo/grass-dev grass-dev]) or other channels ([https://github.com/OSGeo/grass/discussions GitHub Discussions], [https://gitter.im/grassgis/community Gitter]), fix some [https://github.com/OSGeo/grass/issues bugs], and/or implement some (smaller) features, or write some (simpler) GRASS module, and post it to mailing list. There's no better way to demonstrate your willingness and abilities. Do this before start you apply to GSoC. &lt;br /&gt;
* Also note that fixing existing bugs and/or implementing enhancements will be a part of student evaluation.&lt;br /&gt;
&lt;br /&gt;
* Every year GRASS GIS hopes to participate and participates in GSoC as part of the [https://www.osgeo.org/ OSGeo Foundation]'s GSoC program umbrella. See the official OSGeo template for application details and other important information at the [https://wiki.osgeo.org/wiki/Google_Summer_of_Code_Recommendations_for_Students OSGeo Recommendations for Students].&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27912</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27912"/>
		<updated>2024-08-25T06:58:00Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal discussion with mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || In Progress&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || OK&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
# '''Wrote Report'''&lt;br /&gt;
# '''Started working on custom projections in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;[https://github.com/OSGeo/grass/pull/4204 (PR)]'''&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Organization''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
&lt;br /&gt;
This project has successfully improved the user experience of &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;Jupyter Notebook&amp;lt;/code&amp;gt;. Significant enhancements have been made to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. The new features, such as the ''Query Button'', ''View/Update Computational Region Button'', and ''Draw Geometries Button'', have streamlined data querying, visualization, and editing processes. Introducing the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; has reduced redundancy, and parallelization has substantially improved performance. Benchmark results show notable speed improvements, making &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; more efficient and user-friendly. These advancements contribute to a more seamless and productive experience for users.&lt;br /&gt;
&lt;br /&gt;
I appreciate the support and opportunity to contribute to GRASS GIS this summer. Thanks to my mentors and the GRASS Development Team for their guidance. Anna Petrasova's contributions were pivotal to the project's success, and I'm grateful for her support. Looking forward to contributing more.&lt;br /&gt;
&lt;br /&gt;
=== Future Work ===&lt;br /&gt;
# [https://github.com/OSGeo/grass/pull/3793#discussion_r1644111142 Improve the distance used in Query Button functionality].&lt;br /&gt;
# Use [https://ipyleaflet.readthedocs.io/en/latest/controls/geoman_draw_control.html &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt;] in the Draw Button functionality.&lt;br /&gt;
# Enhanced connectivity with Pandas will enable users to display data with a single command.&lt;br /&gt;
# Large, high-resolution image display will be enabled by implementing tiling techniques, reducing memory consumption and enabling smooth rendering of large images.&lt;br /&gt;
# Implementing a graphical user interface (GUI) for tool presentation within Jupyter Notebooks would simplify usability and enhance user experience, facilitating smoother workflows within the platform.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
Pull requests related to &amp;lt;code&amp;gt;grass.jupyter&amp;lt;/code&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Pull Request&lt;br /&gt;
! Status&lt;br /&gt;
|-&lt;br /&gt;
| Create BaseSeriesMap to remove redundancies in SeriesMap and TimeSeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3468 3468]&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:#8256d0&amp;quot;&amp;gt;Merged&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Add Query Button to InteractiveMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3793 3793]&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:#8256d0&amp;quot;&amp;gt;Merged&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Allow Users to view/update computational region&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3838 3838]&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:#8256d0&amp;quot;&amp;gt;Merged&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Allow users to draw simple geometries and save it as vector&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4003 4003]&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:#8256d0&amp;quot;&amp;gt;Merged&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Add Parallelization to TimeSeriesMap and SeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4097 4097]&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:#8256d0&amp;quot;&amp;gt;Merged&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Use &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; with custom projections&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4204 4204]&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:#008000&amp;quot;&amp;gt;Open&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Add documentation of InteractiveMap Features and Parallelization in jupyter_tutorial.ipynb&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4164 4164]&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:#8256d0&amp;quot;&amp;gt;Merged&amp;lt;/span&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Modify Descriptions&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4159 4159]&lt;br /&gt;
| &amp;lt;span style=&amp;quot;color:#8256d0&amp;quot;&amp;gt;Merged&amp;lt;/span&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some additional links:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| OSGeo Wiki Page&lt;br /&gt;
| [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks Improve User Experience in Jupyter Notebooks]&lt;br /&gt;
|-&lt;br /&gt;
| Github Fork&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/tree/main GitHub Fork]&lt;br /&gt;
|-&lt;br /&gt;
| Example&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb &amp;lt;code&amp;gt;jupyter_tutorial&amp;lt;/code&amp;gt;]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Images ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass draw and query.png|thumb|width=385px|height=300px|alt=Draw and Query Functioning|Draw and Query]]&lt;br /&gt;
| [[File:Grass update region before.png|thumb|width=385px|height=300px|alt=Shows the original computational region|Original Computational Region]]&lt;br /&gt;
| [[File:Grass_update_region_after.png|thumb|width=385px|height=300px|alt=Shows the modified computational region|Modified Computational Region]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass geometries.png|thumb|alt=Picture showing the various draw controls of the Draw Button|Shows the various draw controls of the Draw Button]]&lt;br /&gt;
| [[File:Grass seriesmap.png|thumb|alt=Displays benchmark on SeriesMap|Benchmark on SeriesMap]]&lt;br /&gt;
| [[File:Grass timeseriesmap.png|thumb|alt=Displays benchmark on TimeSeriesMap|Benchmark on TimeSeriesMap]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Media ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass update region gif.gif|thumb|alt=GIF showing the function of update region button|GIF showing the function of update region button]]&lt;br /&gt;
| [[File:Grass gif draw.gif|thumb|alt=GIF showing the working of the Draw Button|Working of the Draw Button]]&lt;br /&gt;
| [[File:Grass gif query.gif|thumb|alt=GIF showing the working of the Query Button|Working of the Query Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; text-align:center; vertical-align:top;&amp;quot; | [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27911</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27911"/>
		<updated>2024-08-25T06:52:40Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Timeline */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal discussion with mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || In Progress&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || OK&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
# '''Wrote Report'''&lt;br /&gt;
# '''Started working on custom projections in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;[https://github.com/OSGeo/grass/pull/4204 (PR)]'''&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Organization''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
&lt;br /&gt;
This project has successfully improved the user experience of &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;Jupyter Notebook&amp;lt;/code&amp;gt;. Significant enhancements have been made to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. The new features, such as the ''Query Button'', ''View/Update Computational Region Button'', and ''Draw Geometries Button'', have streamlined data querying, visualization, and editing processes. Introducing the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; has reduced redundancy, and parallelization has substantially improved performance. Benchmark results show notable speed improvements, making &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; more efficient and user-friendly. These advancements contribute to a more seamless and productive experience for users.&lt;br /&gt;
&lt;br /&gt;
I appreciate the support and opportunity to contribute to GRASS GIS this summer. Thanks to my mentors and the GRASS Development Team for their guidance. Anna Petrasova's contributions were pivotal to the project's success, and I'm grateful for her support. Looking forward to contributing more.&lt;br /&gt;
&lt;br /&gt;
=== Future Work ===&lt;br /&gt;
# [https://github.com/OSGeo/grass/pull/3793#discussion_r1644111142 Improve the distance used in Query Button functionality].&lt;br /&gt;
# Use [https://ipyleaflet.readthedocs.io/en/latest/controls/geoman_draw_control.html &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt;] in the Draw Button functionality.&lt;br /&gt;
# Enhanced connectivity with Pandas will enable users to display data with a single command.&lt;br /&gt;
# Large, high-resolution image display will be enabled by implementing tiling techniques, reducing memory consumption and enabling smooth rendering of large images.&lt;br /&gt;
# Implementing a graphical user interface (GUI) for tool presentation within Jupyter Notebooks would simplify usability and enhance user experience, facilitating smoother workflows within the platform.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
Pull requests related to &amp;lt;code&amp;gt;grass.jupyter&amp;lt;/code&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Pull Request&lt;br /&gt;
|-&lt;br /&gt;
| Create BaseSeriesMap to remove redundancies in SeriesMap and TimeSeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3468 3468]&lt;br /&gt;
|-&lt;br /&gt;
| Add Query Button to InteractiveMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3793 3793]&lt;br /&gt;
|-&lt;br /&gt;
| Allow Users to view/update computational region&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3838 3838]&lt;br /&gt;
|-&lt;br /&gt;
| Allow users to draw simple geometries and save it as vector&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4003 4003]&lt;br /&gt;
|-&lt;br /&gt;
| Add Parallelization to TimeSeriesMap and SeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4097 4097]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Use &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; with custom projections&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4204 4204]&lt;br /&gt;
|-&lt;br /&gt;
| Add documentation of InteractiveMap Features and Parallelization in jupyter_tutorial.ipynb&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4164 4164]&lt;br /&gt;
|-&lt;br /&gt;
| Modify Descriptions&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4159 4159]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some additional links:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| OSGeo Wiki Page&lt;br /&gt;
| [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks Improve User Experience in Jupyter Notebooks]&lt;br /&gt;
|-&lt;br /&gt;
| Github Fork&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/tree/main GitHub Fork]&lt;br /&gt;
|-&lt;br /&gt;
| Example&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb &amp;lt;code&amp;gt;jupyter_tutorial&amp;lt;/code&amp;gt;]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Images ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass draw and query.png|thumb|width=385px|height=300px|alt=Draw and Query Functioning|Draw and Query]]&lt;br /&gt;
| [[File:Grass update region before.png|thumb|width=385px|height=300px|alt=Shows the original computational region|Original Computational Region]]&lt;br /&gt;
| [[File:Grass_update_region_after.png|thumb|width=385px|height=300px|alt=Shows the modified computational region|Modified Computational Region]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass geometries.png|thumb|alt=Picture showing the various draw controls of the Draw Button|Shows the various draw controls of the Draw Button]]&lt;br /&gt;
| [[File:Grass seriesmap.png|thumb|alt=Displays benchmark on SeriesMap|Benchmark on SeriesMap]]&lt;br /&gt;
| [[File:Grass timeseriesmap.png|thumb|alt=Displays benchmark on TimeSeriesMap|Benchmark on TimeSeriesMap]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Media ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass update region gif.gif|thumb|alt=GIF showing the function of update region button|GIF showing the function of update region button]]&lt;br /&gt;
| [[File:Grass gif draw.gif|thumb|alt=GIF showing the working of the Draw Button|Working of the Draw Button]]&lt;br /&gt;
| [[File:Grass gif query.gif|thumb|alt=GIF showing the working of the Query Button|Working of the Query Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; text-align:center; vertical-align:top;&amp;quot; | [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27910</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27910"/>
		<updated>2024-08-25T06:11:25Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Final Report */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal discussion with mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || Ongoing&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
# '''Wrote Report'''&lt;br /&gt;
# '''Started working on custom projections in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;[https://github.com/OSGeo/grass/pull/4204 (PR)]'''&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Organization''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
&lt;br /&gt;
This project has successfully improved the user experience of &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;Jupyter Notebook&amp;lt;/code&amp;gt;. Significant enhancements have been made to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. The new features, such as the ''Query Button'', ''View/Update Computational Region Button'', and ''Draw Geometries Button'', have streamlined data querying, visualization, and editing processes. Introducing the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; has reduced redundancy, and parallelization has substantially improved performance. Benchmark results show notable speed improvements, making &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; more efficient and user-friendly. These advancements contribute to a more seamless and productive experience for users.&lt;br /&gt;
&lt;br /&gt;
I appreciate the support and opportunity to contribute to GRASS GIS this summer. Thanks to my mentors and the GRASS Development Team for their guidance. Anna Petrasova's contributions were pivotal to the project's success, and I'm grateful for her support. Looking forward to contributing more.&lt;br /&gt;
&lt;br /&gt;
=== Future Work ===&lt;br /&gt;
# [https://github.com/OSGeo/grass/pull/3793#discussion_r1644111142 Improve the distance used in Query Button functionality].&lt;br /&gt;
# Use [https://ipyleaflet.readthedocs.io/en/latest/controls/geoman_draw_control.html &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt;] in the Draw Button functionality.&lt;br /&gt;
# Enhanced connectivity with Pandas will enable users to display data with a single command.&lt;br /&gt;
# Large, high-resolution image display will be enabled by implementing tiling techniques, reducing memory consumption and enabling smooth rendering of large images.&lt;br /&gt;
# Implementing a graphical user interface (GUI) for tool presentation within Jupyter Notebooks would simplify usability and enhance user experience, facilitating smoother workflows within the platform.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
Pull requests related to &amp;lt;code&amp;gt;grass.jupyter&amp;lt;/code&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Pull Request&lt;br /&gt;
|-&lt;br /&gt;
| Create BaseSeriesMap to remove redundancies in SeriesMap and TimeSeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3468 3468]&lt;br /&gt;
|-&lt;br /&gt;
| Add Query Button to InteractiveMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3793 3793]&lt;br /&gt;
|-&lt;br /&gt;
| Allow Users to view/update computational region&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3838 3838]&lt;br /&gt;
|-&lt;br /&gt;
| Allow users to draw simple geometries and save it as vector&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4003 4003]&lt;br /&gt;
|-&lt;br /&gt;
| Add Parallelization to TimeSeriesMap and SeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4097 4097]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Use &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; with custom projections&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4204 4204]&lt;br /&gt;
|-&lt;br /&gt;
| Add documentation of InteractiveMap Features and Parallelization in jupyter_tutorial.ipynb&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4164 4164]&lt;br /&gt;
|-&lt;br /&gt;
| Modify Descriptions&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4159 4159]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some additional links:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| OSGeo Wiki Page&lt;br /&gt;
| [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks Improve User Experience in Jupyter Notebooks]&lt;br /&gt;
|-&lt;br /&gt;
| Github Fork&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/tree/main GitHub Fork]&lt;br /&gt;
|-&lt;br /&gt;
| Example&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb &amp;lt;code&amp;gt;jupyter_tutorial&amp;lt;/code&amp;gt;]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Images ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass draw and query.png|thumb|width=385px|height=300px|alt=Draw and Query Functioning|Draw and Query]]&lt;br /&gt;
| [[File:Grass update region before.png|thumb|width=385px|height=300px|alt=Shows the original computational region|Original Computational Region]]&lt;br /&gt;
| [[File:Grass_update_region_after.png|thumb|width=385px|height=300px|alt=Shows the modified computational region|Modified Computational Region]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass geometries.png|thumb|alt=Picture showing the various draw controls of the Draw Button|Shows the various draw controls of the Draw Button]]&lt;br /&gt;
| [[File:Grass seriesmap.png|thumb|alt=Displays benchmark on SeriesMap|Benchmark on SeriesMap]]&lt;br /&gt;
| [[File:Grass timeseriesmap.png|thumb|alt=Displays benchmark on TimeSeriesMap|Benchmark on TimeSeriesMap]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Media ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass update region gif.gif|thumb|alt=GIF showing the function of update region button|GIF showing the function of update region button]]&lt;br /&gt;
| [[File:Grass gif draw.gif|thumb|alt=GIF showing the working of the Draw Button|Working of the Draw Button]]&lt;br /&gt;
| [[File:Grass gif query.gif|thumb|alt=GIF showing the working of the Query Button|Working of the Query Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; text-align:center; vertical-align:top;&amp;quot; | [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27909</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27909"/>
		<updated>2024-08-24T17:12:59Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal discussion with mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || Ongoing&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
# '''Wrote Report'''&lt;br /&gt;
# '''Started working on custom projections in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;[https://github.com/OSGeo/grass/pull/4204 (PR)]'''&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
&lt;br /&gt;
This project has successfully improved the user experience of &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;Jupyter Notebook&amp;lt;/code&amp;gt;. Significant enhancements have been made to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. The new features, such as the ''Query Button'', ''View/Update Computational Region Button'', and ''Draw Geometries Button'', have streamlined data querying, visualization, and editing processes. Introducing the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; has reduced redundancy, and parallelization has substantially improved performance. Benchmark results show notable speed improvements, making &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; more efficient and user-friendly. These advancements contribute to a more seamless and productive experience for users.&lt;br /&gt;
&lt;br /&gt;
I appreciate the support and opportunity to contribute to GRASS GIS this summer. Thanks to my mentors and the GRASS Development Team for their guidance. Anna Petrasova's contributions were pivotal to the project's success, and I'm grateful for her support. Looking forward to contributing more.&lt;br /&gt;
&lt;br /&gt;
=== Future Work ===&lt;br /&gt;
# [https://github.com/OSGeo/grass/pull/3793#discussion_r1644111142 Improve the distance used in Query Button functionality].&lt;br /&gt;
# Use [https://ipyleaflet.readthedocs.io/en/latest/controls/geoman_draw_control.html &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt;] in the Draw Button functionality.&lt;br /&gt;
# Enhanced connectivity with Pandas will enable users to display data with a single command.&lt;br /&gt;
# Large, high-resolution image display will be enabled by implementing tiling techniques, reducing memory consumption and enabling smooth rendering of large images.&lt;br /&gt;
# Implementing a graphical user interface (GUI) for tool presentation within Jupyter Notebooks would simplify usability and enhance user experience, facilitating smoother workflows within the platform.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
Pull requests related to &amp;lt;code&amp;gt;grass.jupyter&amp;lt;/code&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Pull Request&lt;br /&gt;
|-&lt;br /&gt;
| Create BaseSeriesMap to remove redundancies in SeriesMap and TimeSeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3468 3468]&lt;br /&gt;
|-&lt;br /&gt;
| Add Query Button to InteractiveMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3793 3793]&lt;br /&gt;
|-&lt;br /&gt;
| Allow Users to view/update computational region&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3838 3838]&lt;br /&gt;
|-&lt;br /&gt;
| Allow users to draw simple geometries and save it as vector&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4003 4003]&lt;br /&gt;
|-&lt;br /&gt;
| Add Parallelization to TimeSeriesMap and SeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4097 4097]&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| Use &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; with custom projections&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4204 4204]&lt;br /&gt;
|-&lt;br /&gt;
| Add documentation of InteractiveMap Features and Parallelization in jupyter_tutorial.ipynb&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4164 4164]&lt;br /&gt;
|-&lt;br /&gt;
| Modify Descriptions&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4159 4159]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some additional links:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| OSGeo Wiki Page&lt;br /&gt;
| [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks Improve User Experience in Jupyter Notebooks]&lt;br /&gt;
|-&lt;br /&gt;
| Github Fork&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/tree/main GitHub Fork]&lt;br /&gt;
|-&lt;br /&gt;
| Example&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb &amp;lt;code&amp;gt;jupyter_tutorial&amp;lt;/code&amp;gt;]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Images ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass draw and query.png|thumb|width=385px|height=300px|alt=Draw and Query Functioning|Draw and Query]]&lt;br /&gt;
| [[File:Grass update region before.png|thumb|width=385px|height=300px|alt=Shows the original computational region|Original Computational Region]]&lt;br /&gt;
| [[File:Grass_update_region_after.png|thumb|width=385px|height=300px|alt=Shows the modified computational region|Modified Computational Region]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass geometries.png|thumb|alt=Picture showing the various draw controls of the Draw Button|Shows the various draw controls of the Draw Button]]&lt;br /&gt;
| [[File:Grass seriesmap.png|thumb|alt=Displays benchmark on SeriesMap|Benchmark on SeriesMap]]&lt;br /&gt;
| [[File:Grass timeseriesmap.png|thumb|alt=Displays benchmark on TimeSeriesMap|Benchmark on TimeSeriesMap]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Media ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass update region gif.gif|thumb|alt=GIF showing the function of update region button|GIF showing the function of update region button]]&lt;br /&gt;
| [[File:Grass gif draw.gif|thumb|alt=GIF showing the working of the Draw Button|Working of the Draw Button]]&lt;br /&gt;
| [[File:Grass gif query.gif|thumb|alt=GIF showing the working of the Query Button|Working of the Query Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; text-align:center; vertical-align:top;&amp;quot; | [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27908</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27908"/>
		<updated>2024-08-24T16:55:32Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Future Work */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal discussion with mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || Ongoing&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
# '''Wrote Report'''&lt;br /&gt;
# '''Started working on custom projections in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;[https://github.com/OSGeo/grass/pull/4204 (PR)]'''&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
&lt;br /&gt;
This project has successfully improved the user experience of &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;Jupyter Notebook&amp;lt;/code&amp;gt;. Significant enhancements have been made to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. The new features, such as the ''Query Button'', ''View/Update Computational Region Button'', and ''Draw Geometries Button'', have streamlined data querying, visualization, and editing processes. Introducing the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; has reduced redundancy, and parallelization has substantially improved performance. Benchmark results show notable speed improvements, making &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; more efficient and user-friendly. These advancements contribute to a more seamless and productive experience for users.&lt;br /&gt;
&lt;br /&gt;
I appreciate the support and opportunity to contribute to GRASS GIS this summer. Thanks to my mentors and the GRASS Development Team for their guidance. Anna Petrasova's contributions were pivotal to the project's success, and I'm grateful for her support. Looking forward to contributing more.&lt;br /&gt;
&lt;br /&gt;
=== Future Work ===&lt;br /&gt;
# [https://github.com/OSGeo/grass/pull/3793#discussion_r1644111142 Improve the distance used in Query Button functionality].&lt;br /&gt;
# Use [https://ipyleaflet.readthedocs.io/en/latest/controls/geoman_draw_control.html &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt;] in the Draw Button functionality.&lt;br /&gt;
# Enhanced connectivity with Pandas will enable users to display data with a single command.&lt;br /&gt;
# Large, high-resolution image display will be enabled by implementing tiling techniques, reducing memory consumption and enabling smooth rendering of large images.&lt;br /&gt;
# Implementing a graphical user interface (GUI) for tool presentation within Jupyter Notebooks would simplify usability and enhance user experience, facilitating smoother workflows within the platform.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
Pull requests related to &amp;lt;code&amp;gt;grass.jupyter&amp;lt;/code&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Pull Request&lt;br /&gt;
|-&lt;br /&gt;
| Create BaseSeriesMap to remove redundancies in SeriesMap and TimeSeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3468 3468]&lt;br /&gt;
|-&lt;br /&gt;
| Add Query Button to InteractiveMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3793 3793]&lt;br /&gt;
|-&lt;br /&gt;
| Allow Users to view/update computational region&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3838 3838]&lt;br /&gt;
|-&lt;br /&gt;
| Allow users to draw simple geometries and save it as vector&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4003 4003]&lt;br /&gt;
|-&lt;br /&gt;
| Add Parallelization to TimeSeriesMap and SeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4097 4097]&lt;br /&gt;
|-&lt;br /&gt;
| Add documentation of InteractiveMap Features and Parallelization in jupyter_tutorial.ipynb&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4164 4164]&lt;br /&gt;
|-&lt;br /&gt;
| Modify Descriptions&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4159 4159]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some additional links:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| OSGeo Wiki Page&lt;br /&gt;
| [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks Improve User Experience in Jupyter Notebooks]&lt;br /&gt;
|-&lt;br /&gt;
| Github Fork&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/tree/main GitHub Fork]&lt;br /&gt;
|-&lt;br /&gt;
| Example&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb &amp;lt;code&amp;gt;jupyter_tutorial&amp;lt;/code&amp;gt;]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Images ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass draw and query.png|thumb|width=385px|height=300px|alt=Draw and Query Functioning|Draw and Query]]&lt;br /&gt;
| [[File:Grass update region before.png|thumb|width=385px|height=300px|alt=Shows the original computational region|Original Computational Region]]&lt;br /&gt;
| [[File:Grass_update_region_after.png|thumb|width=385px|height=300px|alt=Shows the modified computational region|Modified Computational Region]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass geometries.png|thumb|alt=Picture showing the various draw controls of the Draw Button|Shows the various draw controls of the Draw Button]]&lt;br /&gt;
| [[File:Grass seriesmap.png|thumb|alt=Displays benchmark on SeriesMap|Benchmark on SeriesMap]]&lt;br /&gt;
| [[File:Grass timeseriesmap.png|thumb|alt=Displays benchmark on TimeSeriesMap|Benchmark on TimeSeriesMap]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Media ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass update region gif.gif|thumb|alt=GIF showing the function of update region button|GIF showing the function of update region button]]&lt;br /&gt;
| [[File:Grass gif draw.gif|thumb|alt=GIF showing the working of the Draw Button|Working of the Draw Button]]&lt;br /&gt;
| [[File:Grass gif query.gif|thumb|alt=GIF showing the working of the Query Button|Working of the Query Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; text-align:center; vertical-align:top;&amp;quot; | [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27907</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27907"/>
		<updated>2024-08-24T16:52:49Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Timeline */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal discussion with mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || Ongoing&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
# '''Wrote Report'''&lt;br /&gt;
# '''Started working on custom projections in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;[https://github.com/OSGeo/grass/pull/4204 (PR)]'''&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
&lt;br /&gt;
This project has successfully improved the user experience of &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;Jupyter Notebook&amp;lt;/code&amp;gt;. Significant enhancements have been made to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. The new features, such as the ''Query Button'', ''View/Update Computational Region Button'', and ''Draw Geometries Button'', have streamlined data querying, visualization, and editing processes. Introducing the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; has reduced redundancy, and parallelization has substantially improved performance. Benchmark results show notable speed improvements, making &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; more efficient and user-friendly. These advancements contribute to a more seamless and productive experience for users.&lt;br /&gt;
&lt;br /&gt;
I appreciate the support and opportunity to contribute to GRASS GIS this summer. Thanks to my mentors and the GRASS Development Team for their guidance. Anna Petrasova's contributions were pivotal to the project's success, and I'm grateful for her support. Looking forward to contributing more.&lt;br /&gt;
&lt;br /&gt;
=== Future Work ===&lt;br /&gt;
# [https://github.com/OSGeo/grass/pull/3793#discussion_r1644111142 Improve the distance used in Query Button functionality].&lt;br /&gt;
# Use [https://ipyleaflet.readthedocs.io/en/latest/controls/geoman_draw_control.html &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt;] in the Draw Button functionality.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
Pull requests related to &amp;lt;code&amp;gt;grass.jupyter&amp;lt;/code&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Pull Request&lt;br /&gt;
|-&lt;br /&gt;
| Create BaseSeriesMap to remove redundancies in SeriesMap and TimeSeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3468 3468]&lt;br /&gt;
|-&lt;br /&gt;
| Add Query Button to InteractiveMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3793 3793]&lt;br /&gt;
|-&lt;br /&gt;
| Allow Users to view/update computational region&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3838 3838]&lt;br /&gt;
|-&lt;br /&gt;
| Allow users to draw simple geometries and save it as vector&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4003 4003]&lt;br /&gt;
|-&lt;br /&gt;
| Add Parallelization to TimeSeriesMap and SeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4097 4097]&lt;br /&gt;
|-&lt;br /&gt;
| Add documentation of InteractiveMap Features and Parallelization in jupyter_tutorial.ipynb&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4164 4164]&lt;br /&gt;
|-&lt;br /&gt;
| Modify Descriptions&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4159 4159]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some additional links:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| OSGeo Wiki Page&lt;br /&gt;
| [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks Improve User Experience in Jupyter Notebooks]&lt;br /&gt;
|-&lt;br /&gt;
| Github Fork&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/tree/main GitHub Fork]&lt;br /&gt;
|-&lt;br /&gt;
| Example&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb &amp;lt;code&amp;gt;jupyter_tutorial&amp;lt;/code&amp;gt;]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Images ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass draw and query.png|thumb|width=385px|height=300px|alt=Draw and Query Functioning|Draw and Query]]&lt;br /&gt;
| [[File:Grass update region before.png|thumb|width=385px|height=300px|alt=Shows the original computational region|Original Computational Region]]&lt;br /&gt;
| [[File:Grass_update_region_after.png|thumb|width=385px|height=300px|alt=Shows the modified computational region|Modified Computational Region]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass geometries.png|thumb|alt=Picture showing the various draw controls of the Draw Button|Shows the various draw controls of the Draw Button]]&lt;br /&gt;
| [[File:Grass seriesmap.png|thumb|alt=Displays benchmark on SeriesMap|Benchmark on SeriesMap]]&lt;br /&gt;
| [[File:Grass timeseriesmap.png|thumb|alt=Displays benchmark on TimeSeriesMap|Benchmark on TimeSeriesMap]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Media ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass update region gif.gif|thumb|alt=GIF showing the function of update region button|GIF showing the function of update region button]]&lt;br /&gt;
| [[File:Grass gif draw.gif|thumb|alt=GIF showing the working of the Draw Button|Working of the Draw Button]]&lt;br /&gt;
| [[File:Grass gif query.gif|thumb|alt=GIF showing the working of the Query Button|Working of the Query Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; text-align:center; vertical-align:top;&amp;quot; | [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27906</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27906"/>
		<updated>2024-08-24T16:49:29Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Week-12 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal discussion with mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || Postponed&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
# '''Wrote Report'''&lt;br /&gt;
# '''Started working on custom projections in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;[https://github.com/OSGeo/grass/pull/4204 (PR)]'''&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
&lt;br /&gt;
This project has successfully improved the user experience of &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;Jupyter Notebook&amp;lt;/code&amp;gt;. Significant enhancements have been made to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. The new features, such as the ''Query Button'', ''View/Update Computational Region Button'', and ''Draw Geometries Button'', have streamlined data querying, visualization, and editing processes. Introducing the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; has reduced redundancy, and parallelization has substantially improved performance. Benchmark results show notable speed improvements, making &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; more efficient and user-friendly. These advancements contribute to a more seamless and productive experience for users.&lt;br /&gt;
&lt;br /&gt;
I appreciate the support and opportunity to contribute to GRASS GIS this summer. Thanks to my mentors and the GRASS Development Team for their guidance. Anna Petrasova's contributions were pivotal to the project's success, and I'm grateful for her support. Looking forward to contributing more.&lt;br /&gt;
&lt;br /&gt;
=== Future Work ===&lt;br /&gt;
# [https://github.com/OSGeo/grass/pull/3793#discussion_r1644111142 Improve the distance used in Query Button functionality].&lt;br /&gt;
# Use [https://ipyleaflet.readthedocs.io/en/latest/controls/geoman_draw_control.html &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt;] in the Draw Button functionality.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
Pull requests related to &amp;lt;code&amp;gt;grass.jupyter&amp;lt;/code&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Pull Request&lt;br /&gt;
|-&lt;br /&gt;
| Create BaseSeriesMap to remove redundancies in SeriesMap and TimeSeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3468 3468]&lt;br /&gt;
|-&lt;br /&gt;
| Add Query Button to InteractiveMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3793 3793]&lt;br /&gt;
|-&lt;br /&gt;
| Allow Users to view/update computational region&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3838 3838]&lt;br /&gt;
|-&lt;br /&gt;
| Allow users to draw simple geometries and save it as vector&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4003 4003]&lt;br /&gt;
|-&lt;br /&gt;
| Add Parallelization to TimeSeriesMap and SeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4097 4097]&lt;br /&gt;
|-&lt;br /&gt;
| Add documentation of InteractiveMap Features and Parallelization in jupyter_tutorial.ipynb&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4164 4164]&lt;br /&gt;
|-&lt;br /&gt;
| Modify Descriptions&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4159 4159]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some additional links:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| OSGeo Wiki Page&lt;br /&gt;
| [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks Improve User Experience in Jupyter Notebooks]&lt;br /&gt;
|-&lt;br /&gt;
| Github Fork&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/tree/main GitHub Fork]&lt;br /&gt;
|-&lt;br /&gt;
| Example&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb &amp;lt;code&amp;gt;jupyter_tutorial&amp;lt;/code&amp;gt;]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Images ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass draw and query.png|thumb|width=385px|height=300px|alt=Draw and Query Functioning|Draw and Query]]&lt;br /&gt;
| [[File:Grass update region before.png|thumb|width=385px|height=300px|alt=Shows the original computational region|Original Computational Region]]&lt;br /&gt;
| [[File:Grass_update_region_after.png|thumb|width=385px|height=300px|alt=Shows the modified computational region|Modified Computational Region]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass geometries.png|thumb|alt=Picture showing the various draw controls of the Draw Button|Shows the various draw controls of the Draw Button]]&lt;br /&gt;
| [[File:Grass seriesmap.png|thumb|alt=Displays benchmark on SeriesMap|Benchmark on SeriesMap]]&lt;br /&gt;
| [[File:Grass timeseriesmap.png|thumb|alt=Displays benchmark on TimeSeriesMap|Benchmark on TimeSeriesMap]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Media ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass update region gif.gif|thumb|alt=GIF showing the function of update region button|GIF showing the function of update region button]]&lt;br /&gt;
| [[File:Grass gif draw.gif|thumb|alt=GIF showing the working of the Draw Button|Working of the Draw Button]]&lt;br /&gt;
| [[File:Grass gif query.gif|thumb|alt=GIF showing the working of the Query Button|Working of the Query Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; text-align:center; vertical-align:top;&amp;quot; | [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27905</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27905"/>
		<updated>2024-08-24T16:21:14Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Week-12 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal discussion with mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || Postponed&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
# '''Wrote Report'''.&lt;br /&gt;
# '''Started working on [https://github.com/OSGeo/grass/pull/4204 custom projections in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;]'''.&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
&lt;br /&gt;
This project has successfully improved the user experience of &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;Jupyter Notebook&amp;lt;/code&amp;gt;. Significant enhancements have been made to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. The new features, such as the ''Query Button'', ''View/Update Computational Region Button'', and ''Draw Geometries Button'', have streamlined data querying, visualization, and editing processes. Introducing the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; has reduced redundancy, and parallelization has substantially improved performance. Benchmark results show notable speed improvements, making &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; more efficient and user-friendly. These advancements contribute to a more seamless and productive experience for users.&lt;br /&gt;
&lt;br /&gt;
I appreciate the support and opportunity to contribute to GRASS GIS this summer. Thanks to my mentors and the GRASS Development Team for their guidance. Anna Petrasova's contributions were pivotal to the project's success, and I'm grateful for her support. Looking forward to contributing more.&lt;br /&gt;
&lt;br /&gt;
=== Future Work ===&lt;br /&gt;
# [https://github.com/OSGeo/grass/pull/3793#discussion_r1644111142 Improve the distance used in Query Button functionality].&lt;br /&gt;
# Use [https://ipyleaflet.readthedocs.io/en/latest/controls/geoman_draw_control.html &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt;] in the Draw Button functionality.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
Pull requests related to &amp;lt;code&amp;gt;grass.jupyter&amp;lt;/code&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Pull Request&lt;br /&gt;
|-&lt;br /&gt;
| Create BaseSeriesMap to remove redundancies in SeriesMap and TimeSeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3468 3468]&lt;br /&gt;
|-&lt;br /&gt;
| Add Query Button to InteractiveMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3793 3793]&lt;br /&gt;
|-&lt;br /&gt;
| Allow Users to view/update computational region&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3838 3838]&lt;br /&gt;
|-&lt;br /&gt;
| Allow users to draw simple geometries and save it as vector&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4003 4003]&lt;br /&gt;
|-&lt;br /&gt;
| Add Parallelization to TimeSeriesMap and SeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4097 4097]&lt;br /&gt;
|-&lt;br /&gt;
| Add documentation of InteractiveMap Features and Parallelization in jupyter_tutorial.ipynb&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4164 4164]&lt;br /&gt;
|-&lt;br /&gt;
| Modify Descriptions&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4159 4159]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some additional links:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| OSGeo Wiki Page&lt;br /&gt;
| [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks Improve User Experience in Jupyter Notebooks]&lt;br /&gt;
|-&lt;br /&gt;
| Github Fork&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/tree/main GitHub Fork]&lt;br /&gt;
|-&lt;br /&gt;
| Example&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb &amp;lt;code&amp;gt;jupyter_tutorial&amp;lt;/code&amp;gt;]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Images ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass draw and query.png|thumb|width=385px|height=300px|alt=Draw and Query Functioning|Draw and Query]]&lt;br /&gt;
| [[File:Grass update region before.png|thumb|width=385px|height=300px|alt=Shows the original computational region|Original Computational Region]]&lt;br /&gt;
| [[File:Grass_update_region_after.png|thumb|width=385px|height=300px|alt=Shows the modified computational region|Modified Computational Region]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass geometries.png|thumb|alt=Picture showing the various draw controls of the Draw Button|Shows the various draw controls of the Draw Button]]&lt;br /&gt;
| [[File:Grass seriesmap.png|thumb|alt=Displays benchmark on SeriesMap|Benchmark on SeriesMap]]&lt;br /&gt;
| [[File:Grass timeseriesmap.png|thumb|alt=Displays benchmark on TimeSeriesMap|Benchmark on TimeSeriesMap]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Media ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass update region gif.gif|thumb|alt=GIF showing the function of update region button|GIF showing the function of update region button]]&lt;br /&gt;
| [[File:Grass gif draw.gif|thumb|alt=GIF showing the working of the Draw Button|Working of the Draw Button]]&lt;br /&gt;
| [[File:Grass gif query.gif|thumb|alt=GIF showing the working of the Query Button|Working of the Query Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; text-align:center; vertical-align:top;&amp;quot; | [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27904</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27904"/>
		<updated>2024-08-24T16:18:04Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Week-12 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal discussion with mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || Postponed&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
# Wrote Report.&lt;br /&gt;
# Started working on custom projections in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
&lt;br /&gt;
This project has successfully improved the user experience of &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;Jupyter Notebook&amp;lt;/code&amp;gt;. Significant enhancements have been made to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. The new features, such as the ''Query Button'', ''View/Update Computational Region Button'', and ''Draw Geometries Button'', have streamlined data querying, visualization, and editing processes. Introducing the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; has reduced redundancy, and parallelization has substantially improved performance. Benchmark results show notable speed improvements, making &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; more efficient and user-friendly. These advancements contribute to a more seamless and productive experience for users.&lt;br /&gt;
&lt;br /&gt;
I appreciate the support and opportunity to contribute to GRASS GIS this summer. Thanks to my mentors and the GRASS Development Team for their guidance. Anna Petrasova's contributions were pivotal to the project's success, and I'm grateful for her support. Looking forward to contributing more.&lt;br /&gt;
&lt;br /&gt;
=== Future Work ===&lt;br /&gt;
# [https://github.com/OSGeo/grass/pull/3793#discussion_r1644111142 Improve the distance used in Query Button functionality].&lt;br /&gt;
# Use [https://ipyleaflet.readthedocs.io/en/latest/controls/geoman_draw_control.html &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt;] in the Draw Button functionality.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
Pull requests related to &amp;lt;code&amp;gt;grass.jupyter&amp;lt;/code&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Pull Request&lt;br /&gt;
|-&lt;br /&gt;
| Create BaseSeriesMap to remove redundancies in SeriesMap and TimeSeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3468 3468]&lt;br /&gt;
|-&lt;br /&gt;
| Add Query Button to InteractiveMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3793 3793]&lt;br /&gt;
|-&lt;br /&gt;
| Allow Users to view/update computational region&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3838 3838]&lt;br /&gt;
|-&lt;br /&gt;
| Allow users to draw simple geometries and save it as vector&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4003 4003]&lt;br /&gt;
|-&lt;br /&gt;
| Add Parallelization to TimeSeriesMap and SeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4097 4097]&lt;br /&gt;
|-&lt;br /&gt;
| Add documentation of InteractiveMap Features and Parallelization in jupyter_tutorial.ipynb&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4164 4164]&lt;br /&gt;
|-&lt;br /&gt;
| Modify Descriptions&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4159 4159]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some additional links:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| OSGeo Wiki Page&lt;br /&gt;
| [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks Improve User Experience in Jupyter Notebooks]&lt;br /&gt;
|-&lt;br /&gt;
| Github Fork&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/tree/main GitHub Fork]&lt;br /&gt;
|-&lt;br /&gt;
| Example&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb &amp;lt;code&amp;gt;jupyter_tutorial&amp;lt;/code&amp;gt;]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Images ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass draw and query.png|thumb|width=385px|height=300px|alt=Draw and Query Functioning|Draw and Query]]&lt;br /&gt;
| [[File:Grass update region before.png|thumb|width=385px|height=300px|alt=Shows the original computational region|Original Computational Region]]&lt;br /&gt;
| [[File:Grass_update_region_after.png|thumb|width=385px|height=300px|alt=Shows the modified computational region|Modified Computational Region]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass geometries.png|thumb|alt=Picture showing the various draw controls of the Draw Button|Shows the various draw controls of the Draw Button]]&lt;br /&gt;
| [[File:Grass seriesmap.png|thumb|alt=Displays benchmark on SeriesMap|Benchmark on SeriesMap]]&lt;br /&gt;
| [[File:Grass timeseriesmap.png|thumb|alt=Displays benchmark on TimeSeriesMap|Benchmark on TimeSeriesMap]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Media ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass update region gif.gif|thumb|alt=GIF showing the function of update region button|GIF showing the function of update region button]]&lt;br /&gt;
| [[File:Grass gif draw.gif|thumb|alt=GIF showing the working of the Draw Button|Working of the Draw Button]]&lt;br /&gt;
| [[File:Grass gif query.gif|thumb|alt=GIF showing the working of the Query Button|Working of the Query Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; text-align:center; vertical-align:top;&amp;quot; | [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27835</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27835"/>
		<updated>2024-08-19T13:34:23Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Working of grass.jupyter.InteractiveMap() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal discussion with mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || Postponed&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
&lt;br /&gt;
This project has successfully improved the user experience of &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;Jupyter Notebook&amp;lt;/code&amp;gt;. Significant enhancements have been made to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. The new features, such as the ''Query Button'', ''View/Update Computational Region Button'', and ''Draw Geometries Button'', have streamlined data querying, visualization, and editing processes. Introducing the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; has reduced redundancy, and parallelization has substantially improved performance. Benchmark results show notable speed improvements, making &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; more efficient and user-friendly. These advancements contribute to a more seamless and productive experience for users.&lt;br /&gt;
&lt;br /&gt;
I appreciate the support and opportunity to contribute to GRASS GIS this summer. Thanks to my mentors and the GRASS Development Team for their guidance. Anna Petrasova's contributions were pivotal to the project's success, and I'm grateful for her support. Looking forward to contributing more.&lt;br /&gt;
&lt;br /&gt;
=== Future Work ===&lt;br /&gt;
# [https://github.com/OSGeo/grass/pull/3793#discussion_r1644111142 Improve the distance used in Query Button functionality].&lt;br /&gt;
# Use [https://ipyleaflet.readthedocs.io/en/latest/controls/geoman_draw_control.html &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt;] in the Draw Button functionality.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
Pull requests related to &amp;lt;code&amp;gt;grass.jupyter&amp;lt;/code&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Pull Request&lt;br /&gt;
|-&lt;br /&gt;
| Create BaseSeriesMap to remove redundancies in SeriesMap and TimeSeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3468 3468]&lt;br /&gt;
|-&lt;br /&gt;
| Add Query Button to InteractiveMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3793 3793]&lt;br /&gt;
|-&lt;br /&gt;
| Allow Users to view/update computational region&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3838 3838]&lt;br /&gt;
|-&lt;br /&gt;
| Allow users to draw simple geometries and save it as vector&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4003 4003]&lt;br /&gt;
|-&lt;br /&gt;
| Add Parallelization to TimeSeriesMap and SeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4097 4097]&lt;br /&gt;
|-&lt;br /&gt;
| Add documentation of InteractiveMap Features and Parallelization in jupyter_tutorial.ipynb&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4164 4164]&lt;br /&gt;
|-&lt;br /&gt;
| Modify Descriptions&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4159 4159]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some additional links:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| OSGeo Wiki Page&lt;br /&gt;
| [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks Improve User Experience in Jupyter Notebooks]&lt;br /&gt;
|-&lt;br /&gt;
| Github Fork&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/tree/main GitHub Fork]&lt;br /&gt;
|-&lt;br /&gt;
| Example&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb &amp;lt;code&amp;gt;jupyter_tutorial&amp;lt;/code&amp;gt;]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Images ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass draw and query.png|thumb|width=385px|height=300px|alt=Draw and Query Functioning|Draw and Query]]&lt;br /&gt;
| [[File:Grass update region before.png|thumb|width=385px|height=300px|alt=Shows the original computational region|Original Computational Region]]&lt;br /&gt;
| [[File:Grass_update_region_after.png|thumb|width=385px|height=300px|alt=Shows the modified computational region|Modified Computational Region]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass geometries.png|thumb|alt=Picture showing the various draw controls of the Draw Button|Shows the various draw controls of the Draw Button]]&lt;br /&gt;
| [[File:Grass seriesmap.png|thumb|alt=Displays benchmark on SeriesMap|Benchmark on SeriesMap]]&lt;br /&gt;
| [[File:Grass timeseriesmap.png|thumb|alt=Displays benchmark on TimeSeriesMap|Benchmark on TimeSeriesMap]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Media ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass update region gif.gif|thumb|alt=GIF showing the function of update region button|GIF showing the function of update region button]]&lt;br /&gt;
| [[File:Grass gif draw.gif|thumb|alt=GIF showing the working of the Draw Button|Working of the Draw Button]]&lt;br /&gt;
| [[File:Grass gif query.gif|thumb|alt=GIF showing the working of the Query Button|Working of the Query Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; text-align:center; vertical-align:top;&amp;quot; | [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27834</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27834"/>
		<updated>2024-08-19T13:27:54Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Final Report */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal discussion with mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || Postponed&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
&lt;br /&gt;
This project has successfully improved the user experience of &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;Jupyter Notebook&amp;lt;/code&amp;gt;. Significant enhancements have been made to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. The new features, such as the ''Query Button'', ''View/Update Computational Region Button'', and ''Draw Geometries Button'', have streamlined data querying, visualization, and editing processes. Introducing the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; has reduced redundancy, and parallelization has substantially improved performance. Benchmark results show notable speed improvements, making &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; more efficient and user-friendly. These advancements contribute to a more seamless and productive experience for users.&lt;br /&gt;
&lt;br /&gt;
I appreciate the support and opportunity to contribute to GRASS GIS this summer. Thanks to my mentors and the GRASS Development Team for their guidance. Anna Petrasova's contributions were pivotal to the project's success, and I'm grateful for her support. Looking forward to contributing more.&lt;br /&gt;
&lt;br /&gt;
=== Future Work ===&lt;br /&gt;
# [https://github.com/OSGeo/grass/pull/3793#discussion_r1644111142 Improve the distance used in Query Button functionality].&lt;br /&gt;
# Use [https://ipyleaflet.readthedocs.io/en/latest/controls/geoman_draw_control.html &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt;] in the Draw Button functionality.&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
Pull requests related to &amp;lt;code&amp;gt;grass.jupyter&amp;lt;/code&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Pull Request&lt;br /&gt;
|-&lt;br /&gt;
| Create BaseSeriesMap to remove redundancies in SeriesMap and TimeSeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3468 3468]&lt;br /&gt;
|-&lt;br /&gt;
| Add Query Button to InteractiveMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3793 3793]&lt;br /&gt;
|-&lt;br /&gt;
| Allow Users to view/update computational region&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/3838 3838]&lt;br /&gt;
|-&lt;br /&gt;
| Allow users to draw simple geometries and save it as vector&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4003 4003]&lt;br /&gt;
|-&lt;br /&gt;
| Add Parallelization to TimeSeriesMap and SeriesMap&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4097 4097]&lt;br /&gt;
|-&lt;br /&gt;
| Add documentation of InteractiveMap Features and Parallelization in jupyter_tutorial.ipynb&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4164 4164]&lt;br /&gt;
|-&lt;br /&gt;
| Modify Descriptions&lt;br /&gt;
| [https://github.com/OSGeo/grass/pull/4159 4159]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Some additional links:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ttile&lt;br /&gt;
! Link&lt;br /&gt;
|-&lt;br /&gt;
| OSGeo Wiki Page&lt;br /&gt;
| [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks Improve User Experience in Jupyter Notebooks]&lt;br /&gt;
|-&lt;br /&gt;
| Github Fork&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/tree/main GitHub Fork]&lt;br /&gt;
|-&lt;br /&gt;
| Example&lt;br /&gt;
| [https://github.com/29riyasaxena/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb &amp;lt;code&amp;gt;jupyter_tutorial&amp;lt;/code&amp;gt;]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Working of grass.jupyter.InteractiveMap() ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass draw and query.png|thumb|width=385px|height=300px|alt=Draw and Query Functioning|Draw and Query]]&lt;br /&gt;
| [[File:Grass update region before.png|thumb|width=385px|height=300px|alt=Shows the original computational region|Original Computational Region]]&lt;br /&gt;
| [[File:Grass_update_region_after.png|thumb|width=385px|height=300px|alt=Shows the modified computational region|Modified Computational Region]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass geometries.png|thumb|alt=Picture showing the various draw controls of the Draw Button|Shows the various draw controls of the Draw Button]]&lt;br /&gt;
| [[File:Grass seriesmap.png|thumb|alt=Displays benchmark on SeriesMap|Benchmark on SeriesMap]]&lt;br /&gt;
| [[File:Grass timeseriesmap.png|thumb|alt=Displays benchmark on TimeSeriesMap|Benchmark on TimeSeriesMap]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass update region gif.gif|thumb|alt=GIF showing the function of update region button|GIF showing the function of update region button]]&lt;br /&gt;
| [[File:Grass gif draw.gif|thumb|alt=GIF showing the working of the Draw Button|Working of the Draw Button]]&lt;br /&gt;
| [[File:Grass gif query.gif|thumb|alt=GIF showing the working of the Query Button|Working of the Query Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; text-align:center; vertical-align:top;&amp;quot; | [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27833</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27833"/>
		<updated>2024-08-19T06:30:24Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Future Work */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal discussion with mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || Postponed&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
&lt;br /&gt;
This project has successfully improved the user experience of &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;Jupyter Notebook&amp;lt;/code&amp;gt;. Significant enhancements have been made to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. The new features, such as the ''Query Button'', ''View/Update Computational Region Button'', and ''Draw Geometries Button'', have streamlined data querying, visualization, and editing processes. Introducing the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; has reduced redundancy, and parallelization has substantially improved performance. Benchmark results show notable speed improvements, making &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; more efficient and user-friendly. These advancements contribute to a more seamless and productive experience for users.&lt;br /&gt;
&lt;br /&gt;
I appreciate the support and opportunity to contribute to GRASS GIS this summer. Thanks to my mentors and the GRASS Development Team for their guidance. Anna Petrasova's contributions were pivotal to the project's success, and I'm grateful for her support. Looking forward to contributing more.&lt;br /&gt;
&lt;br /&gt;
=== Future Work ===&lt;br /&gt;
# [https://github.com/OSGeo/grass/pull/3793#discussion_r1644111142 Improve the distance used in Query Button functionality].&lt;br /&gt;
# Use [https://ipyleaflet.readthedocs.io/en/latest/controls/geoman_draw_control.html &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt;] in the Draw Button functionality.&lt;br /&gt;
&lt;br /&gt;
== Working of grass.jupyter.InteractiveMap() ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass draw and query.png|thumb|width=385px|height=300px|alt=Draw and Query Functioning|Draw and Query]]&lt;br /&gt;
| [[File:Grass update region before.png|thumb|width=385px|height=300px|alt=Shows the original computational region|Original Computational Region]]&lt;br /&gt;
| [[File:Grass_update_region_after.png|thumb|width=385px|height=300px|alt=Shows the modified computational region|Modified Computational Region]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass geometries.png|thumb|alt=Picture showing the various draw controls of the Draw Button|Shows the various draw controls of the Draw Button]]&lt;br /&gt;
| [[File:Grass seriesmap.png|thumb|alt=Displays benchmark on SeriesMap|Benchmark on SeriesMap]]&lt;br /&gt;
| [[File:Grass timeseriesmap.png|thumb|alt=Displays benchmark on TimeSeriesMap|Benchmark on TimeSeriesMap]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass update region gif.gif|thumb|alt=GIF showing the function of update region button|GIF showing the function of update region button]]&lt;br /&gt;
| [[File:Grass gif draw.gif|thumb|alt=GIF showing the working of the Draw Button|Working of the Draw Button]]&lt;br /&gt;
| [[File:Grass gif query.gif|thumb|alt=GIF showing the working of the Query Button|Working of the Query Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; text-align:center; vertical-align:top;&amp;quot; | [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27832</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27832"/>
		<updated>2024-08-19T06:30:04Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Conclusion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal discussion with mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || Postponed&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conclusion ===&lt;br /&gt;
&lt;br /&gt;
This project has successfully improved the user experience of &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;Jupyter Notebook&amp;lt;/code&amp;gt;. Significant enhancements have been made to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. The new features, such as the ''Query Button'', ''View/Update Computational Region Button'', and ''Draw Geometries Button'', have streamlined data querying, visualization, and editing processes. Introducing the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; has reduced redundancy, and parallelization has substantially improved performance. Benchmark results show notable speed improvements, making &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; more efficient and user-friendly. These advancements contribute to a more seamless and productive experience for users.&lt;br /&gt;
&lt;br /&gt;
I appreciate the support and opportunity to contribute to GRASS GIS this summer. Thanks to my mentors and the GRASS Development Team for their guidance. Anna Petrasova's contributions were pivotal to the project's success, and I'm grateful for her support. Looking forward to contributing more.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
# [https://github.com/OSGeo/grass/pull/3793#discussion_r1644111142 Improve the distance used in Query Button functionality].&lt;br /&gt;
# Use [https://ipyleaflet.readthedocs.io/en/latest/controls/geoman_draw_control.html &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt;] in the Draw Button functionality.&lt;br /&gt;
&lt;br /&gt;
== Working of grass.jupyter.InteractiveMap() ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass draw and query.png|thumb|width=385px|height=300px|alt=Draw and Query Functioning|Draw and Query]]&lt;br /&gt;
| [[File:Grass update region before.png|thumb|width=385px|height=300px|alt=Shows the original computational region|Original Computational Region]]&lt;br /&gt;
| [[File:Grass_update_region_after.png|thumb|width=385px|height=300px|alt=Shows the modified computational region|Modified Computational Region]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass geometries.png|thumb|alt=Picture showing the various draw controls of the Draw Button|Shows the various draw controls of the Draw Button]]&lt;br /&gt;
| [[File:Grass seriesmap.png|thumb|alt=Displays benchmark on SeriesMap|Benchmark on SeriesMap]]&lt;br /&gt;
| [[File:Grass timeseriesmap.png|thumb|alt=Displays benchmark on TimeSeriesMap|Benchmark on TimeSeriesMap]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass update region gif.gif|thumb|alt=GIF showing the function of update region button|GIF showing the function of update region button]]&lt;br /&gt;
| [[File:Grass gif draw.gif|thumb|alt=GIF showing the working of the Draw Button|Working of the Draw Button]]&lt;br /&gt;
| [[File:Grass gif query.gif|thumb|alt=GIF showing the working of the Query Button|Working of the Query Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; text-align:center; vertical-align:top;&amp;quot; | [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27831</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27831"/>
		<updated>2024-08-19T06:28:30Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Future Work */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal discussion with mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || Postponed&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
This project has successfully improved the user experience of &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;Jupyter Notebook&amp;lt;/code&amp;gt;. Significant enhancements have been made to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. The new features, such as the ''Query Button'', ''View/Update Computational Region Button'', and ''Draw Geometries Button'', have streamlined data querying, visualization, and editing processes. Introducing the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; has reduced redundancy, and parallelization has substantially improved performance. Benchmark results show notable speed improvements, making &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; more efficient and user-friendly. These advancements contribute to a more seamless and productive experience for users.&lt;br /&gt;
&lt;br /&gt;
I appreciate the support and opportunity to contribute to GRASS GIS this summer. Thanks to my mentors and the GRASS Development Team for their guidance. Anna Petrasova's contributions were pivotal to the project's success, and I'm grateful for her support. Looking forward to contributing more.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
# [https://github.com/OSGeo/grass/pull/3793#discussion_r1644111142 Improve the distance used in Query Button functionality].&lt;br /&gt;
# Use [https://ipyleaflet.readthedocs.io/en/latest/controls/geoman_draw_control.html &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt;] in the Draw Button functionality.&lt;br /&gt;
&lt;br /&gt;
== Working of grass.jupyter.InteractiveMap() ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass draw and query.png|thumb|width=385px|height=300px|alt=Draw and Query Functioning|Draw and Query]]&lt;br /&gt;
| [[File:Grass update region before.png|thumb|width=385px|height=300px|alt=Shows the original computational region|Original Computational Region]]&lt;br /&gt;
| [[File:Grass_update_region_after.png|thumb|width=385px|height=300px|alt=Shows the modified computational region|Modified Computational Region]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass geometries.png|thumb|alt=Picture showing the various draw controls of the Draw Button|Shows the various draw controls of the Draw Button]]&lt;br /&gt;
| [[File:Grass seriesmap.png|thumb|alt=Displays benchmark on SeriesMap|Benchmark on SeriesMap]]&lt;br /&gt;
| [[File:Grass timeseriesmap.png|thumb|alt=Displays benchmark on TimeSeriesMap|Benchmark on TimeSeriesMap]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass update region gif.gif|thumb|alt=GIF showing the function of update region button|GIF showing the function of update region button]]&lt;br /&gt;
| [[File:Grass gif draw.gif|thumb|alt=GIF showing the working of the Draw Button|Working of the Draw Button]]&lt;br /&gt;
| [[File:Grass gif query.gif|thumb|alt=GIF showing the working of the Query Button|Working of the Query Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; text-align:center; vertical-align:top;&amp;quot; | [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27830</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27830"/>
		<updated>2024-08-19T06:16:14Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Working of grass.jupyter.InteractiveMap() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal discussion with mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || Postponed&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
This project has successfully improved the user experience of &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;Jupyter Notebook&amp;lt;/code&amp;gt;. Significant enhancements have been made to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. The new features, such as the ''Query Button'', ''View/Update Computational Region Button'', and ''Draw Geometries Button'', have streamlined data querying, visualization, and editing processes. Introducing the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; has reduced redundancy, and parallelization has substantially improved performance. Benchmark results show notable speed improvements, making &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; more efficient and user-friendly. These advancements contribute to a more seamless and productive experience for users.&lt;br /&gt;
&lt;br /&gt;
I appreciate the support and opportunity to contribute to GRASS GIS this summer. Thanks to my mentors and the GRASS Development Team for their guidance. Anna Petrasova's contributions were pivotal to the project's success, and I'm grateful for her support. Looking forward to contributing more.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Working of grass.jupyter.InteractiveMap() ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass draw and query.png|thumb|width=385px|height=300px|alt=Draw and Query Functioning|Draw and Query]]&lt;br /&gt;
| [[File:Grass update region before.png|thumb|width=385px|height=300px|alt=Shows the original computational region|Original Computational Region]]&lt;br /&gt;
| [[File:Grass_update_region_after.png|thumb|width=385px|height=300px|alt=Shows the modified computational region|Modified Computational Region]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass geometries.png|thumb|alt=Picture showing the various draw controls of the Draw Button|Shows the various draw controls of the Draw Button]]&lt;br /&gt;
| [[File:Grass seriesmap.png|thumb|alt=Displays benchmark on SeriesMap|Benchmark on SeriesMap]]&lt;br /&gt;
| [[File:Grass timeseriesmap.png|thumb|alt=Displays benchmark on TimeSeriesMap|Benchmark on TimeSeriesMap]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass update region gif.gif|thumb|alt=GIF showing the function of update region button|GIF showing the function of update region button]]&lt;br /&gt;
| [[File:Grass gif draw.gif|thumb|alt=GIF showing the working of the Draw Button|Working of the Draw Button]]&lt;br /&gt;
| [[File:Grass gif query.gif|thumb|alt=GIF showing the working of the Query Button|Working of the Query Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; text-align:center; vertical-align:top;&amp;quot; | [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=File:Grass_geometries.png&amp;diff=27829</id>
		<title>File:Grass geometries.png</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=File:Grass_geometries.png&amp;diff=27829"/>
		<updated>2024-08-19T05:59:50Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Picture showing the various draw controls of the Draw Button&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=File:Grass_gif_draw.gif&amp;diff=27828</id>
		<title>File:Grass gif draw.gif</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=File:Grass_gif_draw.gif&amp;diff=27828"/>
		<updated>2024-08-19T05:58:17Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;GIF showing the working of the Draw Button&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=File:Grass_gif_query.gif&amp;diff=27827</id>
		<title>File:Grass gif query.gif</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=File:Grass_gif_query.gif&amp;diff=27827"/>
		<updated>2024-08-19T05:55:16Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;GIF showing the working of the Query Button&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27824</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27824"/>
		<updated>2024-08-16T11:37:51Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Working of grass.jupyter.InteractiveMap() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal discussion with mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || Postponed&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
This project has successfully improved the user experience of &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;Jupyter Notebook&amp;lt;/code&amp;gt;. Significant enhancements have been made to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. The new features, such as the ''Query Button'', ''View/Update Computational Region Button'', and ''Draw Geometries Button'', have streamlined data querying, visualization, and editing processes. Introducing the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; has reduced redundancy, and parallelization has substantially improved performance. Benchmark results show notable speed improvements, making &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; more efficient and user-friendly. These advancements contribute to a more seamless and productive experience for users.&lt;br /&gt;
&lt;br /&gt;
I appreciate the support and opportunity to contribute to GRASS GIS this summer. Thanks to my mentors and the GRASS Development Team for their guidance. Anna Petrasova's contributions were pivotal to the project's success, and I'm grateful for her support. Looking forward to contributing more.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Working of grass.jupyter.InteractiveMap() ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass draw and query.png|thumb|width=385px|height=300px|alt=Draw and Query Functioning|Draw and Query]]&lt;br /&gt;
| [[File:Grass update region before.png|thumb|width=385px|height=300px|alt=Shows the original computational region|Original Computational Region]]&lt;br /&gt;
| [[File:Grass_update_region_after.png|thumb|width=385px|height=300px|alt=Shows the modified computational region|Modified Computational Region]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%; text-align: center;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[File:Grass update region gif.gif|thumb|alt=GIF showing the function of update region button|GIF showing the function of update region button]]&lt;br /&gt;
| [[File:Grass seriesmap.png|thumb|alt=Displays benchmark on SeriesMap|Benchmark on SeriesMap]]&lt;br /&gt;
| [[File:Grass timeseriesmap.png|thumb|alt=Displays benchmark on TimeSeriesMap|Benchmark on TimeSeriesMap]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; text-align:center; vertical-align:top;&amp;quot; | [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=File:Grass_timeseriesmap.png&amp;diff=27823</id>
		<title>File:Grass timeseriesmap.png</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=File:Grass_timeseriesmap.png&amp;diff=27823"/>
		<updated>2024-08-16T11:26:34Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Displays benchmark on TimeSeriesMap&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=File:Grass_seriesmap.png&amp;diff=27822</id>
		<title>File:Grass seriesmap.png</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=File:Grass_seriesmap.png&amp;diff=27822"/>
		<updated>2024-08-16T11:24:09Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Displays benchmark on SeriesMap&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27821</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27821"/>
		<updated>2024-08-15T18:13:49Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Final Report */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal discussion with mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || Postponed&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
This project has successfully improved the user experience of &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;Jupyter Notebook&amp;lt;/code&amp;gt;. Significant enhancements have been made to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. The new features, such as the ''Query Button'', ''View/Update Computational Region Button'', and ''Draw Geometries Button'', have streamlined data querying, visualization, and editing processes. Introducing the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; has reduced redundancy, and parallelization has substantially improved performance. Benchmark results show notable speed improvements, making &amp;lt;code&amp;gt;GRASS GIS&amp;lt;/code&amp;gt; more efficient and user-friendly. These advancements contribute to a more seamless and productive experience for users.&lt;br /&gt;
&lt;br /&gt;
I appreciate the support and opportunity to contribute to GRASS GIS this summer. Thanks to my mentors and the GRASS Development Team for their guidance. Anna Petrasova's contributions were pivotal to the project's success, and I'm grateful for her support. Looking forward to contributing more.&lt;br /&gt;
&lt;br /&gt;
== Future Work ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Working of grass.jupyter.InteractiveMap() ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; text-align:center; vertical-align:top;&amp;quot; | [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;385px&amp;quot; heights=&amp;quot;300px&amp;quot; perrow=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
File:Grass draw and query.png|alt=Draw and Query Functioning|Draw and Query&lt;br /&gt;
File:Grass update region before.png|alt=Shows the original computational region|Original Computational Region&lt;br /&gt;
File:Grass_update_region_after.png|alt=Shows the modified computational region|Modified Computational Region&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Grass update region gif.gif|thumb|text-align:center|alt=GIF showing the function of update region button|GIF showing the function of update region button]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27820</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27820"/>
		<updated>2024-08-15T17:24:43Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Working of grass.jupyter.InteractiveMap() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal discussion with mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || Postponed&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Working of grass.jupyter.InteractiveMap() ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; text-align:center; vertical-align:top;&amp;quot; | [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
| style=&amp;quot;width:30%; vertical-align:top;&amp;quot; | [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery widths=&amp;quot;385px&amp;quot; heights=&amp;quot;300px&amp;quot; perrow=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
File:Grass draw and query.png|alt=Draw and Query Functioning|Draw and Query&lt;br /&gt;
File:Grass update region before.png|alt=Shows the original computational region|Original Computational Region&lt;br /&gt;
File:Grass_update_region_after.png|alt=Shows the modified computational region|Modified Computational Region&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Grass update region gif.gif|thumb|text-align:center|alt=GIF showing the function of update region button|GIF showing the function of update region button]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=File:Grass_update_region_after.png&amp;diff=27819</id>
		<title>File:Grass update region after.png</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=File:Grass_update_region_after.png&amp;diff=27819"/>
		<updated>2024-08-15T16:59:16Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Shows the updated computational region&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=File:Grass_update_region_before.png&amp;diff=27818</id>
		<title>File:Grass update region before.png</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=File:Grass_update_region_before.png&amp;diff=27818"/>
		<updated>2024-08-15T16:57:12Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Shows the original computational region&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=File:Grass_update_region_gif.gif&amp;diff=27817</id>
		<title>File:Grass update region gif.gif</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=File:Grass_update_region_gif.gif&amp;diff=27817"/>
		<updated>2024-08-15T16:27:35Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A GIF showing the working of update region function.&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=File:Grass_draw_and_query.png&amp;diff=27816</id>
		<title>File:Grass draw and query.png</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=File:Grass_draw_and_query.png&amp;diff=27816"/>
		<updated>2024-08-15T16:07:01Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It displays the results of querying on a drawn vector.&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27813</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27813"/>
		<updated>2024-08-14T08:02:48Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Timeline */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1 - May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal discussion with mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || Postponed&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || &amp;lt;s&amp;gt;Working on a selected stretch goal&amp;lt;/s&amp;gt; Worked on Handling Toggle Buttons || OK&lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Working of grass.jupyter.InteractiveMap() ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:30%;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:30%; text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:30%;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27812</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27812"/>
		<updated>2024-08-14T07:59:25Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Final Report */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1- May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal Discussion with Mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || Working on a selected stretch goal || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || Working on a selected stretch goal &lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;. Below is an example of how to reproduce this benchmark:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
cores_range = range(1, 13)&lt;br /&gt;
benchmark_results = {}&lt;br /&gt;
for cores in cores_range:&lt;br /&gt;
    gs.run_command(&amp;quot;g.gisenv&amp;quot;, set=f&amp;quot;NPROCS={cores}&amp;quot;)&lt;br /&gt;
    start_time = time.time()&lt;br /&gt;
    series = gj.SeriesMap(height=500)&lt;br /&gt;
    series.add_rasters([&amp;quot;elevation&amp;quot;, &amp;quot;elevation_shade&amp;quot;, &amp;quot;slope&amp;quot;])&lt;br /&gt;
    series.add_vectors([&amp;quot;streams&amp;quot;, &amp;quot;streets&amp;quot;, &amp;quot;viewpoints&amp;quot;])&lt;br /&gt;
    series.d_vect(map=&amp;quot;streets&amp;quot;)&lt;br /&gt;
    series.d_barscale()&lt;br /&gt;
    series.show()  # Create Slider&lt;br /&gt;
    end_time = time.time()&lt;br /&gt;
    elapsed_time = end_time - start_time&lt;br /&gt;
    benchmark_results[cores] = elapsed_time&lt;br /&gt;
    print(f&amp;quot;Cores: {cores}, Time: {elapsed_time:.2f} seconds&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Working of grass.jupyter.InteractiveMap() ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:30%;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:30%; text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:30%;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27811</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27811"/>
		<updated>2024-08-14T07:51:04Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Working */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1- May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal Discussion with Mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || Working on a selected stretch goal || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || Working on a selected stretch goal &lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap:&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Working of grass.jupyter.InteractiveMap() ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:30%;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:30%; text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:30%;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27810</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27810"/>
		<updated>2024-08-14T07:42:00Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Working */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1- May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal Discussion with Mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || Working on a selected stretch goal || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || Working on a selected stretch goal &lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap:&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Working ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:30%;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:30%; text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left; width:30%;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27809</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27809"/>
		<updated>2024-08-14T07:34:08Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Working */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1- May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal Discussion with Mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || Working on a selected stretch goal || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || Working on a selected stretch goal &lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap:&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Working ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:left;&amp;quot;&amp;gt; &lt;br /&gt;
[[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
&amp;lt;/div&amp;gt; &lt;br /&gt;
[[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
[[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27808</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27808"/>
		<updated>2024-08-14T07:16:03Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Working */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1- May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal Discussion with Mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || Working on a selected stretch goal || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || Working on a selected stretch goal &lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap:&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Working ==&lt;br /&gt;
[[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button|Working of Draw Geometries Button]]&lt;br /&gt;
[[File:Grass query.mp4|thumb|alt=Working of Query Button|Working of Query Button]]&lt;br /&gt;
[[File:Grass view update region.mp4|thumb|alt=View/Update Region Button Working|Working of View/Update Region Button]]&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=File:Grass_view_update_region.mp4&amp;diff=27807</id>
		<title>File:Grass view update region.mp4</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=File:Grass_view_update_region.mp4&amp;diff=27807"/>
		<updated>2024-08-14T07:12:54Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Working of view/update region button&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27806</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27806"/>
		<updated>2024-08-14T07:05:28Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* The state of integration AFTER GSoC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1- May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal Discussion with Mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || Working on a selected stretch goal || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || Working on a selected stretch goal &lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Removal of redundancy in the &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;''': A new class, &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt;, has been added to serve as a parent class to both &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;. This enhancement reduces redundancy and streamlines the codebase.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap:&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Working ==&lt;br /&gt;
[[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button]]&lt;br /&gt;
[[File:Grass query.mp4|thumb|alt=Working of Query Button]]&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27805</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27805"/>
		<updated>2024-08-14T06:25:23Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* The state of integration AFTER GSoC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1- May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal Discussion with Mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || Working on a selected stretch goal || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || Working on a selected stretch goal &lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap:&amp;lt;/code&amp;gt;'''&lt;br /&gt;
#:*'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;:''' The following tables present the performance results obtained using 1-12 cores, as tested on the examples in &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/temporal.ipynb temporal.ipynb]&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/blob/main/doc/notebooks/jupyter_tutorial.ipynb jupyter_tutorial.ipynb]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;1&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;2&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;3&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;4&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;5&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;6&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;7&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;8&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;9&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;10&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;11&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;12&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;Time (sec)&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Working ==&lt;br /&gt;
[[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button]]&lt;br /&gt;
[[File:Grass query.mp4|thumb|alt=Working of Query Button]]&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27804</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27804"/>
		<updated>2024-08-14T06:09:49Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* The state of integration AFTER GSoC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1- May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal Discussion with Mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || Working on a selected stretch goal || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || Working on a selected stretch goal &lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close.&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap:&amp;lt;/code&amp;gt;'''&lt;br /&gt;
##'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;''' &lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - TimeSeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Time&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;53.42 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;26.24 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.99 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;18.50 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.08 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;6&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.04 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;7&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;17.68 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;8&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;15.75 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;9&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;16.00 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.12 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;11&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.22 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;14.76 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
## '''Benchmark for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&amp;lt;table class=&amp;quot;wikitable&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;caption&amp;gt;Performance Results - SeriesMap&amp;lt;/caption&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Cores&amp;lt;/th&amp;gt;&lt;br /&gt;
        &amp;lt;th&amp;gt;Time&amp;lt;/th&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4.88 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;2.47 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;3&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.58 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;4&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.67 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;5&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.74 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;6&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.73 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;7&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.68 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;8&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;9&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.65 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;10&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.64 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;11&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.62 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;12&amp;lt;/td&amp;gt;&lt;br /&gt;
        &amp;lt;td&amp;gt;1.61 seconds&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Working ==&lt;br /&gt;
[[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button]]&lt;br /&gt;
[[File:Grass query.mp4|thumb|alt=Working of Query Button]]&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27803</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27803"/>
		<updated>2024-08-13T17:31:24Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* The state of integration AFTER GSoC */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1- May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal Discussion with Mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || Working on a selected stretch goal || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || Working on a selected stretch goal &lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done. [[File:Grass query.mp4|thumb|alt=Working of Query Button]]&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close. [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button]]&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap:&amp;lt;/code&amp;gt;'''&lt;br /&gt;
'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Performance Results&lt;br /&gt;
! Cores !! Time&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 53.42 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 26.24 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 18.99 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 18.50 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 15.08 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 14.04 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 17.68 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 15.75 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 16.00 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 14.12 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 11 || 14.22 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 14.76 seconds&lt;br /&gt;
|}&lt;br /&gt;
'''Benchmark for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Performance Results&lt;br /&gt;
! Cores !! Time&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 4.88 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 2.47 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 1.58 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1.67 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 1.74 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1.73 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1.68 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 1.64 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 1.65 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 1.64 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 11 || 1.62 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 1.61 seconds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27802</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27802"/>
		<updated>2024-08-13T17:30:01Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Final Report */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1- May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal Discussion with Mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || Working on a selected stretch goal || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || Working on a selected stretch goal &lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
'''Title''': Improve GRASS user experience in Jupyter Notebook&lt;br /&gt;
&lt;br /&gt;
'''Community''': GRASS GIS - OSGeo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Abstract ===&lt;br /&gt;
&lt;br /&gt;
This project introduces three significant enhancements to the &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;: a ''Query Button'' for querying specific points, a ''View/Update Computational Region Button'' for directly viewing and updating the computational region, and a ''Draw Geometries Button'' for creating and adding simple geometries as GRASS native vector maps. Additionally, the project introduces the &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; to reduce redundancy between &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;, and adds parallelization to both &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; for improved performance.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration BEFORE the start of GSoC ===&lt;br /&gt;
&lt;br /&gt;
Previously, it was not possible to query vector/raster data, draw geometries, or view the computational region in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt;. While updating the region was possible, it required running additional commands. Additionally, improving the rendering speed of images in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; was not feasible.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== The state of integration AFTER GSoC ===&lt;br /&gt;
&lt;br /&gt;
# '''Features in &amp;lt;code&amp;gt;grass.InteractiveMap()&amp;lt;/code&amp;gt;''': The &amp;lt;code&amp;gt;grass.jupyter.interactivemap.py&amp;lt;/code&amp;gt; module includes three key features: the Query button (ℹ️), the View/Update Computational Region button (◻️), and the Draw Geometries button (🖉).&lt;br /&gt;
## '''Querying Raster/Vector Information at a Specific Point''' (ℹ️)&lt;br /&gt;
### ''Activate the Query Tool'': Click the '''info''' button (ℹ️) to enable the query mode.&lt;br /&gt;
### ''Select a Point on the Map'': Click on the map to retrieve raster/vector information for that specific point.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done. [[File:Grass query.mp4|thumb|alt=Working of Query Button]]&lt;br /&gt;
## '''Drawing and Saving Geometries as GRASS Native Vector Maps''' (🖉)&lt;br /&gt;
### ''Activate the Drawing Tool'': Click the '''Pencil''' button (🖉) to start drawing on the map.&lt;br /&gt;
### ''Draw Your Geometry'': You can draw a polyline, polygon, or circle marker directly on the map.&lt;br /&gt;
### ''Name the Vector Map'': Enter the name for the new vector map in the '''New vector map name''' text box.&lt;br /&gt;
### ''Save the Geometry'': Click the '''Save''' button to add the geometry to the map.&lt;br /&gt;
### ''Finalize and Close'': The geometry is now added as a new layer on the map, and the drawing interface will automatically close. [[File:Grass draw geometries.mp4|thumb|alt=Working of Draw Geometries Button]]&lt;br /&gt;
## '''Viewing and Updating the Computational Region''' (◻️)&lt;br /&gt;
### ''Activate the Computational Region Tool'': Click the '''View/Update Computational Region''' button (◻️).&lt;br /&gt;
### ''Visualize the Current Region'': The current computational region is displayed as a rectangle on the map.&lt;br /&gt;
### ''Adjust the Region'': Move the rectangle to a new location or resize it by dragging its vertices.&lt;br /&gt;
### ''Update the Region'': Click '''Update Region''' to apply your changes to the computational region.&lt;br /&gt;
### ''Deactivate the Tool'': Toggle the button off when you're done.[[File:Grass update region.mp4|thumb|alt=Working of Update Region Button]]&lt;br /&gt;
# '''Parallelization in &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap:&amp;lt;/code&amp;gt;'''&lt;br /&gt;
'''Benchmark for &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Performance Results&lt;br /&gt;
! Cores !! Time&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 53.42 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 26.24 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 18.99 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 18.50 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 15.08 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 14.04 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 17.68 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 15.75 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 16.00 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 14.12 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 11 || 14.22 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 14.76 seconds&lt;br /&gt;
|}&lt;br /&gt;
'''Benchmark for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;'''&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Performance Results&lt;br /&gt;
! Cores !! Time&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 4.88 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 2.47 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 1.58 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1.67 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 5 || 1.74 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 1.73 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 7 || 1.68 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 1.64 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 9 || 1.65 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 1.64 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 11 || 1.62 seconds&lt;br /&gt;
|-&lt;br /&gt;
| 12 || 1.61 seconds&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=File:Grass_update_region.mp4&amp;diff=27801</id>
		<title>File:Grass update region.mp4</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=File:Grass_update_region.mp4&amp;diff=27801"/>
		<updated>2024-08-13T17:05:52Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Working of Update Region Button&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=File:Grass_draw_geometries.mp4&amp;diff=27800</id>
		<title>File:Grass draw geometries.mp4</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=File:Grass_draw_geometries.mp4&amp;diff=27800"/>
		<updated>2024-08-13T17:04:18Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Working of Draw Geometries Button&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=File:Grass_query.mp4&amp;diff=27799</id>
		<title>File:Grass query.mp4</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=File:Grass_query.mp4&amp;diff=27799"/>
		<updated>2024-08-13T17:02:41Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Working of Query button&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27796</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27796"/>
		<updated>2024-08-13T15:01:16Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: /* Reports */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1- May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal Discussion with Mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || Working on a selected stretch goal || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || Working on a selected stretch goal &lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Reports =&lt;br /&gt;
&lt;br /&gt;
== Bonding Period ==&lt;br /&gt;
# '''Contribution Guidelines''': Spent time familiarizing myself with the project's contribution guidelines to ensure that my work aligns with the required standards.&lt;br /&gt;
# '''Introduction''': [https://discourse.osgeo.org/t/gsoc-2024-introduction-riya-saxena/28245 Introduced myself to the discourse mailing list].&lt;br /&gt;
# '''WikiPages Setup''': Created and organized [https://wiki.osgeo.org/wiki/User:29riyasaxena my personal WikiPage] and the [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks| project WikiPage], providing necessary documentation.&lt;br /&gt;
# '''Development Environment Configuration''': Successfully set up and configured the development environment to streamline my coding and testing processes.&lt;br /&gt;
# '''GRASS GIS Exploration''': Learnt more about GRASS GIS.&lt;br /&gt;
# '''Remove Redundancy in the code''': Continued working on the [https://github.com/OSGeo/grass/pull/3468 pull request] to  remove redundancies in the &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt; modules opened by me before the Contributor Proposals Opened. &lt;br /&gt;
&lt;br /&gt;
== Week-1 ==&lt;br /&gt;
# '''Created the Class &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; [https://github.com/OSGeo/grass/pull/3468 (PR)]'''&lt;br /&gt;
#:* The &amp;lt;code&amp;gt;BaseSeriesMap&amp;lt;/code&amp;gt; class serves as a base class for &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;TimeSeriesMap&amp;lt;/code&amp;gt;. &lt;br /&gt;
#:* It eliminates code redundancy and offers a unified interface for rendering images and creating interactive timeline sliders.&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enabled users to retrieve the Latitude and Longitude of raster data upon activation of Query Button.&lt;br /&gt;
&lt;br /&gt;
== Week-2 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added functionality to handle both raster and vector data.&lt;br /&gt;
#:* The button now returns output to the user in the Coordinate Reference System (CRS).&lt;br /&gt;
&lt;br /&gt;
== Week-3 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added a Popup button to display the queried point.&lt;br /&gt;
#:* Enabled support for multiple raster and vector layers.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Began initial work on this feature, for example, adding the button, getting the region, etc.&lt;br /&gt;
&lt;br /&gt;
== Week-4 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Explored methods to dynamically calculate the query threshold distance.&lt;br /&gt;
#:* Made slight modifications to the display of the Query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Attempted to use &amp;lt;code&amp;gt;ipyleaflet.Rectangle&amp;lt;/code&amp;gt; as an alternative to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;, but this method was unsuccessful.&lt;br /&gt;
&lt;br /&gt;
== Week-5 == &lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Added test case for query button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added a rectangle to display the current computational region when this button is activated.&lt;br /&gt;
#:* User can modify the current computational region by adjusting the rectangle.&lt;br /&gt;
&lt;br /&gt;
== Week-6 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Enhanced the appearance of the popup button that will display the output.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Worked on enhancing the display of the computational region.&lt;br /&gt;
&lt;br /&gt;
== Week-7 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Finalized the appearance of the popup button.&lt;br /&gt;
# '''View/Update Computational Region Button [https://github.com/OSGeo/grass/pull/3838 (PR)]'''&lt;br /&gt;
#:* Added functionality for zooming into the computational region.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Users can now draw simple geometries in &amp;lt;code&amp;gt;InteractiveMap&amp;lt;/code&amp;gt; and save them as GRASS native vector maps.&lt;br /&gt;
#:* Transitioned from &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt; (deprecated) to &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ipyleaflet&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-8 ==&lt;br /&gt;
# '''Query Button [https://github.com/OSGeo/grass/pull/3793 (PR)]'''&lt;br /&gt;
#:* Worked on pylint errors.&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Discovered limitations of &amp;lt;code&amp;gt;GeomanDrawControl&amp;lt;/code&amp;gt; and reverted to &amp;lt;code&amp;gt;DrawControl&amp;lt;/code&amp;gt;.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Began working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-9 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Updated the display of buttons.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Continued working on parallelization for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Week-10 ==&lt;br /&gt;
# '''Drawing and Saving of Simple Geometries [https://github.com/OSGeo/grass/pull/4003 (PR)]'''&lt;br /&gt;
#:* Did some final edits in the code.&lt;br /&gt;
# '''Parallelization [https://github.com/OSGeo/grass/pull/4097 (PR)]'''&lt;br /&gt;
#:* Added parallelization in the render function for &amp;lt;code&amp;gt;TimeseriesMap&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SeriesMap&amp;lt;/code&amp;gt;, and completed this task.&lt;br /&gt;
&lt;br /&gt;
== Week-11 ==&lt;br /&gt;
# '''Managing Multiple Toggle Buttons'''&lt;br /&gt;
#:* Implemented &amp;lt;code&amp;gt;[https://github.com/OSGeo/grass/pull/4003 InteractiveDrawController]&amp;lt;/code&amp;gt; and [https://github.com/OSGeo/grass/pull/3793 &amp;lt;code&amp;gt;InteractiveQueryController&amp;lt;/code&amp;gt;] to handle individual events.&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4164 Modified Tutorials]'''&lt;br /&gt;
# '''[https://github.com/OSGeo/grass/pull/4159 Updated Descriptions]'''&lt;br /&gt;
&lt;br /&gt;
== Week-12 ==&lt;br /&gt;
&lt;br /&gt;
= Final Report =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_Ideas_2024&amp;diff=27533</id>
		<title>GRASS GSoC Ideas 2024</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_Ideas_2024&amp;diff=27533"/>
		<updated>2024-05-11T10:26:23Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== About ==&lt;br /&gt;
&lt;br /&gt;
* [https://wiki.osgeo.org/wiki/Google_Summer_of_Code_2024_Ideas The OSGeo GSoC 2024 main page]&lt;br /&gt;
* [https://summerofcode.withgoogle.com/ Official GSoC page at Google]&lt;br /&gt;
&lt;br /&gt;
== Accepted ideas ==&lt;br /&gt;
=== Add JSON output to different GRASS tools in C ===&lt;br /&gt;
* Student: Kriti Birda&lt;br /&gt;
* Mentors: Corey White and Vaclav Petras&lt;br /&gt;
* [[GrassJsonGsoc2024|Wiki page]]&lt;br /&gt;
&lt;br /&gt;
=== Add EODAG support to GRASS GIS ===&lt;br /&gt;
* Student: Hamed Ashraf&lt;br /&gt;
* Mentors: Luca Delucchi, Veronica Andreo, Stefan Blumentrath&lt;br /&gt;
* [https://wiki.osgeo.org/wiki/GRASS_GSoC_2024_EODAG_Support Wiki page]&lt;br /&gt;
&lt;br /&gt;
=== Parallelization of existing tools in GRASS GIS ===&lt;br /&gt;
* Student: Chung-Yuan Liang&lt;br /&gt;
* Mentors: Huidae Cho, Vaclav Petras, Maris Nartiss&lt;br /&gt;
* [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Parallelize_Tools Wiki page]&lt;br /&gt;
&lt;br /&gt;
=== Improve GRASS user experience in Jupyter Notebook ===&lt;br /&gt;
* Student: Riya Saxena&lt;br /&gt;
* Mentors: Anna Petrasova, Corey White&lt;br /&gt;
* [https://grasswiki.osgeo.org/wiki/GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks Wiki page]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ideas ==&lt;br /&gt;
If you are a student you can suggest a new idea or pick up an existing one. In any case write about it to [https://lists.osgeo.org/listinfo/grass-dev grass-dev mailing list],[https://github.com/OSGeo/grass/discussions GitHub Discussions], or [https://gitter.im/grassgis/community Gitter].&lt;br /&gt;
&lt;br /&gt;
You are invited as well to have a close look at ideas from previous years ([https://trac.osgeo.org/grass/wiki/GSoC/2014 2014], [https://trac.osgeo.org/grass/wiki/GSoC/2015 2015], [https://trac.osgeo.org/grass/wiki/GSoC/2016 2016],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2017 2017],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2018 2018],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2019 2019],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2020 2020],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2021 2021],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2022 2022],&lt;br /&gt;
[https://trac.osgeo.org/grass/wiki/GSoC/2023 2023])&lt;br /&gt;
which have not yet been implemented.&lt;br /&gt;
You can also look at accepted GRASS GSoC [https://trac.osgeo.org/grass/wiki/GSoC projects from previous years] for an idea of scope.''&lt;br /&gt;
&lt;br /&gt;
Include &amp;quot;GRASS GIS&amp;quot; in the title of our idea to easily distinguish ideas and projects inside OSGeo.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Parallelization of existing tools ===&lt;br /&gt;
&lt;br /&gt;
There are several tools that would benefit from parallelization with OpenMP, e.g. r.texture, r.horizon, r.fill.stats, r/v.surf.idw, r.viewshed, v.to.rast, r.grow.distance, v.surf.bspline, ...&lt;br /&gt;
For overview of current state, see [[Raster_Parallelization_with_OpenMP]].&lt;br /&gt;
&lt;br /&gt;
* Requirements: familiarity with C, OpenMP&lt;br /&gt;
* Mentor: Huidae Cho&lt;br /&gt;
* Co-mentor: Vaclav Petras, Anna Petrasova&lt;br /&gt;
* Project length: 175 or 350 hours (take your pick)&lt;br /&gt;
* Rating: medium&lt;br /&gt;
* Expected Outcomes: parallelized module or modules, depending on complexity&lt;br /&gt;
* Test of skills: suggest/implement solution for https://github.com/OSGeo/grass/issues/2644&lt;br /&gt;
&lt;br /&gt;
=== Improve GRASS user experience in Jupyter Notebook ===&lt;br /&gt;
[[File:Jupyter_interactive_viewshed.png|500px|thumb|right|InteractiveMap in grass.jupyter library]]&lt;br /&gt;
Python package [https://grass.osgeo.org/grass-stable/manuals/libpython/grass.jupyter.html grass.jupyter] was developed during [https://trac.osgeo.org/grass/wiki/GSoC/2021/JupyterAndGRASS GSoC 2021] to simplify running GRASS from Jupyter Notebooks and displaying data. This project could focus on adding features such as adding parallelization for rendering, increasing interactivity of displayed data using ipyleaflet (e.g., capture mouse clicks to show information about vector line, pixel), adding API for managing projects and subprojects (i.e., locations/mapsets), simplifing display of attribute data, ...&lt;br /&gt;
&lt;br /&gt;
* Requirements: Python&lt;br /&gt;
* Mentor: Anna Petrasova&lt;br /&gt;
* Co-mentor: Vaclav Petras, Helena Mitasova&lt;br /&gt;
* Project length: 175 or 350 hours (take your pick)&lt;br /&gt;
* Rating: easy to medium&lt;br /&gt;
* Expected Outcomes: improved user experience when using GRASS through notebooks&lt;br /&gt;
* Test of skills: https://github.com/OSGeo/grass/issues/3276, or write a test for [https://github.com/OSGeo/grass/tree/main/python/grass/jupyter grass.jupyter library] using python unittest or pytest, more info [https://grass.osgeo.org/grass-devel/manuals/libpython/gunittest_testing.html here].&lt;br /&gt;
&lt;br /&gt;
=== Add JSON output to different tools in C ===&lt;br /&gt;
There are several tools in GRASS that would benefit from a JSON-formatted output, see [https://github.com/OSGeo/grass/issues/3020 this issue for a list of tools]. Besides adding the JSON output, the work would also include adding tests and basic documentation.&lt;br /&gt;
* Requirements: C, Python for tests&lt;br /&gt;
* Mentor: Vaclav Petras&lt;br /&gt;
* Co-mentor: Anna Petrasova, Corey White&lt;br /&gt;
* Project length: 175 or 350 hours (take your pick)&lt;br /&gt;
* Rating: easy to medium&lt;br /&gt;
* Expected Outcomes: one or more (depending on project length and complexity of the tool) tools with well tested JSON output&lt;br /&gt;
* Test of skills: Address https://github.com/OSGeo/grass/issues/1044 for r.surf.fractal&lt;br /&gt;
&lt;br /&gt;
=== Support writing tests with pytest ===&lt;br /&gt;
&lt;br /&gt;
* The current testing framework, ''[https://grass.osgeo.org/grass-stable/manuals/libpython/gunittest.html grass.gunittest]'', was written before migration to Git/GitHub and when long free runs in 3rd party services were unthinkable. Additionally, some no longer relevant goals were prioritized, such as independence on the current code, detailed custom HTML reports, success tracking over time, and high specialization towards GRASS-specifics.&lt;br /&gt;
* ''grass.gunittest'' is based on Python ''unittest'' package and many projects since then migrated to //pytest//, e.g., GDAL and Numpy. While ''unittest'' is inspired by Java's JUnit, ''pytest'' is designed to support writing small, readable tests, and uses plain `assert` statements instead of many different assert methods.&lt;br /&gt;
* Using ''pytest'' should lead to tests which feel more like Python scripts and to minimum of testing-specific code.&lt;br /&gt;
* An example issue of ''grass.gunittest'' is that it doesn't work well with tests of the main GRASS executable (prominence of `grass ... --exec` is yet another new thing which changed since ''grass.gunittest'' was designed).&lt;br /&gt;
* Two main things needed:&lt;br /&gt;
** Create general comparison functions from the ''grass.gunittest'' assert methods so that they can be used with pytest.&lt;br /&gt;
** Current grass.script.setup.init function and grass.script.core.create_location function don't work well in the context of a pytest test function. More  &lt;br /&gt;
* Additional things needed:&lt;br /&gt;
** Fixture for pytest to set up and tear down a GRASS session in a temporary mapset.&lt;br /&gt;
&lt;br /&gt;
* Requirements: Python&lt;br /&gt;
* Project length: 175 or 350 hours (take your pick)&lt;br /&gt;
* Mentor: Vaclav Petras&lt;br /&gt;
* Co-mentor: Stefan Blumentrath&lt;br /&gt;
* Proposed by: Vaclav Petras&lt;br /&gt;
* Rating: easy to medium&lt;br /&gt;
* Expected Outcomes: Convenient way of writing tests with pytest&lt;br /&gt;
* Test of skills: Fix failing tests and/or write new tests (more is better). Alternatively, addressing a smaller problem in the testing framework is a good task, too.&lt;br /&gt;
&lt;br /&gt;
=== New easy-to-use CLI and API for GRASS GIS ===&lt;br /&gt;
&lt;br /&gt;
* Make running of GRASS GIS modules as easy as it is to run GDAL commands.&lt;br /&gt;
** `grass run r.slope.aspect elevation=elevation.tiff slope=slope.tiff aspect=aspect.tiff`&lt;br /&gt;
** CLI like GDAL has.&lt;br /&gt;
** No GRASS Database, Location, Mapset to deal with.&lt;br /&gt;
** No import, export from user perspective.&lt;br /&gt;
** Reasonable defaults for things like region.&lt;br /&gt;
** CLI and API still allows user to specify any of the above.&lt;br /&gt;
* Idea page with details: wiki:GSoC/2021/EasyToUseCliAndApiIdea&lt;br /&gt;
* Project length: 350 hours&lt;br /&gt;
* Rating: medium&lt;br /&gt;
* Requirements:&lt;br /&gt;
** Language: Python&lt;br /&gt;
** Proposal: Student needs to show sufficient understanding of the GRASS GIS Database structure and significantly extend on text below in terms of more concrete formulation of ideas and identification of missing and existing parts.&lt;br /&gt;
* Mentors: Vaclav Petras&lt;br /&gt;
* Co-mentors: Stefan Blumentrath&lt;br /&gt;
* Proposed by: Vaclav Petras&lt;br /&gt;
* Expected outcomes: New subcommand which easily runs a GRASS module on GeoTiff and GeoPackage.&lt;br /&gt;
* Test and training tasks:&lt;br /&gt;
** Solve one of the tickets linked at the idea page.&lt;br /&gt;
** Add features to `grass` executable interface:&lt;br /&gt;
*** Make it possible to associate `*.gxw` files with `grass` executable (#1204) or at least add `--gui-workspace` or preferably just recognize it in the command line (distinguish it from database/location/mapset).&lt;br /&gt;
** Extend `--exec` functionality:&lt;br /&gt;
*** Add `--region` to set a temporary computational region for the execution, e.g. `--region=&amp;quot;raster=raster_name&amp;quot;`&lt;br /&gt;
*** Add `--import-raster=some/file.tiff` which imports (r.import) a raster file (same for vector and similarly for export).&lt;br /&gt;
*** Add `--link-raster=some/file.tiff` which links (r.external) a raster file (same for vector and similarly for r.external.out).&lt;br /&gt;
&lt;br /&gt;
=== STAC (SpatioTemporal Asset Catalog) Integration ===&lt;br /&gt;
&lt;br /&gt;
Create new import and export capabilities for GRASS GIS which allow users to easily ingest data from STAC catalogs and export locations and mapsets as STAC specs for data discovery within STAC browsers. &lt;br /&gt;
&lt;br /&gt;
* Requirements: familiar with python, STAC specs&lt;br /&gt;
* Mentor: Corey White&lt;br /&gt;
* Co-mentor: Vaclav Petras, Anna Petrasova&lt;br /&gt;
* Project length: 175 or 350 hours (take your pick)&lt;br /&gt;
* Rating: medium&lt;br /&gt;
* Expected Outcomes: completion of t.in.stac and t.out.stac&lt;br /&gt;
* Test of skills:&lt;br /&gt;
** suggest or implement solution for implementing t.out.stac using the prototype STAC spec https://github.com/tomorrownow/grass-stac-extension &lt;br /&gt;
** suggest/implement solution for completing https://github.com/OSGeo/grass-addons/pull/802&lt;br /&gt;
&lt;br /&gt;
=== Add EODAG support to GRASS GIS ===&lt;br /&gt;
&lt;br /&gt;
[https://eodag.readthedocs.io/en/stable/ EODAG] is a Python library useful to download several satellite datasets from different providers (i.e., USGS, Copernicus, AWS, Planetary Computer, etc.). GRASS has various modules to download satellite data like i.sentinel.download, i.landsat.download, i.modis.download. However, they all use different libraries, some of them no longer maintained. Hence, implementing the use of EODAG as back-end for those tools would be very useful not only in terms of maintenance but also in terms of less code repetition. It would also open the possibility for new tools or a master tool to download other datasets directly from GRASS. &lt;br /&gt;
&lt;br /&gt;
* Requirements: familiar with Python&lt;br /&gt;
* Project length: 175 or 350 hours&lt;br /&gt;
* Mentor: Luca Delucchi&lt;br /&gt;
* Co-mentor: Veronica Andreo&lt;br /&gt;
* Proposed by: Luca Delucchi&lt;br /&gt;
* Rating: medium&lt;br /&gt;
* Expected Outcomes:  175 hours EODAG core library to be able to download products; 350 library + application at least to i.sentinel.download but hopefully also to i.landsat.download&lt;br /&gt;
* Test of skills: https://github.com/OSGeo/grass-addons/issues/1033&lt;br /&gt;
&lt;br /&gt;
=== GUI: Add space-time datasets support in Data Catalog ===&lt;br /&gt;
[[File:GUI_data_tab.png|400px|thumb|right|Data catalog]]&lt;br /&gt;
Currently GRASS Data Catalog shows only raster and vector maps. The goal of this project is to add support for space-time datasets. It is mainly space-time raster datasets. In the next phase of the project support for other types of space-time datasets (vector and 3D raster) could be added. Besides displaying space-time datasets in the layer tree, it is also about adding the equivalent functionality currently available for raster and vector layers from the context menu. &lt;br /&gt;
&lt;br /&gt;
* Requirements: familiar with Python&lt;br /&gt;
* Project length: 175 or 350 hours&lt;br /&gt;
* Mentor: Martin Landa&lt;br /&gt;
* Co-mentor: Anna Petrasova&lt;br /&gt;
* Proposed by: Martin Landa&lt;br /&gt;
* Rating: medium&lt;br /&gt;
* Expected Outcomes:  175 hours basic support for space-time raster datasets; 350 extended support also for other space-time datasets types (vector, 3D raster)&lt;br /&gt;
* Test of skills:&lt;br /&gt;
** suggest/implement solution for completing https://github.com/OSGeo/grass/issues/2599&lt;br /&gt;
&lt;br /&gt;
=== Add {your research idea} to GRASS GIS ===&lt;br /&gt;
&lt;br /&gt;
* In general, you can propose any topic, but you can specifically propose integrating your research or research idea into GRASS GIS.&lt;br /&gt;
* Requirements:&lt;br /&gt;
** Language:&lt;br /&gt;
*** Depends on the project, often Python, sometimes C.&lt;br /&gt;
*** Adding your latest ecological analysis &lt;br /&gt;
** Proposal:&lt;br /&gt;
*** Discuss relevance to GRASS GIS.&lt;br /&gt;
*** Describe technical steps needed for integration.&lt;br /&gt;
*** Describe whether it is an addition of a tool (module) or a change in one of the libraries. If it is a tool, specify if it should be included in the core grass repository or in grass-addons repository and why.&lt;br /&gt;
*** Specify what research was done and what needs to be accomplished in order to have usable product at the end of summer.&lt;br /&gt;
*** Specify who will provide the research expertise.&lt;br /&gt;
* Project length: 175 or 350 hours (take your pick)&lt;br /&gt;
* Rating: from low to hard&lt;br /&gt;
* Mentors:&lt;br /&gt;
** GRASS GIS project will provide technical mentors, but it is up to the applicant to ensure the research part is mentored well. An exception may be granted to applicants which can demonstrate that the research is finished or that they have enough expertise themselves.&lt;br /&gt;
** Possible technical mentors: Vaclav Petras, Anna Petrasova&lt;br /&gt;
** Research mentors: Bring in an expert from your field, e.g., your academic advisor or project principal investigator (if needed).&lt;br /&gt;
* Proposed by: Vaclav Petras&lt;br /&gt;
* Expected outcome: Working feature which is integrated and merged at the end of the project.&lt;br /&gt;
* Test and training tasks:&lt;br /&gt;
** Create a test in Python for an existing tool in the grass-addons repository or in the core grass repository.&lt;br /&gt;
&lt;br /&gt;
=== Title of idea ===&lt;br /&gt;
&lt;br /&gt;
Description here&lt;br /&gt;
&lt;br /&gt;
* Requirements:&lt;br /&gt;
* Project length: (175 or 350 hours) &lt;br /&gt;
* Mentor: &lt;br /&gt;
* Proposed by: &lt;br /&gt;
* Rating: &lt;br /&gt;
* Expected Outcomes:  &lt;br /&gt;
* Test of skills: &lt;br /&gt;
* Other:&lt;br /&gt;
&lt;br /&gt;
== Tips for students ==&lt;br /&gt;
&lt;br /&gt;
* If you have your own ideas we encourage you to propose them. Explain them on the [https://lists.osgeo.org/listinfo/grass-dev grass-dev mailing list].&lt;br /&gt;
* If you like some idea here or from previous yeas, write about it on [https://lists.osgeo.org/listinfo/grass-dev grass-dev mailing list] and any ideas of your own which could improve it.&lt;br /&gt;
* Follow some good practices in your ideas and proposals:&lt;br /&gt;
** Stress why the project would be useful.&lt;br /&gt;
** Show that you know how you will proceed. That is, make sure that you can demonstrate that the proposal is feasible in the given time frame.&lt;br /&gt;
** Be specific in the implementation (or at least as specific as you can).&lt;br /&gt;
** Explain what the final product will look like and how it will work. You can add drawings or mock-ups.&lt;br /&gt;
** Explain how the idea relates to existing GRASS GIS functions, features, and needs.&lt;br /&gt;
** Do not include steps such as &amp;quot;install GRASS&amp;quot;, &amp;quot;compile GRASS libraries (on my machine)&amp;quot;, &amp;quot;read about the API&amp;quot;. You should do this before applying to GSoC.&lt;br /&gt;
* Compile GRASS GIS from source and prepare environment for development:&lt;br /&gt;
** Read [https://github.com/OSGeo/grass/blob/main/CONTRIBUTING.md CONTRIBUTING file] and [https://grasswiki.osgeo.org/wiki/Compile_and_Install compilation instructions].&lt;br /&gt;
** If you get stuck with the setup, feel free to consult the [https://lists.osgeo.org/listinfo/grass-user grass-user mailing list].&lt;br /&gt;
** Familiarize yourself with wiki:Submitting rules.&lt;br /&gt;
* Prove your worth by being active on the GRASS mailing lists ([https://lists.osgeo.org/listinfo/grass-user grass-user], [https://lists.osgeo.org/listinfo/grass-dev grass-dev]) or other channels ([https://github.com/OSGeo/grass/discussions GitHub Discussions], [https://gitter.im/grassgis/community Gitter]), fix some [https://github.com/OSGeo/grass/issues bugs], and/or implement some (smaller) features, or write some (simpler) GRASS module, and post it to mailing list. There's no better way to demonstrate your willingness and abilities. Do this before start you apply to GSoC. &lt;br /&gt;
* Also note that fixing existing bugs and/or implementing enhancements will be a part of student evaluation.&lt;br /&gt;
&lt;br /&gt;
* Every year GRASS GIS hopes to participate and participates in GSoC as part of the [https://www.osgeo.org/ OSGeo Foundation]'s GSoC program umbrella. See the official OSGeo template for application details and other important information at the [https://wiki.osgeo.org/wiki/Google_Summer_of_Code_Recommendations_for_Students OSGeo Recommendations for Students].&lt;br /&gt;
&lt;br /&gt;
{{GSoC}}&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
	<entry>
		<id>https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27532</id>
		<title>GRASS GSoC 2024 Improve user experience in Jupyter Notebooks</title>
		<link rel="alternate" type="text/html" href="https://grasswiki.osgeo.org/w/index.php?title=GRASS_GSoC_2024_Improve_user_experience_in_Jupyter_Notebooks&amp;diff=27532"/>
		<updated>2024-05-11T10:18:09Z</updated>

		<summary type="html">&lt;p&gt;29riyasaxena: GRASS GSoC 2024 Project Update: Enhancing User Experience in Jupyter Notebooks by Riya&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== GSoC 2024: Improve GRASS user experience in Jupyter Notebook ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| '''Student Name''' || Riya&lt;br /&gt;
|-&lt;br /&gt;
| '''Organization''' || [https://www.osgeo.org/ ​OSGeo - Open Source Geospatial Foundation]&lt;br /&gt;
|-&lt;br /&gt;
| '''Mentor Name''' || Anna Petrasova, Corey White&lt;br /&gt;
|-&lt;br /&gt;
| '''GitHub Fork''' || [https://github.com/29riyasaxena/grass View Repo]&lt;br /&gt;
|-&lt;br /&gt;
| '''GSoC proposal''' || [https://hackmd.io/@riyasaxena/HkrKuQJyR View Proposal]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Abstract ==&lt;br /&gt;
The [https://grass.osgeo.org/grass83/manuals/libpython/grass.jupyter.html#module-grass.jupyter.interactivemap grass.jupyter.InteractiveMap()] tool offers basic map visualization features like zooming and layer addition but suffers from suboptimal rendering speed (approximately 7.55 seconds per loop) and cumbersome data integration, particularly with large datasets. Additionally, its reliance on the Pseudo-Mercator projection limits its versatility. This abstract highlights the need for enhancements to improve rendering efficiency, streamline data integration, and broaden projection support for increased usability and functionality.&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
&lt;br /&gt;
Main Goals:&lt;br /&gt;
# Enhance InteractiveMap with interactive data retrieval features, enabling users to query attribute values and draw geometries directly on the map.&lt;br /&gt;
# Implement support for custom coordinate reference systems (CRS) in InteractiveMap to eliminate the need for layer reprojection and improve visualization speed.&lt;br /&gt;
# Optimize rendering processes for SeriesMap and TimeseriesMap by parallelizing map rendering using standard Python libraries like multiprocessing.&lt;br /&gt;
&lt;br /&gt;
Stretch Goals:&lt;br /&gt;
# Improve integration between GRASS and Pandas for smoother data handling and analysis.&lt;br /&gt;
# Incorporate tile-based rendering to efficiently display extensive datasets without compromising performance.&lt;br /&gt;
# Integrate a graphical user interface (GUI) within a Jupyter Notebook for enhanced user experience and ease of interaction with InteractiveMap functionalities.&lt;br /&gt;
&lt;br /&gt;
== Timeline ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Period !! Timeline  !! Tasks   !! Status &lt;br /&gt;
|-&lt;br /&gt;
| Bonding Period &lt;br /&gt;
||&lt;br /&gt;
May 1- May 26  &lt;br /&gt;
|| &lt;br /&gt;
# Initial research &lt;br /&gt;
# Proposal Discussion with Mentor &lt;br /&gt;
# Work on this [https://github.com/OSGeo/grass/pull/3468/ PR]&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;13&amp;quot; | Official Coding Period &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 1''' (May 27 - June 1) || Write initial function for adding button to ''grass.jupyter.InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 2''' (June 2 - June 8) || Add click to see attributes features to the button || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 3''' (June 9 - June 15) || Add button to allow users to create drawings in the displayed ''InteractiveMap()'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 4''' (June 16 - June 22) || Add tools to the button to create different drawings || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 5''' (June 23 - June 29) || Add functionality to retrieve points from user drawn drawings and add them to the data, if the user wants || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 6''' (June 30 - July 6) || Speeding up the rendering of ''InteractiveMap()'' by skipping reprojection || &lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background: #ffdead;&amp;quot;| '''Week 7''' (July 7 - July 13) &lt;br /&gt;
|| &lt;br /&gt;
# Code refactoring, testing, documentation &lt;br /&gt;
# '''Mid-term Evaluation: July 12'''&lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 8''' (July 14 - July 20) || Adding parallelization to ''TimeseriesMap'' and ''SeriesMap'' || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 9''' (July 21 - July 27) || Documentation, testing, writing tutorial || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 10''' (July 28 - August 3) || Working on a selected stretch goal || &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 11''' (August 4 - August 10) || Working on a selected stretch goal &lt;br /&gt;
|| &lt;br /&gt;
|-&lt;br /&gt;
| '''Week 12''' (August 11 - August 17) || Write project summary || &lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; | Evaluation Period &lt;br /&gt;
|-&lt;br /&gt;
| August 26 - September 2 || Submit code and final evaluation || &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Reports ==&lt;/div&gt;</summary>
		<author><name>29riyasaxena</name></author>
	</entry>
</feed>