Построение маршрутов, пересекающих международную линию дат, с использованием библиотеки листовок в R - PullRequest
0 голосов
/ 25 января 2019

Я заинтересован в построении маршрута от Ватерлоо до Тайваня с использованием библиотеки листовок для 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 голосов
/ 31 января 2019

Хитрость заключается в том, чтобы добавить 360 градусов к отрицательной долготе, возвращаемой gcIntermediate.Это создает непрерывный график, как показано ниже.

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

Может быть способ упростить код, но я не совсем уверен, как.

0 голосов
/ 25 января 2019

Как сказал Жан-Клод в своем комментарии, ваш нарисованный рукой путь длиннее, чем тот, который указан 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 дублировать участки пути, когда он пересекает линию даты, чтобы он шел прямо к краю графика.

...