Skip to content

Instantly share code, notes, and snippets.

@tylermorganwall
Last active April 19, 2024 07:36
Show Gist options
  • Save tylermorganwall/b222fcebcac3de56a6e144d73d166322 to your computer and use it in GitHub Desktop.
Save tylermorganwall/b222fcebcac3de56a6e144d73d166322 to your computer and use it in GitHub Desktop.
Submarine Cable Map Dataviz
library(geojsonsf)
library(sf)
library(rayrender)
#Data source: https://github.com/telegeography/www.submarinecablemap.com
cables = geojson_sf("cable-geo.json")
cablescene = list()
counter = 1
for(i in 1:length(cables$geometry)) {
for(j in 1:length(cables$geometry[[i]])) {
temp = cables$geometry[[i]][[j]]
cableval = data.frame(x=sinpi(temp[,1]/180)*cospi(temp[,2]/180),
y=sinpi(temp[,2]/180),
z=cospi(temp[,1]/180)*cospi(temp[,2]/180))
#Don't lower start of line at the 180/0 longitude border
if(abs(temp[1,1] - 180) > 0.001 && abs(temp[1,1] + 180) > 0.001) {
cableval[1,] = cableval[1,] * 1/1.02
}
nr = nrow(temp)
#Don't lower end of line at the 180/0 longitude border
if(abs(temp[nr,1] - 180) > 0.001 && abs(temp[nr,1] + 180) > 0.001) {
nr = nrow(cableval)
cableval[nr,] = cableval[nr,] * 1/1.02
}
cablescene[[counter]] = path(cableval, width = 0.005,material=diffuse(color=cables$color[i]))
counter = counter + 1
}
}
fullcablescene = do.call(rbind,cablescene)
for(i in seq(1,720,by=1)) {
group_objects(fullcablescene,scale=c(1,1,1)*1.02) %>%
add_object(sphere(radius=0.99,material=diffuse(image_texture = "2k_earth_daymap.jpg"),angle=c(0,-90,0))) %>%
group_objects(angle=c(0,-i/2,0)) %>%
add_object(sphere(y=5,z=5,x=5,material=light(intensity = 80,color="lightblue"))) %>%
add_object(sphere(y=5,z=5,x=-5,material=light(intensity = 10,color="orange"))) %>%
add_object(sphere(y=-10,material=light(intensity = 3,color="white"))) %>%
render_scene(samples=64,width=1200,height=1200,fov=0,aperture=0, ortho_dimensions = c(2.3,2.3),
sample_method = "sobol_blue",filename=sprintf("smallcables%d.png",i))
}
@YoViajo
Copy link

YoViajo commented Sep 30, 2021

Como se puede ejecutar este archivo?

  • Descarga los archivos a los que hace referencia el código R (1 archivo GeoJSON, 1 archivo JPG) usando los enlaces mencionados líneas arriba (en los comentarios)
  • En el código R, ajusta la referencia de ruta de los archivos descargados (según tu definición)
  • Ejecuta el código R en tu ambiente favorito (e.g, R-Studio). Prepárate para esperar. En mi caso tomó 40 horas en completar.
  • La salida es grupo de imágenes PNG que visualizadas juntas pueden animarse como un video. Yo utilicé ffmpeg para hacer esa combinación.

@hominidae
Copy link

The SFU link for the JPG doesn't work, here's the wikimedia source file.

https://upload.wikimedia.org/wikipedia/commons/c/c3/Solarsystemscope_texture_2k_earth_daymap.jpg

@altiglesia
Copy link

Hi,

I was wondering if anyone still had access to a repo of the Telegeography submarine cable map. They no longer maintain their public github as of 2 weeks ago, and I wanted to look at their source code. Thank you!

@Pranav941
Copy link

I was looking for it as well, I think you get it from the attachments here,
https://observablehq.com/@ariellemartinez/submarine-cable-map
Good Luck!

@bunam
Copy link

bunam commented Mar 9, 2023

I have consolidated and modified a little there :

https://github.com/bunam/submarine_cable_map

@mb720
Copy link

mb720 commented Sep 8, 2023

Some pointers for beginners to R:

  • You'll need three R packages: "geojsonsf", "sf", and "rayrender"
  • "sf" expects some libraries to be installed on your system, see its readme on how to do this, for example for Linux
  • You'll need a Fortran compiler. If you're on Arch Linux: pacman -S gcc-fortran
  • After installing R and opening its command line, install the packages with install.packages(c("geojsonsf", "sf", "rayrender"))
  • Then run the script with source("submarine_cable_map.R")

@mb720
Copy link

mb720 commented Oct 14, 2023

I'm offering the PNGs of the cable map via the following torrent magnet link since rendering them can take a few hours, depending on your hardware:

magnet:?xt=urn:btih:d3d832c365c5f7ec88d0bea1a4d3906a064950f9&dn=submarine_cables_map_pngs

Turn the PNGs into a video using, for example:

  • ffmpeg -i smallcables%03d.png -vf scale=720:720 -crf 55 globe.webm
  • ffmpeg -i smallcables%03d.png -vf scale=720:720 -pix_fmt yuv420p -crf 26 globe.mp4

Reduce the value of -crf for higher quality or set the resolution to something else, for example: scale=1024:1024

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment