Andet eksperiment med kort

Forfattet af

Frederik Sørig Søndergaard Nielsen

Senest opdateret

31.1.2024

Forrige artikel beskrev et forsøg på at skabe et kort-interface ved hjælp af en automatiseret genkendelse af stednavne og en liste over koordinater på danske navne. Problemet med eksperimentet er både, at algoritmen kæmper med dansk fra starten af 1800-tallet, og at avisen også indeholder oplysninger om andre lokaliteter end Danmark.

Denne artikel beskriver et forsøg på at skabe et kort af et sample af 1000 artikler, hvor projektmedlemmerne manuelt identificerede stednavne. Disse stednavnes koordinater identificeres efterfølgende via et api-kald til Google Maps.

Koden nedenfor starter med at loade et datasæt struktureret om specifikke stednavne. Hver artikel kan optræde flere gange, hvis det indeholder flere stednavne. Hvert stednavn sendes efterfølgende til Google Maps, der returnerer dets koordinater.

library(readr)  

data <- read_csv("df_places.csv")
api_nøgle <- "XXXXX" # Her skal du indsætte din egen api-nøgle.
register_google(key = api_nøgle)

geokod_bynavn <- function(bynavn) {
  result <- geocode(as.character(bynavn), output = "latlon")
  return(result)
}

data$longitude <- NA
data$latitude <- NA

# for loop
for (i in 1:nrow(data)) {
  bynavn <- data$stednavn[i]  
  geodata <- geokod_bynavn(bynavn)
  if (!is.na(geodata$lon) & !is.na(geodata$lat)) {
    data$latitude[i] <- geodata$lat
    data$longitude[i] <- geodata$lon
  }
}

write.csv2(data,"data/df_manuelt_kort.csv")

Det endelige kort er, som i forrige tilfælde, skabt med Leaflet og følgende kode.

library(tidyverse)
library(shiny)
library(leaflet)

df_map <- read_csv2("data/df_manuelt_kort.csv") %>%
  arrange(dato) %>%
  mutate(tekst = paste0("<b>Dato:</b> ", 
                        dato, "<br><b>Sted:</b> ", 
                        stednavn, "<br><b>Tekst:</b> ", 
                        tekst)) %>%
  group_by(stednavn) %>%
  reframe(tekst = paste0(tekst, collapse = "<p>_____<p>"),
            longitude = as.numeric(paste0(longitude)),
            latitude = as.numeric(paste0(latitude))) %>%
  distinct() %>% 
  select(tekst, longitude, latitude, stednavn) %>% 
  filter(!str_detect(stednavn, "Ranzau|Dalby")) %>% 
  na.omit()

ui <- fluidPage(
  leafletOutput("mymap", height = "95vh"),
  p()
)

server <- function(input, output, session) {
  output$mymap <- renderLeaflet({
    leaflet() %>%
      addProviderTiles("Esri.WorldGrayCanvas") %>%
      addMarkers(df_map,
                 lng = df_map$longitude,
                 lat = df_map$latitude,
                 popup = df_map$tekst,
                 popupOptions = popupOptions(maxHeight = 300))
  })
}

shinyApp(ui, server)

Du kan gå på opdagelse i kortet her: https://hislabaau.shinyapps.io/Manuelt_kort/