我对使用R的传单库绘制从滑铁卢到台湾的路线感兴趣。使用gcIntermediate函数从地圈获得路线的坐标。但是,该路线涉及国际日期线的交叉,因此该路线在地图边缘被切除,并在顶部与一条直线相连。
我得到的图: 错误的地图
我想要的图: 理想地图
使用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
答案 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
产生
我不知道是否有一种方法可以告诉leaflet
在路径越过日期线时复制路径的各个部分,以便它直接到达图的边缘。
答案 1 :(得分:0)
诀窍是将gcIntermediate返回的负经度增加360度。这将产生一个连续的图,如下所示。
代码:
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
也许有一种方法可以简化代码,但是我不太确定如何做到。