I believe I can fly

Noko av det kjekkaste eg veit når eg er ute og flyr, er å sjå på flykarta i selskapsblekkene i stolsetet. Drøyme meg vekk til fjerne destinasjonar. Men kan vi lage slike kart sjølve?



Det som kjenneteiknar flydestinasjonskarta, er dei bøygde rutene. Vi skjøner instinktivt at dei er bøygde fordi jorda er rund. Forenkla tenkjer vi oss at flya følgjer punkta på ein Riemann-sirkel. Dette er sirklar som skjer gjennom planet til ei kule og senteret til kula, slik at alle Riemann-sirklar vil ha same omkrins som kula. Viss jorda hadde vore heilt rund, hadde vi alle flytta oss på delar av Riemann-sirklar til einkvar tid.

Eg blei inspirert av dette blogginnlegget til Nathan Yau som har laga vakre kart av flyruter i USA. I mi relativt rudimentære utgåve har eg nytta norgeskart frå Statens Kartverk. Etter litt googling fann eg eit rekneark som ein russar har fylt med lat/lon-punkt for ein bråte norske flyplassar (minus Rygge. Som eg får leggje til på eiga hand.)

Og så har vi jo R, som eg har forska litt på i det siste. Eg nyttar pakka maptools (til kartet), geosphere (til Riemann-sirklane) og gdata (til å lese Excel-ark).

Heile koden finn du her.

Eg sjekka Avinor sine sider for å sjå kor det er direktefly frå Gardermoen og Flesland.

Etter å ha lese inn data, plukkar eg ut dei destinasjonane eg vil ha med. Her definerer eg kva for radar i data.frame flyplasser som inneheld lat/lon-punkta eg treng. dest = Oslo, dest2 = Bergen.
dest <- c(3, 4, 5, 6, 9, 8, 64, 18, 17, 15, 22, 27, 28, 29, 31, 33, 38, 36, 35, 47, 49, 55, 52, 54, 56, 60, 41, 61, 25, 1)
dest2 <- c(9, 8, 18, 17, 15, 22, 28, 29, 36, 39, 42, 62, 50, 52, 56, 60, 61, 25, 1)

Dei to «hovudflyplassane» får kvar sine objekt:
lat_bg <- 60.29339
lon_bg <- 5.218142
lat_os <- 60.19392
lon_os <- 11.100361

oslo <- c(lon_os, lat_os)
bergen <- c(lon_bg, lat_bg)

Så er det berre å lage to identiske for-loopar for rutene til/frå Oslo og Bergen. For å skilje dei, gjev eg fargen blå for Oslo-rutene og rød for bergensrutene.

#Lag ruter fra Oslo

ruter <- data.frame()
for (j in dest) {
k <- flyplasser[j,]
ruter <- rbind(ruter, k)
}

ruter <- data.frame(ruter$lon, ruter$lat)
ruter <- as.matrix(ruter)
colnames(ruter) <- NULL

for (j in 1:length(dest)) {
inter <- gcIntermediate(ruter[j,], oslo, n=100, addStartEnd=TRUE)
lines(inter, col="blue", lwd=0.3)
}

# Lag ruter for Bergen

ruter2 <- data.frame()
for (j in dest2) {
k <- flyplasser[j,]
ruter2 <- rbind(ruter2, k)
}

ruter2 <- data.frame(ruter2$lon, ruter2$lat)
ruter2 <- as.matrix(ruter2)
colnames(ruter2) <- NULL

for (j in 1:length(dest2)) {
inter2 <- gcIntermediate(ruter2[j,], bergen, n=100, addStartEnd=TRUE)
lines(inter2, col="red", lwd=0.3)
}

Etter alt dette oppdaga eg at Rygge mangla. Då kunne eg ha gått attende og fiksa originalfilen. Eg valde denne gongen berre å leggje han til bergensrutene.

#Legg til Rygge
rygge <- c(10.763426,59.384502)
inter3 <- gcIntermediate(rygge, bergen, n=100, addStartEnd=TRUE)
lines(inter3, col="red", lwd=0.3)

Resultatet blei slik: Statens Kartverk sine filar er tunge, så ver tolmodig!

http://youtu.be/0AxmYlHr4io