Takeout JSON

Fotos do Google Takeout sem localização? Recupere o GPS

Para onde vai a localização em uma exportação do Google Takeout, o que geoData e geoDataExif significam, por que muitos dizem 0.0, e como gravar o GPS de volta.

No Google Fotos você digitava "Gramado" e achava a viagem certa. Depois do Takeout, as mesmas fotos não têm localização nenhuma. O seu novo app de fotos mostra um mapa vazio. Alguém disse que o GPS está nos arquivos .json, você abriu um e encontrou 0.0.

Aqui está o que aconteceu e o que dá para recuperar de verdade.

Dois campos de localização, e o que significam

Cada JSON do Takeout tem dois blocos de localização:

"geoData": {
  "latitude": -29.3789,
  "longitude": -50.8748,
  "altitude": 830.0,
  "latitudeSpan": 0.0,
  "longitudeSpan": 0.0
},
"geoDataExif": {
  "latitude": -29.3789,
  "longitude": -50.8748,
  "altitude": 830.0
}

geoDataExif é a posição que estava no EXIF da própria foto quando você a enviou. Se a câmera do celular gravou GPS, está aqui. geoData é a localização que o Google Fotos usava, que começa com o mesmo valor mas também inclui lugares que você definiu ou corrigiu na mão dentro do app.

Quando os dois blocos dizem 0.0 para latitude e longitude, a foto não tem localização. Isso não é um lugar real; é o jeito do Google escrever "desconhecido". Muitas fotos estão nesse estado, mais do que as pessoas esperam.

Por que tantas fotos não têm GPS

Os celulares só gravam coordenadas quando o acesso à localização está ligado para a câmera. Muita gente desliga. Prints, imagens de WhatsApp, imagens baixadas e digitalizações nunca tiveram GPS. Câmeras antigas não tinham receptor.

O Google Fotos escondia isso de você. Ele estimava localizações a partir do seu histórico de localização e dos pontos de referência que reconhecia na imagem, e mostrava essas estimativas no app. Essas localizações estimadas não estão no JSON. Só as posições explícitas estão: do EXIF, ou de um lugar que você definiu na mão.

Em uma parte real de um Takeout com 991 fotos, 12 por cento dos JSON tinham coordenadas reais e 81 por cento tinham o 0.0 de preenchimento. A sua biblioteca vai variar, mas se a busca no Google Fotos funcionava para fotos que você nunca geolocalizou, ela dependia de estimativas que você não recebeu de volta.

Por que o GPS está faltando nos próprios arquivos

Para fotos que tinham GPS no EXIF, o Takeout normalmente devolve o arquivo com esse EXIF intacto. Então muitas fotos de câmera ainda carregam as coordenadas; o app para onde você migrou só não indexou ainda, ou estava olhando outro campo.

As exceções são fotos cujo EXIF foi apagado antes do envio, e fotos em que você definiu a localização dentro do Google Fotos. Para essas, o JSON é a única cópia. Se você apagar os JSON sem gravar, essa localização some.

Confira o que você tem de fato

Com o exiftool:

exiftool -r -if 'not $GPSLatitude' -ext jpg -ext heic -filename .

lista as imagens sem GPS no arquivo. Compare com os JSON que têm geoData diferente de zero, que você acha com grep:

grep -L '"latitude": 0.0' *.json

A interseção é o que dá para restaurar.

Restaure as coordenadas na mão

O exiftool copia o geoData do JSON para as tags GPS do EXIF:

exiftool -r -tagsfromfile "%d/%F.supplemental-metadata.json" \
  -if '$GeoDataLatitude ne 0 or $GeoDataLongitude ne 0' \
  "-GPSLatitude<GeoDataLatitude" "-GPSLatitudeRef<GeoDataLatitude" \
  "-GPSLongitude<GeoDataLongitude" "-GPSLongitudeRef<GeoDataLongitude" \
  "-GPSAltitude<GeoDataAltitude" \
  -ext jpg -ext jpeg -ext heic -overwrite_original .

A linha -if importa. Sem ela você grava 0.0, 0.0 em centenas de fotos, e toda exibição de mapa no seu app novo mostra um aglomerado no Oceano Atlântico na costa da África. As tags Ref pegam o sinal da coordenada, e é por isso que são definidas a partir do mesmo valor. Coordenadas brasileiras são negativas nos dois eixos (sul e oeste), então o sinal é essencial.

Repita com "%d/%F.json" para exportações antigas. Arquivos com nomes de JSON cortados e duplicatas (1) precisam de tratamento especial, como explicado no guia do exiftool.

Restaure com o app

O Takeout JSON Metadata Fixer faz o mesmo trabalho sem linha de comando, no macOS, no Windows e no Linux.

Ele lê o geoData primeiro, depois o geoDataExif, depois qualquer GPS que já esteja no arquivo, e grava as coordenadas no EXIF da foto. Ele trata 0.0, 0.0 como desconhecido e deixa essas fotos sem localização em vez de colocá-las no oceano. As datas são gravadas ao mesmo tempo, já que os dois problemas quase sempre vêm juntos.

Se você quer o lugar no nome do arquivo ou na pasta, o app transforma as coordenadas em nome de cidade e produz 2019-07-14-1105_Gramado.jpg, ou uma pasta 2019/Gramado. Essa consulta usa o OpenStreetMap, então precisa de internet e envia as coordenadas arredondadas, e nada mais, para esse serviço. Desligue e o app roda totalmente offline. Fotos sem localização simplesmente recebem um nome sem lugar.

As primeiras 1000 fotos são grátis. Depois disso, uma compra única de US$ 19,99 libera fotos ilimitadas.

Para fotos que nunca tiveram localização

Nada na exportação consegue recuperar uma posição que nunca foi registrada. Mas você pode adicionar uma. O Fotos da Apple, o digiKam e o Immich deixam você soltar uma foto no mapa. Para um lote, o app define um lugar para uma pasta inteira, digitado como nome de cidade ou coordenadas, e o exiftool consegue definir as mesmas coordenadas em uma pasta com um comando. Cobrimos as abordagens em adicionar localização a fotos sem GPS (em inglês).

Perguntas frequentes

O Google Fotos mostrava uma localização para esta foto. Por que o JSON está zerado?

Porque aquela localização foi estimada a partir do seu histórico de localização ou do conteúdo da imagem, e estimativas não são exportadas. Só coordenadas do arquivo ou de uma edição manual são.

Devo usar geoData ou geoDataExif?

O geoData inclui as suas correções manuais e fora isso é igual ao geoDataExif. Use geoData, e recorra ao geoDataExif se ele estiver zerado.

O Immich ou o Fotos da Apple vão ler o GPS depois da gravação?

Sim. Os dois leem as tags GPS padrão do EXIF, que é onde a gravação coloca. O Immich mostra no mapa depois de reindexar o arquivo.

Posso remover o GPS, por privacidade?

Pode. exiftool -gps:all= -overwrite_original . apaga de uma pasta inteira. Faça isso depois de organizar, se ainda quiser nomes de pasta por local.