Вы можете использовать тот факт, что внутренне объект map
, возвращаемый функцией map()
, может быть пересчитан и использован снова в функции map()
.Я бы создал список с отдельными полигонами, проверил, какие из них имеют очень разные значения долготы, и переставил их.Я привел пример такого подхода в функции ниже *, которая позволяет что-то вроде:
plot.map("world", center=180, col="white",bg="gray",
fill=TRUE,ylim=c(-60,90),mar=c(0,0,0,0))
, чтобы получить
На вашем месте яизменил бы все немного больше, например:
plot.map("world", center=200, col="white",bg="gray",
fill=TRUE,ylim=c(-60,90),mar=c(0,0,0,0))
Функция:
plot.map<- function(database,center,...){
Obj <- map(database,...,plot=F)
coord <- cbind(Obj[[1]],Obj[[2]])
# split up the coordinates
id <- rle(!is.na(coord[,1]))
id <- matrix(c(1,cumsum(id$lengths)),ncol=2,byrow=T)
polygons <- apply(id,1,function(i){coord[i[1]:i[2],]})
# split up polygons that differ too much
polygons <- lapply(polygons,function(x){
x[,1] <- x[,1] + center
x[,1] <- ifelse(x[,1]>180,x[,1]-360,x[,1])
if(sum(diff(x[,1])>300,na.rm=T) >0){
id <- x[,1] < 0
x <- rbind(x[id,],c(NA,NA),x[!id,])
}
x
})
# reconstruct the object
polygons <- do.call(rbind,polygons)
Obj[[1]] <- polygons[,1]
Obj[[2]] <- polygons[,2]
map(Obj,...)
}
* Обратите внимание, что эта функция занимает только положительный центрценности.Он легко адаптируется для учета значений центра в обоих направлениях, но я больше не беспокоился, поскольку это тривиально.