Animais domésticos: fotos úteis

Autor

Darren Norris

Objetivo

Mapear a localização de fotos georreferenciadas no R.

Especificamente, aqui utilizamos o caso dos animais domésticos do Campus Marco Zero para mostrar como:

  • Carregar uma foto.

  • Obter informações úteis (coordenadas geograficas, data, hora).

  • Mapeie o local onde a foto foi tirada.

  • Organize os dados em diferentes formatos prontos para análises subsequentes.

O exemplo só funcionará se os fotos ainda possuem as informações originais

  • Não use o WhatsApp para compartilhar fotos -
    todos os dados originais de hora e local serão perdidos.

Apresentação

A natureza ubíqua dos smartphones, juntamente com seu crescente poder de computação e sensores sofisticados, desencadeou uma mudança de paradigma nos Sistemas de Informação Geográfica (SIG) e no geoprocessamento ambiental. Ao fornecer uma fonte prontamente disponível de informações visuais espacialmente explícitas, fotos georreferenciadas estão permitindo que pesquisadores, profissionais e cidadãos contribuam para uma compreensão mais profunda e uma gestão mais eficaz do nosso meio ambiente.

A proliferação de smartphones com receptores integrados do Sistema Global de Navegação por Satélite (“Global Navigation Satellite System” - GNSS) e câmeras de alta resolução levou a uma explosão na disponibilidade de fotografias georreferenciadas. Essas imagens, vinculadas a localizações geográficas específicas, oferecem um meio poderoso e acessível de capturar, analisar e entender fenômenos ambientais. Essas tecnologias democratizou a coleta de dados, permitindo iniciativas de ciência cidadã e monitoramento ambiental em tempo real em escalas sem precedentes. Além disso, os avanços em aplicativos SIG móveis transformaram os smartphones em ferramentas poderosas para análise e visualização de dados espaciais, diretamente no campo.

A integração de receptores do Sistema Global de Navegação por Satélite, câmeras de alta resolução e vários sensores ambientais em smartphones permite a coleta de dados espacialmente explícitos com precisão crescente. Isso permitiu o desenvolvimento de aplicativos SIG móveis para diversas aplicações ambientais. Fotos georreferenciadas/geomarcadas contêm informações geográficas (latitude, longitude, altitude, etc.) armazenadas no cabeçalho EXIF. Geomarcação (“geotagging”) é o processo de incorporar coordenadas geográficas em uma imagem. Isso é comumente feito usando dispositivos com recursos de GPS, como smartphones e câmeras. Ou seja, quando você tira uma foto com seu celular, ele pode registrar automaticamente a localização, criando uma imagem geomarcada (“geotagged”).

Smartphones geralmente habilitam a geomarcação por padrão, permitindo que as localizações de suas fotos sejam facilmente integradas ao R ou em Sistemas de Informação Geograficas como QGIS. Ambos R e QGIS funcione com formatos .jpg/.jpeg e .HEIC (Apple iOS).

Pacotes

library(plyr)
library(tidyverse)
library(exiftoolr)
#exiftoolr::install_exiftool()
library(magick)
library(sf)
library(mapview)

Carregar uma foto e obter informações úteis

Para facilitar o processamento, as fotos georreferenciadas devem estar salvos com os dados originais e nos formatos .jpg ou .jpeg. Aqui usamos um explo com o formato “.HEIC”, mas, todos os exemplos de código também funcionarão com formatos .jpg ou .jpeg.

No caso de fotos armazenadas on-line com Google Photos, baixe do Google Photos usando o Google Takeout - selecionando apenas o álbum necessário. Descompacte e salve a pasta com as fotos onde você estará trabalhando. Para IPhone, manter a copia dos fotos sem “live”.

Primeiramente vamos carregar uma foto, e depois obter informações como quando e onde a foto foi tirada.

# Especificar a localização do arquivo de imagem
imgfile <- "Google Photos/Animais_domesticos/IMG_5174-edited.HEIC"
# Carregar
cat <- magick::image_read(imgfile)
# Visualizar
print(cat)
# A tibble: 1 × 7
  format width height colorspace matte filesize density
  <chr>  <int>  <int> <chr>      <lgl>    <int> <chr>  
1 JPEG    3024   4032 sRGB       FALSE  5612811 72x72  

A foto mostra gatos se alimentando, mas onde essa foto foi tirada?

O código a seguir lerá e extrairá metadados da imagem, armazenadas no cabeçalho EXIF. Os metadados incluem informações como quando e onde a foto foi tirada.

# Ler os metadados EXIF
dat <- exif_read(imgfile)
ncol(dat)
[1] 133

Podemos ver que há 133 colunas no objeto “dat”. Cada coluna contém informações associadas à foto. Não precisamos de todas essas informações, então selecionaremos as informações que queremos - data, hora e local onde a foto foi tirada.

# Obter nome da foto
aname <- dat[["FileName"]]
# Data e hora
DateTime  <- dat[["CreateDate"]]
# Coordenadas geograficas - valores arredondados a 1 metro
Longitude <- round(as.numeric(dat[["GPSLongitude"]]), 5)
Latitude  <- round(as.numeric(dat[["GPSLatitude"]]), 5)

# Formato de data e hora usado pelo R.
DataHoraR <- strptime(DateTime, 
                      format = "%Y:%m:%d %H:%M:%S", 
                      tz = "America/Belem")

Para melhorar a organização e facilitar as etapas de processamento posteriores vamos juntar as informações obtidos.

dfponto <- data.frame(foto_id = aname, data_hora = DataHoraR, 
            Longitude_x = Longitude, Latitude_y = Latitude)
dfponto
               foto_id           data_hora Longitude_x Latitude_y
1 IMG_5174-edited.HEIC 2024-02-26 11:00:37   -51.08445   -0.00551

Assim, podemos ver que a fotografia foi tirada às 11 da manhã do dia 26 de fevereiro de 2024. Também temos as coordenadas geográficas, mas precisamos fazer algumas ajustes antes que podermos plotá-las em um mapa.

Mapeie o ponto

Agora vamos criar um ponto espacial e plotar para ver onde a fotografia foi tirada.

# Converter para classe espacial "sf" 
sf_ponto <- st_as_sf(dfponto, coords = c("Longitude_x","Latitude_y"))
st_crs(sf_ponto) <- 4326
# Verificar as propriadades do objeto espacial
sf_ponto
Simple feature collection with 1 feature and 2 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -51.08445 ymin: -0.00551 xmax: -51.08445 ymax: -0.00551
Geodetic CRS:  WGS 84
               foto_id           data_hora                   geometry
1 IMG_5174-edited.HEIC 2024-02-26 11:00:37 POINT (-51.08445 -0.00551)

E agora visulaizar o ponto em uma mapa.

# options(viewer = NULL)
mapview::mapview(sf_ponto, map.types = "OpenStreetMap.DE", 
zcol = "foto_id")

Sabemos que a fotografia foi tirada às 11 da manhã do dia 26 de fevereiro de 2024. Agora, observando o mapa acima, podemos constatar que a fotografia foi tirada próximo ao Curso de Física, no Campus Marco Zero.

Pontos de várias fotos

Até agora parece muito trabalho só para uma única foto. Mas, e se você tivesse um álbum com centenas de fotos? Uma grande vantagem de usar R e código é que é simples repetir um processo muitas vezes.

Com algumas pequenas mudanças, podemos adaptar o processo anterior (fotografia única) e repetir para muitas fotos.

Primeiramente obter informações úteis de várias fotos no mesmo tempo.

# 1) Nomes de todos os fotos na pasta
foto_list <- list.files(path = "Google Photos/Animais_domesticos", 
                        pattern = '.HEIC$', all.files=TRUE, 
                        full.names = TRUE)
# 2) Função para obter metadados
foto_meta <- function(x){ 
# Specify location of image file
imgfile <- x
dat <- exiftoolr::exif_read(imgfile)
# nome
aname <- dat[["FileName"]]
# Data e hora
DateTime  <- dat[["CreateDate"]]
# Coordenadas geograficas - valores arredondados a 1 metro
Longitude <- round(as.numeric(dat[["GPSLongitude"]]), 5)
Latitude  <- round(as.numeric(dat[["GPSLatitude"]]), 5)
# Formato de data e hora usado pelo R.
DataHoraR <- strptime(DateTime, 
                      format = "%Y:%m:%d %H:%M:%S", 
                      tz = "America/Belem")
dfponto <- data.frame(foto_id = aname, data_hora = DataHoraR, 
            Longitude_x = Longitude, Latitude_y = Latitude)
dfponto
}

# 3) Aplique a função a todas as fotos
dfpontos <- plyr::ldply(foto_list, .fun = foto_meta)

# 4) Olhar o resultado
dfpontos
                foto_id           data_hora Longitude_x Latitude_y
1  IMG_5174-edited.HEIC 2024-02-26 11:00:37   -51.08445   -0.00551
2  IMG_5175-edited.HEIC 2024-02-26 11:01:14   -51.08442   -0.00553
3  IMG_5176-edited.HEIC 2024-02-26 13:57:43   -51.08452   -0.00871
4  IMG_5177-edited.HEIC 2024-02-26 14:01:26   -51.08450   -0.00610
5  IMG_5178-edited.HEIC 2024-02-26 14:01:38   -51.08454   -0.00609
6  IMG_5179-edited.HEIC 2024-02-26 14:03:07   -51.08440   -0.00564
7  IMG_5180-edited.HEIC 2024-02-26 14:03:56   -51.08446   -0.00552
8  IMG_5181-edited.HEIC 2024-02-26 14:04:02   -51.08448   -0.00553
9  IMG_5243-edited.HEIC 2024-03-04 16:13:48   -51.08448   -0.00550
10 IMG_5282-edited.HEIC 2024-03-11 09:49:14   -51.08414   -0.00541
11 IMG_5283-edited.HEIC 2024-03-11 09:49:19   -51.08419   -0.00547
12 IMG_5288-edited.HEIC 2024-03-11 13:57:46   -51.08468   -0.00692
13 IMG_5289-edited.HEIC 2024-03-11 13:57:57   -51.08435   -0.00691
14 IMG_5290-edited.HEIC 2024-03-11 13:58:11   -51.08449   -0.00684
15 IMG_5291-edited.HEIC 2024-03-11 13:58:19   -51.08454   -0.00684
16 IMG_5351-edited.HEIC 2024-03-23 11:14:44   -51.08448   -0.00536
17 IMG_5352-edited.HEIC 2024-03-23 11:15:04   -51.08446   -0.00536
18 IMG_5354-edited.HEIC 2024-03-23 11:16:46   -51.08445   -0.00541
19 IMG_5355-edited.HEIC 2024-03-23 12:40:46   -51.08435   -0.00557
20 IMG_5356-edited.HEIC 2024-03-23 12:40:53   -51.08439   -0.00554
21 IMG_5357-edited.HEIC 2024-03-23 12:41:06   -51.08437   -0.00556
22 IMG_5705-edited.HEIC 2024-08-16 10:55:01   -51.08456   -0.00567
23 IMG_5778-edited.HEIC 2024-09-09 10:51:46   -51.08444   -0.00538
24 IMG_5779-edited.HEIC 2024-09-09 10:51:50   -51.08443   -0.00532

Agora temos a data, hora e coordenadas geográficas das 24 fotografias georreferenciadas. Isso significa que agora podemos plotar os locais de todas as fotos em um mapa repetindo o mesmo processo usado anteriormente para uma única foto.

# Crie um objeto espacial de pontos
sf_pontos <- st_as_sf(dfpontos, coords = c("Longitude_x","Latitude_y"))
st_crs(sf_pontos) <- 4326

# Mapa
# options(viewer = NULL)
mapview::mapview(sf_pontos, map.types = "OpenStreetMap.DE", 
zcol = "foto_id")

Como olhar as fotos em um mapa?

Infelizmente ainda não é possível visualizar fotos georreferenciadas em um mapa no R. Para ver as fotos em um mapa, precisamos convertê-las para o formato .jpg ou .jpeg e depois carregá-las no QGIS usando o plugin “ImportPhotos”. Veja detalhes nos tutoriais listados abaixo (“Links úteis”).

As fotos não estiverem no formato correto para QGIS, portanto, vamos convertê-las facilmente da seguinte maneira.

# caminho para os fotos .jpeg em outra pasta
pasta_jpeg <- "Google Photos/fotos_jpeg"
path_jpeg <- paste(pasta_jpeg, dfpontos$foto_id, sep = "/")
path_jpeg  <- str_replace(path_jpeg, "HEIC", "jpeg")

# converter antes de exportar
heics <- map(foto_list, image_read)
jpeg  <- map(heics, image_convert, format = "jpeg")

# exportar fotos jpeg para a nova pasta
walk2(jpeg, path_jpeg, image_write, quality = 50)

Agora possuímos cópias de todas as fotos no formato adequado, organizadas em uma pasta e prontas para serem importadas no QGIS utilizando o plugin “ImportPhotos”.

Aplicações potenciais

Fotos georreferenciadas de cães e gatos em um campus universitário oferecem um rico conjunto de dados para várias análises estatísticas. Aqui estão algumas exemplos de opções e aplicações potenciais:

1. Análise espacial:

  • Mapeamento de densidade:
    identifique pontos críticos onde animais são fotografados com mais frequência. Isso pode ajudar a identificar áreas com maiores concentrações de animais, potencialmente indicando fontes de alimento e/ou abrigo.

  • Análise de agrupamento:
    determine se há grupos espaciais de raças ou tipos específicos de animais (por exemplo, amigáveis, agressivos, feridos). Isso pode ajudar a entender a dinâmica social e a territorialidade entre populações de animais no campus.

  • Padrões de movimento:
    se as fotos tiverem registro de data e hora, analise os padrões de movimento de animais individuais ou grupos ao longo do tempo. Isso pode revelar rotas preferidas, padrões de atividade e interações potenciais com o ambiente do campus ou atividade humana.

  • Proximidade da atividade humana:
    analise a proximidade de locais de animais vadios a áreas de alta atividade humana (por exemplo, dormitórios, praças de alimentação, bibliotecas). Isso pode revelar como o comportamento humano influencia a distribuição e o comportamento de animais.

2. Aplicações dos resultados:

  • Estratégias de gestão direcionadas:
    Informar o desenvolvimento de intervenções direcionadas para a gestão de animais, como programas focados de captura-castração-retorno em áreas de alta densidade e/ou campanhas educacionais para reduzir o conflito entre humanos e animais.

  • Alocação de recursos:
    Otimizar a alocação de recursos para a gestão de animais, como estações de alimentação e água, abrigos ou cuidados veterinários.

  • Planejamento do campus:
    Incorporar considerações sobre animais no planejamento e desenvolvimento do campus, como projetar espaços verdes que sejam menos atraentes para animais e/ou implementar regulamentações de alimentação.

  • Educação pública:
    Desenvolver materiais educacionais e programas de extensão para aumentar a conscientização sobre animais vadios no campus e promover interações responsáveis entre humanos e animais.

  • Pesquisa:
    Contribuir para pesquisas mais amplas sobre ecologia urbana, comportamento animal e interações entre humanos e animais.

Conclusões

Aqui vimos como obter informações úteis de fotos geomarcadas usando R. Usamos um processo que fornece os dados organizados em formatos prontos para posterior análise estatística e geoespacial. Por exemplo, ao combinar dados de fotos geomarcadas com análise estatística apropriada, as universidades podem obter insights valiosos sobre populações de animais no campus e desenvolver estratégias de gerenciamento eficazes para promover a coexistência e o bem-estar animal.

Bibliografia

Andrachuk M, et al. 2019
Smartphone technologies supporting community-based environmental monitoring and implementation: a systematic scoping review. Biological Conservation. 237:430-42. https://doi.org/10.1016/j.biocon.2019.07.026

Danielsen F, et al. 2022.
Community monitoring of natural resource systems and the environment. Annual Review of Environment and Resources. 47(1):637-70. https://doi.org/10.1146/annurev-environ-012220-022325

Faka A, Tserpes K, Chalkias C. 2021.
Environmental sensing: a review of approaches using GPS/GNSS. GPS and GNSS Technology in Geosciences. 1:199-220. https://doi.org/10.1016/B978-0-12-818617-6.00013-5

Fraisl D, et al. 2022.
Citizen science in environmental and ecological sciences. Nature Reviews Methods Primers. 25;2(1):64. https://doi.org/10.1038/s43586-022-00144-4

Shaw BJ, et al. 2017.
Contributions of citizen science to landscape democracy: potentials and challenges of current approaches. Landscape Research. 42(8):831-44. https://doi.org/10.1002/wat2.1488

Walker DW, Smigaj M, Tani M. 2021.
The benefits and negative impacts of citizen science applications to water as experienced by participants and communities. Wiley Interdisciplinary Reviews: Water. 8(1):e1488. https://doi.org/10.1002/wat2.1488