Skip to content

Rust library to parse 'Records.json', found in Google Location History Takeout.

Notifications You must be signed in to change notification settings

leighleighleigh/location_history

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

55 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Use Google location history files in rust

Preface

This is a personal fork, modified to work with the latest location history format.

Overall the crate isn't too complicated - serde_json does all the heavy lifting.

I'm experimenting with channel-based 'streaming deserialization', and parsing of the activity field for filtering by vehicle,walking,running, etc.

[NEW] CLI tool

Feel free to hack on the main.rs file to suit your needs - here's the current behaviour.

$ cargo run --release -- load -h

Google Takeout Records.json Parser

Usage: location-history load [OPTIONS] <RECORDS_JSON_PATH>

Arguments:
  <RECORDS_JSON_PATH>  

Options:
  -s <START_DATE>                                                           
  -e <END_DATE>                                                             
  -a <ACTIVITY_TYPE>                                                        
  -c <CENTER_POINT_RADIUS> <CENTER_POINT_RADIUS> <CENTER_POINT_RADIUS>      
  -n <RECORD_LIMIT>                                                         
  -h, --help                                                                Print help
  -V, --version                                                             Print version

$ time cargo run --release -- load -s 16_07_14 -e 16_12_31 -a ON_FOOT ./Records.json


▁ Loading data...
▃ 9497 loaded, 9498 parsed
▄ 17057 loaded, 17058 parsed
▅ 25896 loaded, 25897 parsed
▆ 32758 loaded, 32759 parsed
▇ 35276 loaded, 35277 parsed
█ 41312 loaded, 41313 parsed
▇ 47167 loaded, 47168 parsed
▆ 55245 loaded, 57357 parsed
▅ 55245 loaded, 66037 parsed
▄ 55245 loaded, 74737 parsed
▃ 55245 loaded, 83012 parsed
▁ 55245 loaded, 90787 parsed
▃ 55245 loaded, 98813 parsed
▄ 55245 loaded, 107049 parsed
▅ 55245 loaded, 115221 parsed
▆ 55245 loaded, 123202 parsed
▇ 55245 loaded, 132338 parsed
█ 55245 loaded, 140770 parsed
▇ 55245 loaded, 148030 parsed
▆ 55245 loaded, 155555 parsed
▅ 55245 loaded, 163543 parsed
▄ 55245 loaded, 171296 parsed
▃ 55245 loaded, 179303 parsed
▁ 55245 loaded, 187386 parsed
▃ 55245 loaded, 193966 parsed
▄ 55245 loaded, 202729 parsed
▅ 55245 loaded, 211105 parsed
▆ 55245 loaded, 218423 parsed
▇ 55245 loaded, 226045 parsed
█ 55245 loaded, 232931 parsed
▇ 55245 loaded, 240643 parsed
▆ 55245 loaded, 248362 parsed
▅ 55245 loaded, 256462 parsed
▄ 55245 loaded, 264904 parsed
▃ 55245 loaded, 273938 parsed
▁ 55245 loaded, 284577 parsed
▃ 55245 loaded, 295814 parsed
▄ 55245 loaded, 303754 parsed
▅ 55245 loaded, 312129 parsed
▆ 55245 loaded, 321066 parsed
▇ 55245 loaded, 330021 parsed
█ 55245 loaded, 338325 parsed
▇ 55245 loaded, 343907 parsed
▆ 55245 loaded, 350751 parsed
▅ 55245 loaded, 359855 parsed
▄ 55245 loaded, 370108 parsed
▃ 55245 loaded, 379673 parsed
▁ 55245 loaded, 389750 parsed
▃ 55245 loaded, 397889 parsed
▄ 55245 loaded, 403512 parsed
▅ 55245 loaded, 409405 parsed
▆ 55245 loaded, 415234 parsed
▇ 55245 loaded, 421239 parsed
█ 55245 loaded, 429169 parsed
▇ 55245 loaded, 442041 parsed
▆ 55245 loaded, 451769 parsed
▅ 55245 loaded, 456680 parsed
▄ 55245 loaded, 461472 parsed
▃ 55245 loaded, 467931 parsed
▁ 55245 loaded, 473227 parsed
▃ 55245 loaded, 478728 parsed
▄ 55245 loaded, 484985 parsed
▅ 55245 loaded, 491081 parsed
▆ 55245 loaded, 493596 parsed
▇ 55245 loaded, 495574 parsed
█ 55245 loaded, 498119 parsed
▇ 55245 loaded, 500104 parsed
▆ 55245 loaded, 502196 parsed
▅ 55245 loaded, 504005 parsed
▄ 55245 loaded, 506063 parsed
▃ 55245 loaded, 508261 parsed
▁ 55245 loaded, 510700 parsed
▃ 55245 loaded, 512659 parsed
▄ 55245 loaded, 514465 parsed
▅ 55245 loaded, 516667 parsed
▆ 55245 loaded, 518807 parsed
▇ 55245 loaded, 520361 parsed
█ 55245 loaded, 522457 parsed
▇ 55245 loaded, 525175 parsed
▆ 55245 loaded, 527851 parsed
▅ 55245 loaded, 529711 parsed
▄ 55245 loaded, 531806 parsed
▃ 55245 loaded, 534002 parsed
▁ 55245 loaded, 536125 parsed
▃ 55245 loaded, 537992 parsed
▄ 55245 loaded, 540123 parsed
▅ 55245 loaded, 542547 parsed
▆ 55245 loaded, 544919 parsed
▇ 55245 loaded, 546974 parsed
█ 55245 loaded, 549210 parsed
▇ 55245 loaded, 552171 parsed
▆ 55245 loaded, 558413 parsed
▅ 55245 loaded, 563881 parsed
▄ 55245 loaded, 568856 parsed
▃ 55245 loaded, 574394 parsed
▁ 55245 loaded, 579690 parsed
▃ 55245 loaded, 585639 parsed
▄ 55245 loaded, 591096 parsed
▅ 55245 loaded, 597254 parsed
▆ 55245 loaded, 603402 parsed
▇ 55245 loaded, 609263 parsed
█ 55245 loaded, 613613 parsed
▇ 55245 loaded, 616941 parsed
▆ 55245 loaded, 619030 parsed
▅ 55245 loaded, 620978 parsed
▄ 55245 loaded, 623666 parsed
▃ 55245 loaded, 629510 parsed
▁ 55245 loaded, 632657 parsed
▃ 55245 loaded, 634544 parsed
▄ 55245 loaded, 639727 parsed
▅ 55245 loaded, 645876 parsed
▆ 55245 loaded, 647727 parsed
▇ 55245 loaded, 649986 parsed
█ 55245 loaded, 652174 parsed
▇ 55245 loaded, 654020 parsed
▆ 55245 loaded, 655838 parsed
▅ 55245 loaded, 657455 parsed
▄ 55245 loaded, 662272 parsed
▃ 55245 loaded, 665310 parsed
▁ 55245 loaded, 670515 parsed
▃ 55245 loaded, 675349 parsed
▄ 55245 loaded, 680533 parsed
▅ 55245 loaded, 685809 parsed
▆ 55245 loaded, 691005 parsed
▇ 55245 loaded, 692980 parsed
█ 55245 loaded, 694782 parsed
▇ 55245 loaded, 696516 parsed
▆ 55245 loaded, 701455 parsed
▅ 55245 loaded, 706447 parsed
▄ 55245 loaded, 708249 parsed
▃ 55245 loaded, 710214 parsed
▁ 55245 loaded, 712253 parsed
▃ 55245 loaded, 714070 parsed
▄ 55245 loaded, 715965 parsed
▅ 55245 loaded, 717914 parsed
▆ 55245 loaded, 720164 parsed
▇ 55245 loaded, 725510 parsed
█ 55245 loaded, 730597 parsed
▇ 55245 loaded, 735854 parsed
▆ 55245 loaded, 741230 parsed
▅ 55245 loaded, 745384 parsed
▄ 55245 loaded, 751580 parsed
▃ 55245 loaded, 757656 parsed
▁ 55245 loaded, 762734 parsed
▃ 55245 loaded, 768767 parsed
▄ 55245 loaded, 774612 parsed
▅ 55245 loaded, 780441 parsed
▆ 55245 loaded, 786887 parsed
▇ 55245 loaded, 792711 parsed
█ 55245 loaded, 797927 parsed
▇ 55245 loaded, 803439 parsed
▆ 55245 loaded, 809647 parsed
▅ 55245 loaded, 814455 parsed
▄ 55245 loaded, 819956 parsed
▃ 55245 loaded, 826401 parsed
▁ 55245 loaded, 832499 parsed
▃ 55245 loaded, 837785 parsed
▄ 55245 loaded, 844075 parsed
▅ 55245 loaded, 849849 parsed
▆ 55245 loaded, 855239 parsed
▇ 55245 loaded, 860745 parsed
█ 55245 loaded, 865827 parsed
▇ 55245 loaded, 871283 parsed
▆ 55245 loaded, 877259 parsed
▅ 55245 loaded, 883342 parsed
▄ 55245 loaded, 889634 parsed
▃ 55245 loaded, 895768 parsed
▁ 55245 loaded, 902703 parsed
▃ 55245 loaded, 909269 parsed
▄ 55245 loaded, 915690 parsed
▅ 55245 loaded, 923030 parsed
▆ 55245 loaded, 930288 parsed
▇ 55245 loaded, 937274 parsed
█ 55245 loaded, 944582 parsed
▇ 55245 loaded, 951927 parsed
▆ 55245 loaded, 959433 parsed
▅ 55245 loaded, 966225 parsed
▄ 55245 loaded, 973318 parsed
▃ 55245 loaded, 980677 parsed
▁ 55245 loaded, 987646 parsed
▃ 55245 loaded, 994483 parsed
▄ 55245 loaded, 1000609 parsed
▅ 55245 loaded, 1007247 parsed
▆ 55245 loaded, 1014674 parsed
▇ 55245 loaded, 1020981 parsed
█ 55245 loaded, 1027804 parsed
▇ 55245 loaded, 1034590 parsed
▆ 55245 loaded, 1040318 parsed
▅ 55245 loaded, 1046889 parsed
▄ 55245 loaded, 1053354 parsed
▃ 55245 loaded, 1060033 parsed
▁ 55245 loaded, 1066480 parsed
▃ 55245 loaded, 1073163 parsed
▄ 55245 loaded, 1078945 parsed
▅ 55245 loaded, 1087130 parsed
▆ 55245 loaded, 1093550 parsed
▇ 55245 loaded, 1102463 parsed
█ 55245 loaded, 1109880 parsed
▇ 55245 loaded, 1117600 parsed
▆ 55245 loaded, 1123357 parsed
▅ 55245 loaded, 1129441 parsed
▄ 55245 loaded, 1136545 parsed
▃ 55245 loaded, 1143145 parsed
▁ 55245 loaded, 1150006 parsed
▃ 55245 loaded, 1155874 parsed
▄ 55245 loaded, 1161999 parsed
▅ 55245 loaded, 1168474 parsed
▆ 55245 loaded, 1174630 parsed
▇ 55245 loaded, 1181953 parsed
█ 55245 loaded, 1188966 parsed
▇ 55245 loaded, 1195900 parsed
▆ 55245 loaded, 1202323 parsed
▅ 55245 loaded, 1208187 parsed
▄ 55245 loaded, 1214046 parsed
▃ 55245 loaded, 1219777 parsed
▁ 55245 loaded, 1224482 parsed
▃ 55245 loaded, 1227181 parsed
▄ 55245 loaded, 1229707 parsed
▅ 55245 loaded, 1232522 parsed
▆ 55245 loaded, 1235391 parsed
▇ 55245 loaded, 1238954 parsed
█ 55245 loaded, 1241586 parsed
▇ 55245 loaded, 1242880 parsed
▆ 55245 loaded, 1243840 parsed
▅ 55245 loaded, 1244463 parsed
▄ 55245 loaded, 1245786 parsed
▃ 55245 loaded, 1248355 parsed
▁ 55245 loaded, 1250508 parsed
▃ 55245 loaded, 1253369 parsed
▄ 55245 loaded, 1255883 parsed
▅ 55245 loaded, 1258214 parsed
▆ 55245 loaded, 1259952 parsed
▇ 55245 loaded, 1262400 parsed
█ 55245 loaded, 1263968 parsed
▇ 55245 loaded, 1264981 parsed
▆ 55245 loaded, 1266251 parsed
▅ 55245 loaded, 1267305 parsed
▄ 55245 loaded, 1268187 parsed
▃ 55245 loaded, 1269030 parsed
▁ 55245 loaded, 1270574 parsed
▃ 55245 loaded, 1273289 parsed
▄ 55245 loaded, 1276524 parsed
▅ 55245 loaded, 1279293 parsed
▆ 55245 loaded, 1282924 parsed
▇ 55245 loaded, 1284133 parsed
█ 55245 loaded, 1286860 parsed
▇ 55245 loaded, 1290268 parsed
▆ 55245 loaded, 1291805 parsed
▅ 55245 loaded, 1292995 parsed
▄ 55245 loaded, 1294369 parsed
▃ 55245 loaded, 1295594 parsed
▁ 55245 loaded, 1296972 parsed
▃ 55245 loaded, 1298062 parsed
▄ 55245 loaded, 1299794 parsed
▅ 55245 loaded, 1303343 parsed
▆ 55245 loaded, 1306578 parsed
▇ 55245 loaded, 1309997 parsed
█ 55245 loaded, 1313755 parsed
▇ 55245 loaded, 1317646 parsed
▆ 55245 loaded, 1321707 parsed
▅ 55245 loaded, 1325122 parsed
▄ 55245 loaded, 1329084 parsed
▃ 55245 loaded, 1333486 parsed
▁ 55245 loaded, 1337555 parsed
▃ 55245 loaded, 1341443 parsed
▄ 55245 loaded, 1344391 parsed
▅ 55245 loaded, 1348171 parsed
▆ 55245 loaded, 1351174 parsed
▇ 55245 loaded, 1354109 parsed
█ 55245 loaded, 1358098 parsed
▇ 55245 loaded, 1360149 parsed
▆ 55245 loaded, 1361828 parsed
▅ 55245 loaded, 1363490 parsed
▄ 55245 loaded, 1365263 parsed
▃ 55245 loaded, 1367030 parsed
▁ 55245 loaded, 1368953 parsed
▃ 55245 loaded, 1370580 parsed
▄ 55245 loaded, 1372289 parsed
▅ 55245 loaded, 1373755 parsed
▆ 55245 loaded, 1375485 parsed
▇ 55245 loaded, 1377063 parsed
█ 55245 loaded, 1378774 parsed
▇ 55245 loaded, 1380548 parsed
▆ 55245 loaded, 1382109 parsed
▅ 55245 loaded, 1383760 parsed
▄ 55245 loaded, 1385309 parsed
▃ 55245 loaded, 1387630 parsed
▁ 55245 loaded, 1388983 parsed
▃ 55245 loaded, 1390578 parsed
▄ 55245 loaded, 1392082 parsed
▅ 55245 loaded, 1393612 parsed
▆ 55245 loaded, 1395237 parsed
▇ 55245 loaded, 1397250 parsed
█ 55245 loaded, 1399378 parsed
▇ 55245 loaded, 1401303 parsed
55245 returned, 1403330 parsed

Getting started (original)

extern crate location_history;

use location_history::LocationsExt;

let mut contents = String::new();
File::open(file).unwrap().read_to_string(&mut contents).unwrap();
let locations = location_history.deserialize(&contents).filter_outliers();
for location in locations {
    println!("{:?}", location);
}

About

Rust library to parse 'Records.json', found in Google Location History Takeout.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Rust 96.2%
  • Nix 2.9%
  • Just 0.9%