在地图上绘制线条 - gcIntermediate

b22*_*222 2 maps plot dictionary r

我的代码可以很好地生成从 A 点到 B 点的地图和线,但是对于远东半球的国家,该线会尝试穿过最短路径(例如澳大利亚以东)并中断以创建一条穿过该图的直线. 有什么建议?我缩短了代码并将其全部包含在下面以供使用。

提到(在代码中的链接中)使用greatCircle,但我无法让它工作。

谢谢!

adds <- c("Argentina",
          "Australia",
          "Germany",
          "Japan",
          "Korea")

# people are coming 'from' all those spots 'to' heidelberg
add0 <- "Salt Lake City, UT"

# get lat / lon
from <- geocode(adds)
to <- geocode(add0)

from

# see: http://flowingdata.com/2011/05/11/how-to-map-connections-with-great-circles/
library(maps)
library(geosphere)


# will need to adjust these limits...
xlim <- c(-170, 200)
ylim <- c(-50, 95)

quartz(file = "UCC.pdf",
       type = "pdf",
       height = 5, width = 9)

#print the map itself
map("world",
    fill=TRUE, 
    xlim=xlim, 
    ylim=ylim,
    # projection = "mercator",
    # orientation=c(90,-111, 0),
    col = grey(0.50),
    bg = grey(0.08), 
    lwd=0.05)

# following gets the 2D projection of a line moving between two points on a sphere
for (i in 1:nrow(from)) {
  inter <- gcIntermediate(c(from[i, "lon"], 
                            from[i, "lat"]), 
                          c(to[1, "lon"], 
                            to[1, "lat"]), 
                          n=500, addStartEnd = T)

  # and plot lines
  lines(inter, 
        col = grey(0.90), 
        lwd = 1)
}

dev.off()
Run Code Online (Sandbox Code Playgroud)

b22*_*222 5

想通了答案。breakAtDateLine 需要设置为 true。这将列表分开,下面的代码通过单独绘制线的每个部分来说明这一点。向 DA 寻求帮助。

for (i in 1:nrow(from)) {
  inter <- gcIntermediate(c(from[i, "lon"], 
                            from[i, "lat"]), 
                          c(to[1, "lon"], 
                            to[1, "lat"]), 
                          n=100, addStartEnd=TRUE, breakAtDateLine = T)

if (is.list(inter)) {
  inter1 <- inter[[1]] 
  inter2 <- inter[[2]]
  lines(inter1,
        col = grey(0.90),
        lwd = .75)
  lines(inter2,
        col = grey(0.90),
        lwd = .75)
} else {
  # and plot lines
  lines(inter,
        col = grey(0.90),
        lwd = .75)

}}

dev.off()
Run Code Online (Sandbox Code Playgroud)