首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >修复以太平洋为中心(0°-360°经度)显示的地图库数据

修复以太平洋为中心(0°-360°经度)显示的地图库数据
EN

Stack Overflow用户
提问于 2011-03-18 22:10:41
回答 4查看 14K关注 0票数 21

我正在使用R maps包在世界地图上绘制一些点,如下所示:

绘制底图的命令是:

代码语言:javascript
复制
map("world", fill=TRUE, col="white", bg="gray", ylim=c(-60, 90), mar=c(0,0,0,0))

但我需要显示以太平洋为中心的地图。我使用map("world2",等来使用地图包中以太平洋为中心的底图,并使用以下命令转换我的数据框架(df)中数据点的坐标:

代码语言:javascript
复制
df$longitude[df$longitude < 0] = df$longitude[df$longitude < 0] + 360

如果我不使用fill选项,但使用fill时,与0°相交的多边形会导致问题。

我想我需要以某种方式转换maps库中的多边形数据来解决这个问题,但我不知道如何做到这一点。

我理想的解决方案是绘制一个左边界为-20°,右边界为-30°(即330°)的地图。下面将正确的点和海岸线放到地图上,但过零问题是相同的

代码语言:javascript
复制
df$longitude[df$longitude < -20] = df$longitude[d$longitude < -20] + 360
map("world", fill=TRUE, col="white", bg="gray", mar=c(0,0,0,0),
  ylim=c(-60, 90), xlim=c(-20, 330))
map("world2", add=TRUE, col="white", bg="gray", fill=TRUE, xlim=c(180, 330))

任何帮助都将不胜感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-04 20:37:17

您可以利用这样一个事实:在内部,由map()函数返回的map对象可以重新计算,并在map()函数中再次使用。我会创建一个包含单个多边形的列表,检查哪些多边形具有非常不同的经度值,并重新排列这些多边形。我在下面的函数*中给出了这种方法的一个例子,它允许这样的事情:

代码语言:javascript
复制
plot.map("world", center=180, col="white",bg="gray",
   fill=TRUE,ylim=c(-60,90),mar=c(0,0,0,0))

要获得

如果我是你,我会把所有的东西都移动一点,就像下面这样:

代码语言:javascript
复制
plot.map("world", center=200, col="white",bg="gray",
   fill=TRUE,ylim=c(-60,90),mar=c(0,0,0,0))

函数:

代码语言:javascript
复制
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,...)
}

*请注意,此函数仅采用正中心值。它很容易调整,以允许两个方向的中心值,但我不再麻烦,因为这是微不足道的。

票数 17
EN

Stack Overflow用户

发布于 2017-08-17 21:46:06

安装最新版本的地图(3.2.0)。

执行以下操作:

代码语言:javascript
复制
d$lon2 <- ifelse(d$lon < -25, d$lon + 360, d$lon) # where d is your df
mapWorld <- map_data('world', wrap=c(-25,335), ylim=c(-55,75))

ggplot() +
geom_polygon(data = mapWorld, aes(x=long, y = lat, group = group)) +
geom_point(data = d, aes(x = lon2, y = lat))
票数 5
EN

Stack Overflow用户

发布于 2015-12-08 19:44:28

有点晚了,但您也可以使用投影创建一个移动的贴图(需要mapproj包):

代码语言:javascript
复制
  map("world", projection="rectangular", parameter=0, 
      orientation=c(90,0,180), wrap=TRUE, fill=T, resolution=0,col=0)

这将会移动180度。但与'world2‘的不同之处在于,经度坐标将不同(-pi,pi)。这个包的所有预测都将0放在中心位置。在这种情况下,'wrap‘选项会正确地检测跳转。

'resolution=0‘有助于获得更清晰的边框。

您可以通过更改投影描述中的'180‘值轻松地更改中心经度。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5353184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档