Breezeplan is a full-stack geospatial web application that recommends personalised outdoor activities in MΓΌnster, Germany, based on real-time weather and group details. Users input their group size, fitness levels, and available time; Breezeplan fetches live weather, runs a reinforcement-learning suggestion engine, and returns ranked activity cards complete with location info, safety tips, and Google Maps links.
Built as part of the Geoinformation in Society course at the University of MΓΌnster (WWU), MSc Geoinformatics and Spatial Data Science.
- π‘οΈ Real-time weather β Fetches live temperature, wind speed, humidity, and precipitation for the user's current location via the WeatherAPI.com service
- π Geolocation detection β Automatically detects the user's GPS coordinates via the browser Geolocation API
- π€ Reinforcement-learning suggestions β A Q-learning engine ranks activities by how well they fit the current weather, group profile, and past user choices; suggestions improve over time
- π 35+ curated activities β Jogging, kayaking, ice skating, geocaching, beach volleyball, stargazing, and more β each tailored to temperature, time, and group size
- πΊοΈ Google Maps routing β Every activity card includes a direct Google Maps link to the nearest suitable MΓΌnster venue (Aasee, Promenade, Sentruper HΓΆhe, Harbour, etc.)
- π§ Safety tips β Location-specific safety advice for every recommended activity
- π₯ Multi-user support β Add multiple participants, each with their own age, gender, and fitness level
- π Toast notifications β Real-time validation and error feedback (including backend failures) via React Toastify
| Layer | Technology |
|---|---|
| Framework | React 18 + Vite |
| Routing | React Router v6 |
| UI Components | React Bootstrap, Material UI (MUI) |
| Icons | FontAwesome |
| HTTP Client | Axios |
| Notifications | React Toastify |
| Styling | Bootstrap 5, custom CSS |
| Layer | Technology |
|---|---|
| Framework | FastAPI (Python) |
| Suggestion Engine | Custom Q-learning reinforcement learning agent |
| Weather API | WeatherAPI.com |
| Database | MongoDB (activity persistence with TTL index) |
| Activity Data | 64 curated JSON datasets (group Γ temperature Γ time) |
| Maps | Google Maps Directions API (via redirect URL) |
Breezeplan/ # React frontend
βββ src/
β βββ components/
β β βββ Navbarheader.jsx # Top navigation bar
β βββ pages/
β β βββ Landing.jsx # Landing / home page
β β βββ Getsuggestion.jsx # Main suggestion page (form + results)
β βββ App.jsx # Root component + route definitions
β βββ App.css # Global styles
β βββ main.jsx # App entry point
Breezeplan-api/ # FastAPI backend
βββ main.py # App entry point + CORS setup
βββ app/
β βββ routers/
β β βββ weather.py # POST /weather/weatherData
β β βββ activitySuggestions.py # POST /suggestionEngine/activitySuggestions
β β βββ dataHandler.py # CRUD /dataHandler/*
β βββ services/
β β βββ categorizer.py # Converts raw values β category bins
β β βββ dataSaveService.py # JSON file management + MD5 hashing
β β βββ reinforcementLearningAgent.py # Q-value update logic
β βββ externalServiceHandler/
β βββ dbConnection.py # MongoDB singleton
βββ outdoor_activity_data/ # 64 activity JSON files (auto-populated)
βββ data/ # Per-session Q-tables (auto-generated)
βββ generate_activity_data.py # Script to regenerate all activity files
- Node.js v18+
- Python 3.10+
- MongoDB (local or Atlas)
- A WeatherAPI.com API key (free tier is sufficient)
cd Breezeplan
npm install
npm run devThe app will be available at http://localhost:5173
cd Breezeplan-api
# Install Python dependencies
pip install fastapi uvicorn pymongo requests python-dotenv
# Add your WeatherAPI key
# Open app/routers/weather.py and set the API_KEY variable
# (Optional) Regenerate all 64 activity data files
python generate_activity_data.py
# Start the API server
uvicorn main:app --host 127.0.0.1 --port 5000 --reloadThe API will be available at http://localhost:5000
Interactive docs at http://localhost:5000/docs
Live deployment:
https://breezeplan-api.onrender.comβ interactive docs athttps://breezeplan-api.onrender.com/docs
cd Breezeplan
npm run buildOutput goes to dist/.
- Landing page β The user clicks Explore Breezeplan to begin.
- Fill in details β Enter available time (minutes) plus age, gender, and fitness level for each participant. Multiple people can be added.
- Submit β The app:
- Verifies GPS coordinates are available via the browser Geolocation API
- Calls the backend
/weather/weatherDataendpoint to fetch live temperature, humidity, wind speed, and precipitation from WeatherAPI.com - Sends all data (weather + group profile) to
/suggestionEngine/activitySuggestions
- Suggestion engine (backend):
- Categorises inputs into bins (e.g. temperature β Cold / Mild / Warm / Hot)
- Generates an MD5 hash of the categorised state
- Looks up the matching Q-table; initialises one from the appropriate activity file if new
- Sorts activities by Q-value and returns the top 6
- Applies a small Q-value penalty to shown suggestions (exploration incentive)
- Activity cards β A responsive grid shows each suggestion with image, description, group suitability, and time estimate.
- Activity detail modal β Clicking a card opens a modal with location name, lighting conditions, a Google Maps link, and safety tips.
| Activity | Location | Best For |
|---|---|---|
| Jogging | Aasee Lake Trail | Single / Couple, Mild/Warm, Short |
| Cycling | MΓΌnster Promenade Ring | All groups, Mild/Warm, ModerateβLong |
| Kayaking | Aasee Lake Rental Point | Couple / Small Group, Warm |
| Beach Volleyball | Aasee Beach Courts | Small / Large Group, Warm/Hot |
| Ice Skating | Eishalle MΓΌnster | All groups, Cold |
| Geocaching | MΓΌnster City & Surroundings | All groups, ColdβWarm |
| Stargazing | RΓΌschhaus Estate Fields | Single / Couple, Cold/Mild, Evening |
| Group Cycling Tour | MΓΌnsterβTelgte Cycle Route | Small / Large Group, Mild/Warm |
| Outdoor BBQ | Westpark BBQ Area | Groups, Warm/Hot, Extended |
| Zoo Visit | Allwetterzoo MΓΌnster | All groups, Any weather |
Fetches live weather for the user's coordinates.
Query params: latitude, longitude
Response:
{
"locationName": "Muenster",
"temperature": "12.4 Β°C",
"humidity": "72 %",
"windSpeed": "3.1 m/s",
"precipitation": "0.0 mm"
}Returns ranked activity suggestions based on weather and group profile.
Request body:
{
"latitude": 51.96,
"longitude": 7.62,
"temperature": 12.4,
"humidity": 72.0,
"windSpeed": 3.1,
"precipitation": 0.0,
"members": [
{ "gender": "Male", "age": 25, "fitnessLevel": "Intermediate" }
],
"timeRange": 60
}Response:
{
"success": true,
"data": [
{
"activity": "Cycling",
"description": "...",
"groupSuitability": "...",
"timeRequired": "45β90 min",
"image": "https://...",
"locationInfo": {
"pathNameOrLocationName": "MΓΌnster Promenade Ring",
"lighting": "Well-lit tree-lined boulevard",
"description": "...",
"redirectUrl": "https://maps.google.com/?q=...",
"safetyTips": ["...", "..."]
},
"tableHash": "abc123...",
"file_name": "couple_mild_moderate"
}
]
}Records the user's chosen activity to improve future suggestions (reward signal).
Request body:
{
"id": 2,
"activity": "Cycling",
"tableHash": "abc123...",
"category": "couple_mild_moderate"
}- Google Maps routing uses a static destination URL per activity; it does not dynamically calculate a route from the user's detected position.
- The Q-learning agent is session-local (JSON files); a shared database backend would allow learning from all users collectively.
- The app is optimised for MΓΌnster, Germany. Extending to other cities requires location-aware activity datasets.
- WeatherAPI.com free tier has a monthly request limit.
- User accounts and personal activity history
- Weather forecast view (not just current conditions) to help with planning ahead
- Embedded Leaflet or Mapbox map showing activity locations
- Dynamic route calculation from the user's GPS position to each venue
- Extend activity datasets beyond MΓΌnster to other cities
- FastAPI backend with real-time weather integration
- Reinforcement-learning suggestion engine
- 35+ curated activity entries with location info and safety tips
- Backend error surfacing via toast notifications
Jerry Vincent MSc Geoinformatics and Spatial Data Science β University of MΓΌnster GitHub Β· LinkedIn
This project was developed for academic purposes as part of coursework at the University of MΓΌnster. Feel free to use it as a reference or starting point for similar projects.