使用R中的传单库绘制跨越国际日期线的路线

时间:2019-01-25 09:24:08

标签: r leaflet maps

我对使用R的传单库绘制从滑铁卢到台湾的路线感兴趣。使用gcIntermediate函数从地圈获得路线的坐标。但是,该路线涉及国际日期线的交叉,因此该路线在地图边缘被切除,并在顶部与一条直线相连。

我得到的图: 错误的地图

enter image description here

我想要的图: 理想地图

enter image description here

使用Google地图可以解决此问题,但是有没有办法使用传单解决此问题?如何修改下面的代码以获得理想的路线?谢谢!

代码:

library(dplyr)
library(leaflet)
library(geosphere)

# Source
latWaterloo <- 43.46687 
lngWaterloo <- -80.52464

# Destination
latTaiwan <- 23.5983
lngTaiwan <- 120.8354


m <- leaflet() %>% addTiles()
m <- addCircleMarkers(m, lng=c(lngWaterloo, lngTaiwan) , lat=c(latWaterloo, latTaiwan), popup=c("Waterloo","Taiwan"), radius=5, opacity=0.5)
geo_lines <- gcIntermediate(c(lngWaterloo, latWaterloo), c(lngTaiwan, latTaiwan), n=100, addStartEnd=T, sp=T, breakAtDateLine=F)
m <- addPolylines(m, data=geo_lines, color="blue")
m

m <- leaflet() %>% addTiles()
m

2 个答案:

答案 0 :(得分:2)

正如让·克洛德(Jean-Claude)在评论中所说,您的手绘路径比gcIntermediate给出的路径更长。要获取正确的路径,只需用gcIntermediate调用breakAtDateLine=TRUE

geo_lines <- gcIntermediate(c(lngWaterloo, latWaterloo), c(lngTaiwan, latTaiwan), n=100, addStartEnd=TRUE, sp=TRUE, breakAtDateLine=TRUE)
m <- addPolylines(m, data=geo_lines, color="blue")
m

产生

screenshot

我不知道是否有一种方法可以告诉leaflet在路径越过日期线时复制路径的各个部分,以便它直接到达图的边缘。

答案 1 :(得分:0)

诀窍是将gcIntermediate返回的负经度增加360度。这将产生一个连续的图,如下所示。

enter image description here

代码:

library(dplyr)
library(leaflet)
library(geosphere)

# Source
latWaterloo <- 43.46687 
lngWaterloo <- -80.52464

# Destination
latTaiwan <- 23.5983
lngTaiwan <- 120.8354


m <- leaflet() %>% addTiles()
geo_lines <- gcIntermediate(c(lngWaterloo, latWaterloo), c(lngTaiwan, latTaiwan), n=100, addStartEnd=T, sp=F, breakAtDateLine=F)
geo_lines <- data.frame(geo_lines)

# Add 360 degrees to lngWaterloo and all the negative longitudes returned by gcIntermediate
lngWaterloo <- lngWaterloo + 360
lonn <- vector(length=nrow(geo_lines))
for (j in 1:nrow(geo_lines)) {
  if (geo_lines[j,]$lon < 0) {
    lonn[j] <- geo_lines[j,]$lon + 360
  } else {
    lonn[j] <- geo_lines[j,]$lon
  }
}

m <- addCircleMarkers(m, lng=c(lngWaterloo, lngTaiwan) , lat=c(latWaterloo, latTaiwan), popup=c("Waterloo","Taiwan"), radius=2, opacity=0.5)
m <- addPolylines(m, lng=lonn, lat=geo_lines$lat, color="blue", weight=2)
m

也许有一种方法可以简化代码,但是我不太确定如何做到。