Interactive map to explore the 234,464 trees lining the sidewalks of Montevideo, Uruguay.
π³ View the map
- πΊοΈ Interactive map with all trees colored by species
- π² Info panel with tree details (species, height, condition, location)
- π· Species photos from Wikipedia with carousel
- π Filter by species with search and dynamic count
- ποΈ Filter by zone (18 CCZ municipal zones)
- π Address search using Mapbox Geocoding
- π Statistics modal with top species chart
- π Share tree via URL deep linking
- π Geolocation to center the map on your location
- π Report missing tree to contribute to the map
- π Dark/Light mode with dynamic map basemap
- π Internationalization (Spanish/English)
- πΈ Species details - blooming calendar, height ranges, flower colors, growth rates
- πΏ Native/introduced badges with species origin info
- πΆ Offline support with service worker caching
- π± Responsive - works on mobile and desktop
| Component | Technology |
|---|---|
| Framework | Next.js 16 |
| Map | MapLibre GL JS + PMTiles |
| Styles | Tailwind CSS |
| Theme | next-themes |
| i18n | next-intl |
| Forms | Formspree |
| Images | Wikipedia / Wikimedia Commons API |
| Testing | Vitest + React Testing Library + MSW |
| CI/CD | GitHub Actions |
| Deploy | Vercel |
arbolesmvd/
βββ .github/workflows/ # CI/CD (tests + build)
βββ data/ # Raw and processed data
β βββ raw/ # Census CSVs, WFS GeoJSON
β βββ processed/ # Unified dataset with coordinates
βββ scripts/ # Python processing scripts
β βββ merge_datasets.py
β βββ geocode_final.py
β βββ clean_common_names.py # Species name normalization
β βββ generate_geojson.py # Web data generation
βββ web/ # Next.js application
βββ src/
β βββ app/ # Pages (App Router)
β βββ components/ # Map, TreePanel, Filters, StatsModal, etc.
βββ public/ # Tree data (PMTiles + gzipped JSON)
cd web npm install echo "NEXT_PUBLIC_MAPBOX_TOKEN=your_token" > .env.local npm run dev
cd web npm test # Watch mode npm run test:run # Single run (CI) npm run test:coverage # Coverage report
The raw census data was cleaned and normalized:
- 100% species coverage - all 234,464 trees have common names assigned
- 359 unique species - duplicates and variants unified
- 566 scientific name corrections - fixed typos (BahuiniaβBauhinia, etc.)
- 2,553 data entry fixes - corrected mismatched species names
- Vector tiles - PMTiles format (17MB, all points at all zoom levels)
- Gzip compression - trees-data.json.gz (4.1MB vs 54MB)
Run the data pipeline:
python scripts/clean_common_names.py # Clean species names python scripts/generate_geojson.py # Generate web files tippecanoe -o web/public/trees.pmtiles --force --layer=trees \ --minimum-zoom=10 --maximum-zoom=16 \ --no-feature-limit --no-tile-size-limit -r1 web/public/trees.json gzip -k -9 web/public/trees-data.json # Compress data
- Tree Census 2008 - Montevideo City Government
- GeoWeb Montevideo - Geographic layers
Based on GieΓ den Kiez, a Berlin project that maps urban trees.
Created by Mathi Fonseca
Data comes from the 2008 municipal census. Some locations may have changed.