Ir al contenido principal

Generar reporte a partir de coordenadas geográficas Google kml - json

 1. Exportar archivo Kml de Google historial de ubicaciones:


1.1. Dirigirse a https://takeout.google.com/settings/takeout

1.2. Tildar la casilla desmarcar todo.

1.3. Buscar en la página "Historial de ubicaciones" o "location history" y marcar solamente esa casilla.

1.4. Hacer click en el botón "Varios formatos"

1.5. Desplegar el menú JSON. Oprimir el botón "Aceptar"

1.6. Dirigirse a la parte inferior de la página y oprimir el botón "Siguiente paso"

1.7. Exportar una vez -> Crear exportación. Dejando la ventana abierta.

1.8. Aguardar uno o dos minutos y descargar el archivo zip.


2. Aguardar el plazo que sea necesario hasta recibir un correo electrónico en el que se indica que  el archivo se encuentra listo para ser descargado.

Descargar archivo. Descomprimir.

Dirigirse a la carpeta ~/Descargas/Takeout/Historial de ubicaciones/

Ejecutar el siguiente comando:

cat Records.json | grep -E 'latitudeE7|longitudeE7|timestamp' | grep -v '     "timestamp' | grep -v '      "latitude' | grep -v '      "longitude' > Historial.txt

Se obtendrá un listado del tipo: Latitud - Longitud - Fecha y hora

    "latitudeE7": -314195797,

    "longitudeE7": -641924020,

    "timestamp": "2013-12-26T18:58:38.087Z"

    "latitudeE7": -313554913,

    "longitudeE7": -642424666,

    "timestamp": "2020-06-10T18:14:13.529Z"


Abrir archivo Historial.txt, copiar y pegar el día a analizar en archivo ODS.

Al pegar - Text import: Marcar casillas:

Comma

Other:  :

String delimiter:  "

El archivo ODS eliminar la primera columna y colocar las siguientes funciones:

C1: =B1/10000000

C2: =B2/10000000

Eliminar de la fecha los últimos 5 caracteres .000Z para ello colocarse en la columna contigua a la fecha y colocar la siguiente fórmula:

C3: =REPLACE(LEFT(B3;19);11;1;" ")

C,D,E: =OFFSET($C$1;COLUMN()-4+(ROW()-1)*3;0)

3. Copiar las columnas C,D,E al archivo XLSX

4. Importar archivo XLSX en mymaps.


Opcional:

Modificar fecha y hora para que posean GMT-3



Select cells containing the text (or the column)

Data -> Text to Columns...

Select dropdown in Fields Column type: Date (MDY) (to activate click the heading which by default is named Standard)

Click OK

(No es necesario esto: Format Cells -> Tab: Numbers and enter YYYY-MM-DDTHH:MM:SS in Format Code - Click OK)


Finalmente restar 3 horas de la hora:
En una nueva celda de Calc:

=C1-"03:00"


Buscar en google: my maps google

El segundo hipervínculo: 

https://www.google.com/maps/d/ 

Crear nuevo mapa.

Importar archivo XLSX.



A continuación, procedimiento anterior - Ya no aplica por no poder descargar archivo KML.

3. Realizar la descarga del archivo Kml, el cual tendrá un formato de estas características:


<?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'>
 <Document>
  <Placemark>
   <open>1</open>
   <gx:Track>
    <altitudeMode>clampToGround</altitudeMode>
   <when>2012-01-01T00:47:26Z</when>
    <gx:coord>-58.455349 -34.559293 0</gx:coord>
    <when>2012-01-01T01:47:28Z</when>
    <gx:coord>-58.455349 -34.559293 0</gx:coord>
    <when>2012-01-01T11:36:50Z</when>
    <gx:coord>-58.45887199999999 -34.554283999999996 0</gx:coord>
    <when>2012-01-01T12:04:57Z</when>

   </gx:Track>
  </Placemark>
 </Document>
</kml>



4. Identificar la coordenada sobre la cual se desea realizar el reporte de ingresos egresos y estadías.

5. Configurar y ejecutar el siguiente programa Python el cual generará un reporte 

Para la fecha 14/10/2015 hubo dos ingresos/egresos y el celular se encontró en la cuadrícula seleccionada a lo largo de 7,17hs como mínimo.



# -*- coding: utf-8 -*-
"""
Created on Sat Nov 14 19:46:18 2020

@author: Andres Aliaga
"""


# Import BeautifulSoup
from bs4 import BeautifulSoup as bs
from datetime import datetime, timedelta
from collections import defaultdict, namedtuple

content = []
# av poeta lugones 222, cordoba
# coordenadas -31.426343, -64.179841

lat1 = -31.426343 - 0.002
lat2 = -31.426343 + 0.002
long1 = -64.179841 - 0.002
long2 = -64.179841 + 0.002

# lat1 = -31.292341
# lat2 = -31.290324
# long1 = -64.290692
# long2 = -64.288309

fechaHoraInicio = "" 
registros = []
registrosPorFecha = []
dentroDeCuadricula = False
# Read the XML file
with open("HistorialUbicaciones.kml", "r") as file:
    # Read each line in the file, readlines() returns a list of lines
    content = file.readlines()
    # Combine the lines in the list into a string
    content = "".join(content)
    bs_content = bs(content, "lxml")
    # bs_content = bs(file, "lxml")
    when=bs_content.find_all("when")
    coord=bs_content.find_all("gx:coord")
    
    # Fecha hora inicio, fecha hora fin 
    # Marcar cuando ingresa en la cuadrícula
    # Marcar cuando egresa dela cuadrícula
    
    for w, c in zip(when, coord):
        fechaHora = datetime.strptime(w.get_text(), "%Y-%m-%dT%H:%M:%S%z") - timedelta(hours=3)
        longS, latS, *cero = c.get_text().split();
        try:
            lat = float(latS)
            long = float(longS)
            if lat1 < lat < lat2 and long1 < long < long2:
                if not dentroDeCuadricula:
                    fechaHoraInicio = fechaHora
                    dentroDeCuadricula = True
            else:
                if dentroDeCuadricula:
                    diferencia = fechaHora - fechaHoraInicio
                    days, seconds = diferencia.days, diferencia.seconds
                    hours = days * 24 + seconds / 3600
                    # print("Fecha: " +fechaHoraInicio.strftime("%Y-%m-%d") + " Horas: "+ str(hours) + " Inicio: "+fechaHoraInicio.strftime("%Y-%m-%dT%H:%M:%S") + " - Fin: " +fechaHora.strftime("%Y-%m-%dT%H:%M:%S"))
                    dentroDeCuadricula = False
                    registros.append([fechaHoraInicio.date(),hours])
        except:
            print("Error en línea: " + fechaHora + " " + lat + long)
    
    # Agrupar registros de la misma fecha y acumular la cantidad de horas en el lugar
    Entry = namedtuple('fecha',[ 'horas'])
    processed_data = defaultdict(lambda: Entry(horas=[]))
    
    
    for entry in registros:
        fecha,  horas = entry
        fechaStr = fecha.strftime("%Y/%m/%d")
        processed_data[fechaStr].horas.append(horas)
    
    registrosCompactos = [[fechaStr, len(entry.horas), sum(entry.horas)] for fechaStr, entry in processed_data.items()]  
    for registroCompacto in registrosCompactos:
        print(registroCompacto[0] + ", "+ str(registroCompacto[1]) + ", "+str(registroCompacto[2]))  





Comentarios