Опубликовать локальное изображение во всплывающем окне, используя буклет и R - PullRequest
0 голосов
/ 21 мая 2018

Я безумно пытался добавить локальные изображения (как в файлах изображений на моем компьютере) в карту листовки, используя R. Я составил около 500 координат, анализируя некоторые изображения, и я хочу показать это конкретное изображение при нажатии (неожиданно возникнуть).

leaflet(pics) %>%
  addTiles() %>%
  addCircleMarkers(
    fillOpacity = 0.8, radius = 5,
    lng = ~GPSLongitude, lat =~GPSLatitude, 
    color = ~pal(Married),
    popup = ~SourceFile, # WISH TO ADD EMBEDDED LOCAL IMAGE IN HERE
    label = mapply(function(x, y) {
      HTML(sprintf("<em>%s</em></br> %s", htmlEscape(x), htmlEscape(y)))},
      pics$Address, pics$DateTimeOriginal, SIMPLIFY = F),
    labelOptions = lapply(1:nrow(pics), function(x) {
      labelOptions(direction='auto')
    }))

Я прилагаю 2 снимка экрана: один - при наведении мышки, а другой - при нажатии на определенное место.В идеале я хотел бы показать изображение и имя файла изображения, когда я нажимаю на каждый из них.Это возможно?

Hover Clic

Я также могу показать вам RPub с примером: http://rpubs.com/laresbernardo/photomap

Надеюсь, ты сможешь мне помочь.Спасибо!

_________________________ ОБНОВЛЕНИЕ _________________________

Весь код, использованный в этом примере.В основном я сканирую все изображения с геотегами, добавляю адрес, добавляемый на метку, а затем чертирую все координаты.Когда я нажимаю на координату, я хочу увидеть эту картинку.

wd <- "/Users/bernardo/Dropbox (Personal)/Documentos/R/R Mapping/GPS Photos"

# ------------------------------------------- get the pics with geotags

library(exifr)
library(dplyr)
library(lubridate)
library(beepr)
library(maps)

time <- Sys.time(); print(time)
setwd("/Users/bernardo/Dropbox (Personal)/Imágenes")
files <- list.files(pattern = "*.jpg|*.JPG|*.png|*.PNG", recursive=T)
exif <- read_exif(files, tags = c("SourceFile", "DateTimeOriginal", "GPSLongitude", "GPSLatitude"))
pics <- exif %>% filter(!is.na(GPSLongitude)) %>%
  mutate(DateTimeOriginal = ymd_hms(DateTimeOriginal))
pics$Owner <- ifelse(grepl("iPhone Maru", pics$SourceFile), "Maru", "Ber")
pics$Married <- ifelse(as.Date(pics$DateTimeOriginal) >= '2016-04-30', TRUE, FALSE)
pics$Country <- maps::map.where(database="world", pics$GPSLongitude, pics$GPSLatitude)

#lares::freqs(pics %>% filter(!is.na(Country)), Country)

# Save pics with geotags
setwd(wd)
write.csv(pics, "with_geotags.csv", row.names = F)
print(Sys.time() - time)
beepr::beep()


# ------------------------------------------- get the addresses from files

# GET ALL ADDRESSES
library(ggmap)
options(warn=-1)
setwd(wd)

pics <- read.csv("with_geotags.csv")
addresses <- read.csv("with_address.csv")

pics_to_search <- pics %>% filter(!SourceFile %in% addresses$SourceFile)
print(paste0("Without address: ",round(100 * nrow(pics_to_search)/nrow(pics), 2),"% | ", nrow(pics_to_search)))

out <- data.frame()
for (i in 1:nrow(pics_to_search)) {
  Address <- revgeocode(cbind(pics_to_search$GPSLongitude, pics_to_search$GPSLatitude)[i,], output="address")[1]
  if (!is.na(Address)) {
    out <- rbind(out, cbind(SourceFile=as.character(pics_to_search$SourceFile[i]), Address))
    print(paste(i, Address, sep=" - ")) 
  }
}
# Save pics with geotags
pics_with_address <- rbind(out, addresses)
write.csv(pics_with_address, "with_address.csv", row.names = F)


# ------------------------------------------- Map all coordinates with leaflet

setwd(wd)

library(leaflet)
library(htmltools)
library(mapview)

pics <- read.csv("with_geotags.csv")
address <- read.csv("with_address.csv")

pal <- colorFactor(c("green4", "navy"), domain = c(FALSE, TRUE))
pics <- left_join(pics, address, by=c("SourceFile"))
pics$Content <- paste("Dirección:","<em>", pics$Address,"</em>", "<br/> Fecha:", as.Date(pics$DateTimeOriginal))

leaflet(pics) %>%
  addTiles() %>%
  addCircleMarkers(
    fillOpacity = 0.8, radius = 5,
    lng = ~GPSLongitude, lat =~GPSLatitude, 
    color = ~pal(Married),
    popup = popupImage(as.character(pics$SourceFile), src = "local"),
    label = mapply(function(x, y) {
      HTML(sprintf("<em>%s</em></br> %s", htmlEscape(x), htmlEscape(y)))},
      pics$Address, pics$DateTimeOriginal, SIMPLIFY = F),
    labelOptions = lapply(1:nrow(pics), function(x) {
      labelOptions(direction='auto')
    }))

Но ... Error in image

Я даже установил последнюю версию с devtools::install_github("r-spatial/mapview@develop")

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Наконец, после многих часов, потраченных на эту проблему, мне удалось решить эту проблему.Спасибо @MLavoie и @ TimSalabim3 (через Twitter) за поддержку.

Вот и все: если вы работаете в macOS, вам следует установить драйвер с именем gdal.Я буквально только что установил его, запустил оригинальный скрипт, и он работал.Не знаю, что делает gdal, но он действительно сделал свою работу!

0 голосов
/ 22 мая 2018

Без воспроизводимого примера это сложно, но принимает это, например:

library(leaflet)
library(mapview)

# make-up dataset
data_df <- data.frame(lat = as.numeric(c("35.68705", "35.88705")), long = as.numeric(c("51.38", "53.35")))

# Loaded random pictures on my laptop
images <- c("/PathToImage1/download.jpeg",
             "/PathToImage2/download1.jpeg")

leaflet(data_df) %>%
  addTiles() %>%
  addCircleMarkers(
    fillOpacity = 0.8, radius = 5,
    lng = ~long, lat =~lat, 
    popup = popupImage(images)
    )

Нажмите на каждую точку, чтобы увидеть другое изображение.Убедитесь, что ваши изображения загружены в том же порядке, что и ваш фрейм данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...