GSoC 2021 Implement 3D scene visualization support using Potree and integrate with MapMint

== Introduction ==
=== Idea ===
In this project I will be implementing 3D visualization support and integrate it with MapMint. To obtain 3D visualizations, Potree’s GitHub repository will be considered for this task under the JavaScript language. Using Potree I will be integrating the 3D visualizations to MapMint. The dataset for this work being provided through OpenDroneMap, containing files of the type .obj, .las and .ply. These files are of the UAV imagery format and can be loaded on browsers through Potree’s tools and loaders. This will be followed by adding a switcher tab as an addon feature to visualize the OpenLayersMap and 3D visualization. Using this, the user will be able to visualize the 3D scene of a corresponding Georeferenced image.
===Project proposal===
My proposal for GSoC 2021 got accepted! Link.
=== Advantages from this project ===
The implementation of 3D visualization support to Mapmint will be fruitful to the users to
obtain 3D visuals of a specific georeferenced data. This enables the users to view any
specific scene from the chosen georeferenced data through different perspectives and
angles.
Example : For instance, consider obtaining a 3D visualization of a multistorey Apartment
or a mountain. In order to obtain a descriptive analysis and the visuals of corresponding
georeferenced scenes, the user will be able to view the Multistorey Apartment or the
Mountain as per their considerations in reference to it’s height and altitude respectively
with 3D support.
Link to Github repository: 
== Timeline ==
=== 17th May - 7th June===
Community bonding period:
#Tasks carried out during this period
* Introduced myself and about my project in the OSGeo SoC mailing List.
* Created my OSGeo Profile Page and filled in my personal details. 
* Updated my project information on the Wiki Page.
* Updated the GSoC 2021 Accepted Students Page by adding my User Page, Project Wiki Page and GitHub Repository Links.
* Had a mentor meeting and interacted with mentors and my partners.
* Discussed with my mentors about the next steps I should take regarding my project.
* General discussion regarding any doubts with my partners and mentors on the project Slack channel.
=== Coding Phase 1 ===
=== Week 1 (7th June - 13th June) === 
* Noticed an error that in the r -cran.yml, which is a necessary file needed during MapMint installation. So created a Pull Request for adapting the change in the automated proxy file versions – update_r-cran_version.py
* Setup MapMint successfully on my machine.
* Read about different 3D file formats Cesium takes into consideration for visualization
* Created a documentation for setting up MapMint on OSGeo Live VM.
* Gone through the Distiller and visualized some 2D GIS data on MapMint.
* Discussion with my mentors regarding development of project.
=== Week 2 (14th June - 20th June) ===
* Prepared a script for loading data locally to cesium ion assets.
* Created a basic UI for the same taking inputs from user. File format: CityGML, las, terrain, imagery
* Worked on backend for connecting API and form.
* Learning about ZOO-services for integration purpose with MapMint.
* Gone through ZOO Project Documentation.
=== Week 3 (21st June - 27th June) === 
* Setup MapMint and ZOO-Project instance with Docker on my Ubuntu 20.04 LTS successfully.
* Created a documentation regarding the same.
* Learning about ZOO Services for further work regarding project.
=== Week 4 (28th June - 4th July) ===
* Studied the 2017 Workshop for creating first zoo services
* Generalizing the Cesium API written in JS for loading files to visualize the corresponding 3D view.
* Working on Creating Zoo-Services in JavaScript for the same.
* General Discussion with mentors regarding ZOO Services.
=== Week 5 (5th July - 11th July) ===
* Working on creating ZOO Configuration File for Loading 3D data to Cesium Dashboard.
* Working on creating JS script for as the Service Provider.
* Studied about OGC API and read content regarding Web Processing Services.
=== Week 6 (12th July - 18th July) ===
* Worked on setting up homepage for loading the 3D TileSet along with Cesium script.
* Working on establishing the Zoo Service configuration file.
* Had a mentor-meeting where discussion regarding Zoo Services took place.
=== Week 7 (19th July - 25th July) ===
* Setup CesiumJS client inside the working Repository
* Added volumes under zoo-kernel for loading the template
* Created a function for rendering model of 3D format
* Testing models of different file formats with CesiumJS on MapMint instance
=== Week 8 (26th July - 1st August) ===
* Added Code for developing UI of 3D Viewer.
* Working on loading the preview of existing 3D models on webpage.
* Added volumes to the docker-compose file.
=== Week 9 (2nd August - 8th August) ===
* Completed frontend/UI for MapMint 3D Viewer.
* Added Featured Demos.
* Successfully rendering the 3D Models on the page.
* Worked on the documentation for the same.
=== Week 10 (9th Aug - 16th Aug) ===
* Worked on code to integrate the current work in MapMint instance.
* Added a switcher tab by tweaking skeleton_bs.tmpl and skeleton_bs.py files.
* Preparation of Final Report for GSoC.
=== Final Report ===
==== Google Summer of Code ==== 
Student: 
* Aryan Kenchappagol
Mentors:
* Sittichai Choosumrong
* Fenoy Gerald
* Venkatesh Raghavan
* Rajat Shinde
* Samuel Souk aloun
Organization:
* OSGeo
Developer Community:
* ZOO-Project
==== Abstract ==== 
MapMint is a web-based Geographic Information System (GIS), which is designed to facilitate Spatial Data Infrastructure (SDI) deployment. In order to make use of the spatial information in an efficient and flexible way, the Spatial Data Infrastructure (SDI), geographic data, metadata, tools and the users are connected through a framework in an interactive manner. Users can build their own maps and web-applications as MapMint combines various different softwares in a complete and coherent web mapping platform. These web-services are built on top of the ZOO-Project.
The ZOO-project is a Web Processing Service (WPS) whose implementation is done using C, Python and JavaScript. The ZOO Project allows individuals and groups to create new and innovative web services and applications. It is very flexible in terms of data input and output so as to process any kind of data stored locally or accessed from databases and remote servers. Most importantly this excels in processing of data and integrates new or existing spatial data infrastructures as it communicates with web servers and can integrate web mapping clients. Speaking about MapMint, it allows various tasks related to the implementation of SDI from a modular and user friendly administration interface. Thus users can -
* Import/Store and raster the GIS data
* Compose and save maps in the form of projects
* Configure and run a cartographic portal
==== Changes throughout the project ====
* MapMint Installation with Ansible Scripts: Created Pull Request on MapMint Ansible Roles to adapt change in the r-cran.yml file needed and which is necessary to access the MapMint instance. This PR is in accordance with the ever updating proxy versions of r-cran packages on this site: https://cran.r-project.org/src/contrib/. Earlier the python script update_r-cran_version.py ensured the automation of the newer version of e[0-9].tar.gz and classInt.tar.gz files.
* Tested the installation on OSGeo Live 13 and Ubuntu 20.04 Operating Systems and created a documentation for the same. Link to setting up instance step by step with information on Prerequisites and commands to be followed.
* Visualization of Models - imagery, terrain, 3D Buildings , point clouds, photogrammetry datatypes considered as assets, is done with Generalized Cesium API script with iON Dashboard. The supportive formats include but not limited to 3DTiles, glTF, IMAGERY, quantized-mesh, CZML datasets, KML, KMZ, GeoJSON and so on.
* A much easier way with which MapMint instance can be accessed/setup on your machine is by pulling the official Docker Image from Docker Hub. This documentation enables users to follow the steps needed to achieve the same, including - setting up environment, pulling images from Docker Hub, cloning Repositories followed by Building the images pulled. This provides an easy mechanism for accessing the instance on the working OS relatively as compared to ansible scripts.
* Switched to ThreeJS to implement Featured Demos presently which has four different dynamically loaded models. Locally these files don't load because of their dynamic content so a Live Server suits best for this purpose. These models are completely built on ThreeJS considering its efficiency in rendering 3D models of various types namely - glTF, obj along with mtl format for adding mesh and texture on these models to realistic view purposes. Here's the link to the source code to refer.
* The What, How, Why for all the Featured Demos present; can be accessed from this documentation. The Related Link to be followed where the entire setting up of ThreeJS on which the models are developed can be found right from setting up the environment, importing modules, creating scene along with different parameters involved in the schema, etc.
* Integrating with MapMint: Implemented a switcher tab after some tweaks inside the codebase and integrated the above necessary changes. This includes making changes to the Skeleton Files present inside templates directory. The skeleton files can be accessed from here.
* Appended the necessary volumes under docker-compose.yml to store the above changes made inside the codebase. The visualize_bs.tmpl based on cheetah templating system and ZOO-Services includes the script for the same.
* During the entire GSoC, I encountered multiple unexpected errors while setting up different development environments and writing code. Although stackoverflow and mentor discussion helped overcome the same I kept a track of resolved errors and their corresponding links in a google sheet of whose link can be accessed here.
==== MapMint before GSoC 2021 ====
* Capable of processing georeferenced imagery data. Its key highlights corresponding to this project includes the support to rendering GIS data with OpenLayersMap two dimensionally.
==== Future Opportunity ====
What I see from The Template is that it needs to access the fetched data with a new volume created inside the docker-compose.yml file. The file should be integrated within the /var/www/html location.
==== Related Links ====
* User Wiki Page
* Project Page
* MapMint
* ZOO-Project
* Google Sheet Resolved Errors
* Featured Demos
== Student's Biography ==
Hi, this is Aryan Kenchappagol currently a Computer Science Engineering undergrad from International Institute of Information Technology Pune, Maharashtra, India working as a student developer under GSoC 2021 for OSGeo.
== Mentors ==
*Sittichai ChoosumrongSittichai Choosumrong
*Fenoy Gerald Fenoy Gerald 
*Venkatesh Raghavan Venkatesh Raghavan
*Rajat Shinde Rajat Shinde
*Samuel Souk Aloun
Category: Google Summer of Code