Mapa animado das posições dos navios da Primeira Guerra Mundial no Reino Unido por @ ellis2013nz

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br

[ad_1]

Outro dia, enquanto procurava algo totalmente diferente, me deparei com naval-history.net, um site que visa preservar documentos navais históricos e torná-los mais disponíveis. Não tenho certeza se ainda está sendo trabalhado ativamente; o criador e principal força motriz Gordon Smith faleceu no final de 2016.

A interessante coleção de material inclui transcrições de 350.000 páginas de registros de 314 navios da Marinha Real (Reino Unido) da Primeira Guerra Mundial. No site naval-history.net:

“O UK Meteorological Office and Naval-History.Net, sob a orientação do Zooniverse, trabalhou com um grande número de voluntários online no Old Weather de 2010 a 2012 para transcrever dados meteorológicos históricos e eventos navais dos diários de bordo dos 314 navios da Marinha Real da era da Primeira Guerra Mundial que são apresentados aqui. ”

Cada um dos 314 navios tem uma página da web com seu registro transcrito, uma foto do próprio navio, links para cartas relevantes e um mapa das localizações diárias do navio. No entanto, não consegui encontrar uma visualização de todos os 314 navios juntos, que desse uma noção da escala e complexidade das operações navais britânicas durante a guerra. Então eu mesmo fiz um, na forma de uma animação ao longo do tempo que parece a forma natural de representar isso.

Veja como isso acabou:

(Eu sugiro aumentar a definição para 1080p, especialmente se você ampliá-la para tela inteira; não consegui encontrar uma maneira de definir a definição sozinho, o Google parece ter deliberadamente feito a resolução uma escolha feita pelo usuário final ou seu Programas.)

Algumas reflexões históricas

A Primeira Guerra Mundial foi o clímax da era dos navios de guerra para a guerra naval. A Batalha da Jutlândia em 1916 foi apenas o terceiro – e último – confronto em escala real de navios de guerra de aço (os dois primeiros foram alguns anos antes, na guerra Russo-Japonesa de 1904-1905). Na época da Segunda Guerra Mundial, a Alemanha não tinha uma grande frota de superfície, e o conflito com o Japão foi dominado por uma nova forma de recurso naval, o porta-aviões.

Na Primeira Guerra Mundial, o Reino Unido e seus aliados dominaram a frota da Alemanha no papel se todos os ativos fossem comparados uns com os outros de maneira ordenada. No entanto, a Marinha Real enfrentou a necessidade de se afirmar globalmente para proteger a linha de vida marítima de seu país, ao mesmo tempo em que foi ameaçada pela frota alemã em alto mar por estar a um dia de navegação da terra natal do Reino Unido. Essa situação gerou dificuldades para traduzir o domínio naval em resultados estratégicos. O Reino Unido lutou com sucesso limitado para alavancar seu poder por meio do bloqueio e (em uma campanha grande e polêmica) movimento de tropas para abrir uma nova frente; mas se a qualquer momento perdesse seu domínio e, portanto, a capacidade de controlar os invasores de superfície e submarinos que atacavam seus navios comerciais, não seria capaz de permanecer na guerra.

Leia Também  Por que o Dash usa a licença MIT (e NÃO uma licença GPL copyleft)

Isso é o que Winston Churchill (que era o primeiro lorde da almirante quando a guerra estourou) quis dizer quando escreveu mais tarde que o almirante britânico Sir John Jellicoe (almirante da Grande Frota responsável por manter a frota alemã sob controle) era “o único homem de ambos os lados que poderiam perder a guerra em uma tarde ”. Mesmo uma vitória dramática em uma reunião das duas frotas de batalha não venceria a guerra para o Reino Unido, mas uma derrota dramática poderia perdê-la.

A estratégia do Reino Unido era tentar arquitetar um confronto decisivo no Mar do Norte em termos favoráveis ​​o mais rápido possível, para liberar recursos para proteger o comércio marítimo de invasores comerciais e submarinos. Considerando que a estratégia alemã era adiar tal confronto e se concentrar em estrangular a marinha mercantil do Reino Unido; o tempo todo deixando uma ameaça plausível suficiente nas águas domésticas do Reino Unido para manter a Grande Frota do Reino Unido tão grande e ansiosa quanto possível.

Acho que uma motivação para um mapa como o meu acima é tentar dar pelo menos uma amostra da escala da cobertura global da Marinha Real na época. Embora os 314 navios para os quais tenho dados sejam apenas uma fração dos navios que realmente viram serviço, é o suficiente para obter uma boa imagem global.

Achei algumas coisas interessantes em realmente observar meu mapa depois que ele foi concluído. Claro, eu esperava ver uma ampla gama de operações com pontos de foco nos locais históricos de poder naval do Reino Unido de Scapa Flow, Gibraltar, Malta, Cidade do Cabo e Alexandria; mas não esperava ver canhoneiras e outros navios operando rio acima, na China continental. Da mesma forma, eu estava vagamente ciente das expedições às colônias alemãs no que hoje é Samoa, Ilhas Salomão e Papua-Nova Guiné, mas ainda era uma surpresa ver os vários pontos coloridos (incompletos) se movendo naquela área em momentos diferentes.

Leia Também  Como fazer o Powepoint Slides PPT usando o RStudio em 2020

Um pouco de valor agregado de minha parte foi destacar os locais das principais batalhas navais que ocorreram, incluindo algumas daquelas por grupos menores de navios. A Batalha de Coronel na costa oeste da América do Sul em 1914 e sua sequência algumas semanas depois nas Malvinas aparecem bem, por exemplo. Em geral, uma camada de anotação é importante para transformar um gráfico estatístico em uma poderosa ferramenta de comunicação, e nunca mais do que em um mapa animado.

Fazendo o mapa

Tudo isso está por perto. Como fiz para construir este mapa? O código R para fazer isso está em seu próprio repositório no GitHub. Os extratos de código abaixo não são autossuficientes, você precisa clonar o repositório completo para que funcione.

Raspagem da web

Obter os dados do antigo site estático foi um trabalho de webcraping razoavelmente simples. Cada navio recebe sua própria página, e há uma única página de índice com links para todas as páginas dos navios. As próprias páginas são bastante organizadas e provavelmente foram geradas por um banco de dados em algum lugar (por exemplo, as datas estão todas no mesmo formato). Este é um padrão bastante comum em webscraping; funciona bem se você estiver apenas recriando dados que estão em um banco de dados em algum lugar, inacessíveis para você, mas que são aparentes na estrutura das páginas da web das quais você está obtendo dados.

Aqui está um pedaço que pega todos os links para páginas específicas do navio. Ele armazena os links em um vetor de caracteres all_links, e configura uma lista vazia vessel_logs_l que vai armazenar, um elemento por página, os resultados da raspagem de cada página do navio.

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br
#-------------------Main page and all the links----------------
# Main page, which has links to all the ship-specific pages
url1 %
  html_nodes("a") %>%
  str_extract("OWShips-WW1.*?\.htm") %>%
  unique()


vessel_logs_l 

Agora, aqui está o loop principal, que itera pela página de cada navio. Extrai o nome do navio (que pode ser deduzido da URL – é o 16º caractere até o caractere 5 do final da URL); o tipo de embarcação (contratorpedeiro, saveiro, etc.) que pode ser deduzido do título da página HTML; e o texto das próprias entradas de log, na forma de uma grande coluna de cadeias de caracteres. Isso é bastante simples com algumas expressões regulares. O truque no padrão usado abaixo é criar vetores VERDADEIRO / FALSO que rotulam cada linha do log: esta linha é a posição do script? é o tempo? é a descrição da posição (ou seja, o nome em inglês do local)? etc. Em seguida, essas colunas são usadas como parte do processo para transformar os dados em uma linha por dia (para cada navio especificado), com colunas de resumo contendo extratos relevantes das várias linhas da entrada do registro.

Leia Também  Parabéns Classe de 2020! | R-bloggers
#-----------------Main loop - one ship at a time----------------

# Loop from "i" to the end means if we get interrupted we can start
# the loop again from wherever it got up to. This loop takes about 30-60 minutes
# to run through all 314 ships.
i = 1
for(i in i:length(all_links)){
  cat(i, " ")
  the_url %
    str_replace("_", " ")
  
  this_ship_page %
    html_nodes("title") %>%
    html_text() %>%
    drop_rn() %>%
    str_replace(" - British warships of World War 1", "") %>%
    str_replace(" - British Empire warships of World War 1", "") %>%
    str_replace(" - British auxiliary ships of World War 1", "") %>%
    str_replace(" - logbooks of British warships of World War 1", "") %>%
    str_replace(".*, ", "")
  
  txt %
    html_nodes("p") %>%
    html_text()
  
  d %
   mutate(txt2 = drop_rn(txt)) %>%
    mutate(is_date = grepl("^[0-9]+ [a-zA-Z]+ 19[0-9][0-9]$", txt2),
           entry_id = cumsum(is_date),
           is_position = grepl("^Lat.*Long", txt2),
           is_position_description = lag(is_date),
           is_weather = grepl("^Weather", txt2),
           last_date = ifelse(is_date, txt2, NA),
           last_date = as.Date(last_date, format = "%d %b %Y")) %>%
    fill(last_date) %>%
    filter(entry_id >= 1)
  
  vessel_logs_l[[i]] %
    group_by(entry_id) %>%
    summarise(date = unique(last_date),
              position = txt2[is_position],
              # position_description is a bit of a guess, sometimes there are 0,
              # 1 or 2 of them (not necessarily correct), so we just take the
              # first one and hope for the best.
              position_description = txt2[is_position_description][1],
              weather = txt2[is_weather][1],
              log_entry = paste(txt2, collapse = "n"),
              .groups = "drop") %>%
    mutate(url = the_url,
           vessel = the_vessel,
           vessel_type = vessel_type,
           vessel_id = i,
           lat = str_extract(position, "Lat.*?\.[0-9]+"),
           long = str_extract(position, "Lon.*?\.[0-9]+"),
           lat = as.numeric(gsub("Lat ", "", lat)),
           long = as.numeric(gsub("Long ", "", long)),
           weather = str_squish(gsub("Weather:", "", weather, ignore.case = TRUE)))
}

# save version with all the text (about 25 MB)
vessel_logs 

Desenhar o mapa

Desenhar cada quadro diário do próprio mapa é surpreendentemente fácil, graças às maravilhas de ggplot2 e pura transformação de coordenadas oferecida por recursos simples e sf. A filosofia de “gramática em camadas dos gráficos” de Wickham ggplot2 realmente se destaca aqui, fornecendo a capacidade de especificar de forma organizada:

  • um conjunto de dados padrão
  • seis camadas diferentes, incluindo fronteiras terrestres, pontos sólidos para cada navio, pontos circulares vazios para quaisquer batalhas presentes no dia, texto anotando essas batalhas e anotações de texto para a data de hoje e a descrição do estágio da guerra
  • um sistema de coordenadas para dar uma boa apresentação do mundo redondo em um retângulo de imóveis
  • escalas para governar as cores dos navios
  • controle temático preciso de cores de fundo e de texto, fontes, etc.

Ignorando uma parte do gerenciamento de dados para definir os horários e rótulos usados ​​para as várias anotações, aqui está o código para o desenho real do mapa com os dados de um único dia:

m %
    ggplot(aes(x = long, y = lat)) +
    borders(fill = "grey", colour = NA) +
    geom_point(aes(colour = vessel_type_lumped), size = 0.8) +
    geom_point(data = battle_data,
               aes(size = point_size),
               shape = 1, colour = battle_col) +
    geom_text(data = battle_data, 
              aes(label = battle), 
              family = main_family, 
              hjust = 0,
              nudge_x = 5,
              size = 2,
              colour = battle_col) +
    scale_size_identity() +
    coord_sf() +
    theme_void(base_family = main_family) +
    # The date, in the South Atlantic:
    annotate("text", x = 22, y = -64, label = format(the_date, '%e %B %Y'), 
             colour = date_col, hjust = 1) +
    # Summary text next the date:
    annotate("text", x = 24, y = -63, 
             label = glue("{date_sum_text}: {unique(ships_data$phase)}"), 
             colour = comment_col, 
             hjust = 0, size = 2.5) +
    scale_colour_manual(values = pal, labels = names(pal), drop = FALSE) +
    labs(title = glue("Daily locations of Royal Navy Ships 1914 to 1919"),
         colour = "",
         caption = str_wrap("Locations of 314 UK Royal Navy from log books compiled by 
         naval-history.net; map by freerangestats.info. Ships that survived the 
         war and that travelled out of UK home waters were more likely to be selected 
         for transcription, which was by volunteers for the 'Zooniverse Old Weather Project'.", 
                            # margin() theme on left and right doesn't work for plot.caption so we add our own:
                            width = 180, indent = 2, exdent = 2)) +
    theme(legend.position = "bottom",
          plot.title = element_text(family = "Sarala", hjust = 0.5),
          plot.caption = element_text(colour = "grey70", size = 8, hjust = 0),
          legend.spacing.x = unit(0, "cm"),
          legend.text = element_text(hjust = 0, margin = margin(l = -2, r = 15)),
          legend.background = element_rect(fill = sea_col, colour = NA),
          panel.background = element_rect(fill = sea_col, colour = NA))

Fazendo filmes

O loop em que está inserido desenha um quadro para cada dia, 2.000 pixels de largura na proporção de 16: 9. Usei o Image Magick para criar um GIF animado a partir de um subconjunto de 40 desses quadros, e o Windows Video Editor para fazer o filme completo acima.

Então é isso, pessoal. Apenas um pequeno pedaço da história. Oh, se você acha que 6,5 minutos de vídeo são longos para assistir, imagine como foi vivê-lo. Não era ou terminava ali também. Podemos pensar que 2020 foi difícil, mas ainda prefiro o que acabamos de passar do que muitos dos anos da primeira metade do século passado.



[ad_2]

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br