Our client is developing an application that will be used in the HBGDki intiative (Healthy Birth, Growth, and Development knowledge integration). The application provides several different modes of analysis / data exploration, one of which will use a version of the Earth project globe for data visualization. The globe is now embedded into their larger application. We are working with the client to add additional capabilities to the Earth map. To date we have the basic globe working and embedded in the client's Frame. We have also added a new data set - "studies" to the globe. In this challenge we'll add live weather data, setup and API, and establish a storage / database strategy.
In this challenge you'll be extending the existing code base further. There are 3 main goals in this challenge.
1. Set up data gathering services. For this challenge you will need to set up a data gathering service. The service should run on the backend and should be easy to configure (endpoints, schedule for retrieval, ...etc). The scheduling capability should be flexible and allow for configuration either every XX days/hours/mins/seconds or at specific days/hours/mins/seconds. There should be libraries out there for this, we're free to discuss in the forums if needed.
Gather Weather Data
We need to gather weather data to display the animated Wind data on the globe. In the base Earth project (on Github), static sample data is used. You can see an example of non-static, updating data on a production version at https://earth.nullschool.net. In the base project github repo - you'll find basic instructions on how live data can be gathered.
This data should be gathered and stored in mobgoDB on a scheduled basis.
The default schedule should be every six hours.
The data should be stored as GeoJSON (we understand this is supported by Mongo). The actual data will be in TopoJSON when retrieved, so a conversion will need to take place when an API call is made to retrieve data.
When "importing" new data, please take care that data isn't duplicated - if the new dataset overlaps the previous data (or if the same data is retrieved twice), this should be handled correctly so that the database contains only a single correct set of data (expanding over time). This needs to be validated during the import process (and not rely only on scheduling).
The service should also include the configurable, optional, ability to purge "data older than…" when new data is retrieved.
2. Implement REST services for data access
Provide a REST interface to the data stored in the database. This should be a fairly straight forward interface, please just follow best practices here. We will be extending this interface with additional endpoints as we progress in the project (for retrieving other types of data), so please keep it flexible.
Provide access to the data needed to show the Wind display / animation. You'll need to understand how the Globe displays this data in order to determine the exact REST endpoints needed. Please take note of the ability to "shift" the time in the menu (on the "Control" line).
Convert the data to TopoJSON before returning it to the frontend.
We only require retrieval endpoints for this challenge (e.g. we don't need REST endpoints for adding, updating, or deleting data - as this will all occur on the backend via the service mentioned above). Note - if it makes sense to do so, feel free to create those endpoints anyway for use by the back-end service which retrieves data (although I'll leave this up to you).
3. Update the Implementation of Wind Display / Animation
Update the Globe in the application to use the new "live" / "real" data being collected by the service.
Note that the Globe is capable of displaying several different types of data. This is primarily controlled by selecting a choice on the "Mode" line in the menu. The Wind display is selected by choosing "Air" in that menu. In this mode you are also able to select a "Height". Please make sure that all features of the "Air" mode of the Globe are working correctly with the new data.
When in "Air" mode, you are able to select from several Overlays for the Globe. Ensure that each of these overlays is also being generated from the correct data pulled from the database.
Please see the nullschool demo as a reference while working on this.
Additional Notes and Requirements
You can ignore the formatting issues on the left hand menu for now (client is working on these separately, note also - these don't occur in Firefox if you'd like to see it cleanly).
We're working within a Node / Express based frame provided by the client. Please keep changes to their framework to a minimum and try to compartmentalize the Globe code, services, and DB access into it's own files as much as possible / practical. Reviewers please note: the client code (the outer frame) will not be part of the review process and scores should not be impacted by it.
There was a discussion in the previous challenge regarding the d3js version being used. The client is considering updating this, however they are relying on specifics on this version in other areas of their application. For now, we need to keep with the version being used.
Github Earth Project - The original base project
Natural Earth - vector data used in the Globe