Sinds eind 2023 heeft Google de Timeline functie ingrijpend gewijzigd. Je locatiegeschiedenis wordt nu alleen lokaal op je telefoon opgeslagen en niet meer in de cloud. Dit betekent:
- Google Takeout op je desktop werkt niet meer voor Timeline data
- De oude export-methodes en online handleidingen zijn verouderd
- Je data is moeilijker te exporteren en te back-uppen
Dit project helpt je om je geëxporteerde Timeline data om te zetten naar een MariaDB database, zodat je:
- Je locatiegeschiedenis veilig kunt bewaren
- Krachtige queries kunt uitvoeren (per jaar, maand, week, dag)
- Reizen en gebeurtenissen kunt labelen ("2021 Vakantie Zweden")
- Je data kunt delen of visualiseren
Dit is de eerste iteratie, in de tweede iteratie zal een gui met kaart worden toegevoegd.
- Open Instellingen op je Android telefoon
- Ga naar Locatie
- Tik op Locatieservices
- Kies Tijdslijn
- Tik op Tijdslijn gegevens exporteren
- De export wordt opgeslagen op je Android apparaat
Let op: Na de export moet je het bestand zelf verplaatsen naar je computer (via USB, cloud opslag, of bestandsdeling) om het te kunnen importeren in de database.
Systeem om Google Timeline JSON data te importeren in een MariaDB database met uitgebreide query mogelijkheden.
| Bestand | Beschrijving |
|---|---|
schema.sql |
Database schema met alle tabellen, indexen en views |
import_timeline.py |
Python script voor het importeren van JSON data |
queries.sql |
Voorbeeldqueries voor periode selecties en event tags |
mysql -u root -p < schema.sqlOf in MySQL/MariaDB:
SOURCE /pad/naar/schema.sql;pip install mysql-connector-pythonpython import_timeline.py \
--file timeline.json \
--host localhost \
--user root \
--password jouw_wachtwoord \
--database timeline_dbMeerdere bestanden:
python import_timeline.py -f file1.json file2.json file3.json -u root -p wachtwoord┌─────────────────────┐
│ visits │ ← Bezoeken aan locaties
├─────────────────────┤
│ id │
│ start_time │
│ end_time │
│ year, month, week │ ← Generated columns voor snelle queries
│ date, day_of_week │
│ duration_minutes │
│ location_id → ──────┼──┐
│ place_id │ │
│ semantic_type │ │
└─────────────────────┘ │
│
┌─────────────────────┐ │
│ locations │ ←┘
├─────────────────────┤
│ id │
│ place_id │
│ latitude, longitude │
│ name │ ← Handmatige naam
│ semantic_type │ ← HOME, WORK, etc.
│ city, country │
└─────────────────────┘
┌─────────────────────┐
│ activities │ ← Verplaatsingen
├─────────────────────┤
│ id │
│ start_time │
│ end_time │
│ year, month, week │
│ start_lat/lng │
│ end_lat/lng │
│ activity_type │ ← WALKING, IN_VEHICLE, etc.
│ distance_meters │
└─────────────────────┘
┌─────────────────────┐
│ event_tags │ ← Labels voor periodes
├─────────────────────┤
│ id │
│ name │ ← "2021 Vakantie Zweden"
│ description │
│ start_date │
│ end_date │
│ color │
└─────────────────────┘
-- Per jaar
SELECT * FROM visits WHERE year = 2021;
-- Per maand
SELECT * FROM visits WHERE year = 2021 AND month = 7;
-- Per week (ISO week nummer)
SELECT * FROM visits WHERE year = 2021 AND week = 28;
-- Per dag
SELECT * FROM visits WHERE date = '2021-07-15';
-- Datum bereik
SELECT * FROM visits
WHERE date BETWEEN '2021-07-10' AND '2021-07-28';-- Nieuwe tag aanmaken
INSERT INTO event_tags (name, description, start_date, end_date, color)
VALUES ('2021 Vakantie Zweden', 'Camper trip door Zweden', '2021-07-10', '2021-07-28', '#4CAF50');
-- Visits automatisch koppelen aan tag
INSERT INTO visit_tags (visit_id, tag_id)
SELECT v.id, t.id
FROM visits v
CROSS JOIN event_tags t
WHERE t.name = '2021 Vakantie Zweden'
AND v.date BETWEEN t.start_date AND t.end_date;
-- Of gebruik de stored procedure:
CALL tag_period('2021 Vakantie Zweden', 'Camper trip', '2021-07-10', '2021-07-28', '#4CAF50');-- Specifieke locatie een naam geven
UPDATE locations
SET name = 'Thuis', city = 'Zwolle', country = 'Nederland'
WHERE place_id = 'ChIJdapJY0Tfx0cRelHsZwUUmG4';
-- Alle HOME locaties labelen
UPDATE locations
SET name = 'Thuis'
WHERE semantic_type = 'HOME' AND name IS NULL;
-- Meest bezochte locaties vinden (voor naamgeving)
SELECT
l.place_id,
l.latitude,
l.longitude,
COUNT(v.id) as bezoeken
FROM locations l
JOIN visits v ON l.id = v.location_id
WHERE l.name IS NULL
GROUP BY l.id
ORDER BY bezoeken DESC
LIMIT 20;-- Maandelijkse samenvatting
SELECT * FROM monthly_summary WHERE year = 2021;
-- Dagelijkse samenvatting
SELECT * FROM daily_summary WHERE year = 2021 AND month = 7;
-- Periode rapport via procedure
CALL period_report('2021-07-01', '2021-07-31');| View | Beschrijving |
|---|---|
daily_summary |
Dagelijkse statistieken |
monthly_summary |
Maandelijkse statistieken |
visits_with_locations |
Visits met locatienamen |
activities_detailed |
Activities met type namen |
Het event tag systeem maakt het mogelijk om periodes te labelen:
- Tag aanmaken met naam, beschrijving, begin/einddatum
- Automatisch koppelen van visits en activities op basis van datum
- Queries per tag om alle data voor een gebeurtenis op te halen
Voorbeelden van tags:
- "2021 Vakantie Zweden"
- "2019 Voorjaar Motor rit"
- "2022 Kerst Familie"
- "2020 Lockdown"
Locaties kunnen op twee manieren een naam krijgen:
- Handmatig - Via UPDATE queries
- Reverse Geocoding - Via externe API ( komt in 2e iteratie)
Voor reverse geocoding kun je de Nominatim API gebruiken:
https://nominatim.openstreetmap.org/reverse?lat=52.5319&lon=6.1045&format=json
- Performance: De generated columns (year, month, week, date) zijn geïndexeerd voor snelle queries
- Grote bestanden: Gebruik
--batch-sizeparameter voor geheugen beheer - Backup: Maak regelmatig backups:
mysqldump -u root -p timeline_db > backup.sql - Import controle: Check na import met
SELECT COUNT(*) FROM visits;