Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I read my Google Location History in R

Tags:

r

google-maps

gis

I found my Google Location History at

https://maps.google.co.uk/locationhistory/b/0/?hl=en-GB

I then downloaded the KML file

I installed rgdal correctly but am unable to read the file

I put the file name and layer name as from https://gis.stackexchange.com/questions/58131/how-to-efficiently-read-a-kml-file-into-r

 hist = readOGR(dsn="/home/ajay/Desktop/history-05-04-2015",layer="Location history from 05/05/2015 to 06/04/2015")

this is how file looks like

    <?xml version="1.0" encoding="UTF-8"?>
    <kml xmlns="http://www.opengis.net/kml/2.2"         xmlns:gx="http://www.google.com/kml/ext/2.2"       xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
 <name>Location history from 05/05/2015 to 06/04/2015</name>
<open>1</open>
<description/>
<StyleMap id="multiTrack">

This is the error

>Error in ogrInfo(dsn = dsn, layer = layer, encoding = encoding, use_iconv = use_iconv,  : 
 Cannot open file

Additional Information

> ogrDrivers()
             name write
1          AVCBin FALSE
2          AVCE00 FALSE
3             BNA  TRUE
4             CSV  TRUE
5             DGN  TRUE
6            DODS FALSE
7             DXF  TRUE
8  ESRI Shapefile  TRUE
9      Geoconcept  TRUE
10        GeoJSON  TRUE
11         GeoRSS  TRUE
12            GML  TRUE
13            GMT  TRUE
14  GPSTrackMaker  TRUE
15            GPX  TRUE
16     Interlis 1  TRUE
17     Interlis 2  TRUE
18            KML  TRUE
19   MapInfo File  TRUE
20         Memory  TRUE
21          MySQL  TRUE
22           ODBC  TRUE
23           OGDI FALSE
24         PCIDSK FALSE
25           PGeo FALSE
26     PostgreSQL  TRUE
27            REC FALSE
28            S57  TRUE
29           SDTS FALSE
30         SQLite  TRUE
31          TIGER  TRUE
32        UK .NTF FALSE
33            VFK FALSE
34            VRT FALSE
35         XPlane FALSE

> sessionInfo()
R version 3.2.0 (2015-04-16)
Platform: i686-pc-linux-gnu (32-bit)
Running under: Ubuntu precise (12.04.5 LTS)

locale:
 [1] LC_CTYPE=en_IN.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_IN.UTF-8        LC_COLLATE=en_IN.UTF-8    
 [5] LC_MONETARY=en_IN.UTF-8    LC_MESSAGES=en_IN.UTF-8   
 [7] LC_PAPER=en_IN.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
 [11] LC_MEASUREMENT=en_IN.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

other attached packages:
[1] rgdal_0.9-3 sp_1.1-0   

loaded via a namespace (and not attached):
[1] tools_3.2.0     grid_3.2.0      lattice_0.20-31
like image 573
Ajay Ohri Avatar asked Jun 03 '15 03:06

Ajay Ohri


2 Answers

I read a file into a trajectories:Track object with:

filename = "history-06-14-2015.kml"

library(XML)
kml <- xmlToList(filename)

tr = kml$Document$Placemark$Track
cc = which(names(tr) == "coord")
coord = t(sapply(kml$Document$Placemark$Track[cc], function(x) scan(text = x, quiet = TRUE)))[,1:2]
when = which(names(tr) == "when")
# convert the "-07:00" into " -0700" with sub:
time = strptime(sub("([+\\-])(\\d\\d):(\\d\\d)$", " \\1\\2\\3",
  unlist(kml$Document$Placemark$Track[when])), "%Y-%m-%dT%H:%M:%OS %z")


library(sp)
library(spacetime)
library(trajectories)
track = Track(STI(SpatialPoints(coord, CRS("+proj=longlat +ellps=WGS84")), 
    time))
summary(track)
plot(track, axes = TRUE)

The sub call takes care of different time zones; R's strptime can't read e.g. -07:00, but does understand -0700.

You can convert it into a data.frame by:

as(track, "data.frame")

More recently (since July 2015), google allows you to download a copy of all your data. You can import the json file thus obtained by

library(jsonlite)
system.time(x <- fromJSON("Location History/LocationHistory.json"))
loc = x$locations
loc$time = as.POSIXct(as.numeric(x$locations$timestampMs)/1000, 
    origin = "1970-01-01")

loc$lat = loc$latitudeE7 / 1e7
loc$lon = loc$longitudeE7 / 1e7

library(sp)
loc.sp = loc
coordinates(loc.sp) = ~lon+lat
proj4string(loc.sp) = CRS("+proj=longlat +datum=WGS84")

library(spacetime)
library(trajectories)
tr = Track(STIDF(geometry(loc.sp), loc.sp$time, loc.sp@data))
plot(tr)

this data set also has accuracy information, and activity mode classifications.

like image 174
Edzer Pebesma Avatar answered Oct 15 '22 04:10

Edzer Pebesma


Normally it should work like this:

library(rgdal)
kml_fname <- "path/to/history-05-04-2015.kml"
tracks <- readOGR(kml_fname, ogrListLayers(kml_fname)[1])

But I see:

Error in ogrInfo(dsn = dsn, layer = layer, encoding = encoding, use_iconv = use_iconv,  : 
  object 'keepGeoms' not found
In addition: Warning message:
In ogrFIDs(dsn = dsn, layer = layer) : no features found

There are possibly issues with the KML driver. A slightly better driver is LIBKML, but it isn't installed for my version of rgdal (and it is difficult to do so).


You could try converting the KML file to a GML using GDAL with LIBKML. For example, from a command prompt, first run ogrinfo to see if you can read the file with LIBKML, then try running ogr2ogr to convert it:

ogrinfo history-05-04-2015.kml
INFO: Open of `history-05-04-2015.kml'
      using driver `LIBKML' successful.
1: history-05-04-2015
ogr2ogr -f GML history-05-04-2015.gml history-05-04-2015.kml

(Note: I also see "Warning 1: Layer name 'history-05-04-2015' adjusted to 'history_05_04_2015' for XML validity.")

Then in R:

gml_fname <- "path/to/history-05-04-2015.gml"
tracks <- readOGR(gml_fname, ogrListLayers(gml_fname)[1])

which shows

OGR data source with driver: GML 
Source: "C:\Users\mtoews\Downloads\history-05-04-2015.gml", layer: "history_05_04_2015"
with 1 features
It has 12 fields
Warning message:
In readOGR(gml_fname, ogrListLayers(gml_fname)[1]) : Z-dimension discarded

But the result otherwise works fine with, e.g. plot(tracks)

like image 22
Mike T Avatar answered Oct 15 '22 04:10

Mike T