r - 在 R 中自动生成大圆 map

标签 r map gis data-visualization great-circle

我在流动数据 great circle mapping tutorial 中学到了一些东西并将它们与注释中链接的代码结合起来,以防止在 R 绘制跨赤道大圆时发生奇怪的事情。这给了我这个:

airports <- read.csv("/home/geoff/Desktop/DissertationData/airports.csv", header=TRUE) 
flights <- read.csv("/home/geoff/Desktop/DissertationData/ATL.csv", header=TRUE, as.is=TRUE)

library(maps)
library(geosphere)

checkDateLine <- function(l){
  n<-0
  k<-length(l)
  k<-k-1
  for (j in 1:k){
    n[j] <- l[j+1] - l[j]
  }
  n <- abs(n)
  m<-max(n, rm.na=TRUE)
  ifelse(m > 30, TRUE, FALSE)
}
clean.Inter <- function(p1, p2, n, addStartEnd){
  inter <- gcIntermediate(p1, p2, n=n, addStartEnd=addStartEnd)
  if (checkDateLine(inter[,1])){
    m1 <- midPoint(p1, p2)
    m1[,1] <- (m1[,1]+180)%%360 - 180
    a1 <- antipode(m1)
    l1 <- gcIntermediate(p1, a1, n=n, addStartEnd=addStartEnd)
    l2 <- gcIntermediate(a1, p2, n=n, addStartEnd=addStartEnd)
    l3 <- rbind(l1, l2)
    l3
  }
  else{
    inter
  }
}

# Unique months
monthyear <- unique(flights$month)

# Color
pal <- colorRampPalette(c("#FFEA00", "#FF0043"))
colors <- pal(100)

for (i in 1:length(monthyear)) {

png(paste("monthyear", monthyear[i], ".png", sep=""), width=750, height=500)
map("world", col="#191919", fill=TRUE, bg="black", lwd=0.05)

fsub <- flights[flights$month == monthyear[i],]
fsub <- fsub[order(fsub$cnt),]
maxcnt <- max(fsub$cnt)
for (j in 1:length(fsub$month)) {
  air1 <- airports[airports$iata == fsub[j,]$airport1,]
  air2 <- airports[airports$iata == fsub[j,]$airport2,]
  p1 <- c(air1[1,]$long, air1[1,]$lat)
  p2 <- c(air2[1,]$long, air2[1,]$lat)
  inter <- clean.Inter(p1,p2,n=100, addStartEnd=TRUE)
  colindex <- round( (fsub[j,]$cnt / maxcnt) * length(colors) )
  lines(inter, col=colors[colindex], lwd=1.0)
}
  dev.off()
}

我想为包含所有预定商业路线的大型数据集自动生成 map — dummy sample — 在 ATL 和全局网络中的其他机场之间共享(airports.csv 在流动数据帖子中链接到)。最好每月制作一张 map ,用作描述亚特兰大机场网络空间变化的短视频中的框架。

问题:每次运行它时,我都无法让循环生成一个以上的 PNG(仅从每个 CSV 中的第一个唯一月份开始)。我相当肯定 Aaron Hardin 的代码“破坏”了 Flowing Data 教程中使用的自动化。在搞砸了三天并追查了任何相关的 R 方法之后,我意识到我只是缺乏将一个与另一个调和的能力。有人可以帮我自动化这个过程吗?

里面有一篇论文致谢!

最佳答案

评论信息太多,所以我发布一个答案。这是我的想法(并阅读到最后,看看可能是什么问题):

我已尝试在 Flowing Data 教程中的原始数据上运行您的代码。 (显然你必须为月度数据添加一列,所以我只是添加了这一行来随机化月份:):

airports <- read.csv("http://datasets.flowingdata.com/tuts/maparcs/airports.csv",
                     header=TRUE) 
flights <- read.csv("http://datasets.flowingdata.com/tuts/maparcs/flights.csv", 
                    header=TRUE, as.is=TRUE)

# Add column with random data for month
flights$month <- sample(month.abb[1:4], nrow(flights), replace=TRUE)

每当我有一个需要很长时间才能运行的循环时,我通常会在其中添加一些代码来检查进度。使用您喜欢的:print , cat , tcltk::tkProgressBar .我用 message :
for (i in 1:length(monthyear)) {
  message(i)
  #
  # your code here
  #
}

无论如何,然后我运行了您的代码。一切都按应有的方式工作。由于我采样了四个月的数据,我得到:
  • 当前迭代 i 的消息打印四次
  • png情节,每个情节都有一张黑暗的世界地图和明亮的黄色线条。这是四行之一:

  • enter image description here

    那么,为什么它可以在我的机器上运行,而不是在你的机器上运行呢?

    我只能猜测,但我的猜测是你没有设置工作目录。没有setwd在您的代码中,以及对 png 的调用只是给出文件名。我怀疑您的代码正在写入系统中的任何工作目录。

    默认情况下,在我的安装中,工作目录是:
    getwd()
    [1] "C:/Program Files/eclipse 3.7"
    

    要解决此问题,请执行以下操作之一:
  • 使用setwd()将您的工作目录设置在脚本的顶部。
  • 或者在调用 png() 时使用完整路径和文件名
  • 关于r - 在 R 中自动生成大圆 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7238284/

    相关文章:

    R 无法在 conda 环境中加载 igraph

    r - 如何在标题中添加引号(bookdown)

    multithreading - go map 结构是线程安全的吗?

    javascript - 寻找一种算法来聚类 3d 点,围绕 2d 点

    java - 获取 tiff 文件的坐标

    r - 如何强制闲置的 worker 并行 R 接受工作?

    r - ggplot2 - 将奇数个图正确排列成一个图形

    java - 如何在java中接收 map 的差异?

    r - r 中的哪些投影会使城市 map 变胖?

    r - 在R中的ggmap中的geom_polygon数据上绘制文本标签