当前位置: 首页 > 知识库问答 >
问题:

R中的Mapview和太平洋地区的投影/crs问题

颛孙英才
2023-03-14

我正在尝试使用mapView在R中绘制跨越经度180度的太平洋网格的数据。本机crs是"proj=merclon_0=150lat_ts=0x_0=0y_0=0 data=WGS84单元=mno_defsellps=WGS84 towgs84=0,0,0"。等效数据的示例是:

test.coords<-as.data.frame(cbind(c(runif(15,-180,-130),runif(5,160,180)),runif(20,40,60)))
test.sp <- SpatialPointsDataFrame(coords = cbind(test.coords$V1,test.coords$V2), data = test.coords,
                                 proj4string = CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"))
test.sp <- spTransform(test.sp, 
          "+proj=merc +lon_0=150 +lat_ts=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0")
plot(test.sp)
mapview(test.sp)

使用绘图功能时,点居中,而使用 mapView 时,它们在地图的两侧(链接图像)之间拆分。使用 mapView 的视图是否可以以不同的经度为中心?

对此映射使用本机crs没有帮助。我收到一个错误。

mapview(plot, native.crs=TRUE)

警告消息:sf层不是经度数据

谢谢你。

mapView图片太平洋

共有2个答案

米修平
2023-03-14

这是多边形的解决方法 - 它会产生一些警告,但总体上可以完成这项工作。

# transform grid to standard latitude and longitude
# original grid in crs "+proj=merc +lon_0=150 +lat_ts=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0"
grid<-spTransform(grid,"+init=epsg:4326")
summary(coordinates(grid))

#       V1               V2       
# Min.   :-179.8   Min.   :37.17  
# 1st Qu.:-168.8   1st Qu.:51.70  
# Median :-154.3   Median :55.02  
# Mean   :-118.0   Mean   :54.65  
# 3rd Qu.:-131.4   3rd Qu.:58.31  
# Max.   : 179.8   Max.   :65.56  

out <- lapply(1:length(grid), function(i) grid[i, ])

for (i in 1:length(grid)) {

  cds <- slot(slot(slot(out[[i]], "polygons")[[1]], "Polygons")[[1]], "coords")

  cds_polygon <- Polygons(list(Polygon(cds)), ID="out.x")
  out.x <- SpatialPolygons(list(cds_polygon))
  proj4string(out.x) <- CRS("+init=epsg:4326")

  if (cds[1,1]>0) { # depending to which side one want to move polygons that are on both sides of International Date Line
    out.y <- elide(out.x, shift=c(-360,0))
  } else {
    out.y<-out.x}

  if(i==1){grid.shifted<-out.y} else {
    grid.shifted<-raster::union(grid.shifted,out.y)
  }
}

# add data in the original grid
grid.shifted <- SpatialPolygonsDataFrame(grid.shifted, grid@data, match.ID = F)

mapview(grid.shifted)

陈和裕
2023-03-14

好的,所以这是你问题的半最佳解决方案,原因有几个:

    < li >这只适用于点数据 < li >它可能无法很好地适应大型点集合 < li >投影到另一个CRS可能不再有效(尽管这实际上并不相关,因为当前的问题是关于可视化)

对于线组或多边形,我们需要另一种方法,但我目前不知道sp/sf原生解决方案来往返对象的坐标。

library(sp)
library(sf)
#> Linking to GEOS 3.6.1, GDAL 2.2.3, PROJ 4.9.3
library(mapview)

test.coords<-as.data.frame(cbind(c(runif(15,-180,-130),runif(5,160,180)),runif(20,40,60)))
test.sp <- SpatialPointsDataFrame(coords = cbind(test.coords$V1,test.coords$V2), data = test.coords,
                                  proj4string = CRS("+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"))

test_sf = st_as_sf(test.sp)

shift = function(x) {
    geom = st_geometry(x)
    st_geometry(x) = st_sfc(
        lapply(seq_along(geom), function(i) {
            geom[[i]][1] = ifelse(geom[[i]][1] < 0, geom[[i]][1] + 360, geom[[i]][1])
            return(geom[[i]])
        })
        , crs = st_crs(geom)
    )
    return(x)
}

mapview(shift(test_sf)) +
    mapview(test_sf, col.regions = "orange")

由reprex包(v0.3.0)于2019-12-11创建

我选择使用sf而不是sp,因为mapview在内部使用sf,并希望找到一种通用的方法来解决这个问题,这种方法可能会被集成。

 类似资料:
  • 为这个问题增加一个进一步的要求,我还需要蓝色(或任何其他颜色)的海洋。 对于PlateCarree投影,我可以简单地这样做 现在加上海洋的颜色 如果我现在想用极赤平投影 或 投影不起作用。当应用这个问题的答案时,我无法得到答案

  • D3默认包括了一些常见投影,如下所示。众多的(不太常用的)投影在扩展地理投影插件和多面体投影插件中是可用的。 由D3提供的大多数投影都是通过d3.geo.projection来创建并配置的,你可以旋转这个地球,缩放或转换画布等。除非你正在执行一个新的原始投影,否则你可能不会用D3.geo.projection来构造,但是你有可能使用这个配置方法。 d3.geo.projection(raw) 从指

  • 我对Angular project和TypeScript的语法有一个问题,我做了一个新的空Angular project,但PhpStorm(2019.2.1)不识别TypeScript语法。

  • 我要直截了当地说。我已经做了一些研究,但仍然没有弄清楚这一点。 我有一个程序,用一种颜色画一个立方体的每个面。然后我在Y轴和X轴上旋转这个立方体(-分别为45°和45°)。 问题在于它没有像我预期的那样呈现,立方体在某个时候被剪切。 代码: 我定义的所有顶点都是用±0.25制作的。所以我认为,至少用我的这些zNear和zFar值,它们仍然适合体积,但当我改变线时 为 它工作得很好 但是它不能与 有

  • 我有朗伯共形圆锥曲线投影x,y信息。 我需要WGS84坐标。但是我不知道lcc到底是什么。 我已经在下面提供了lcc的信息。 有没有办法把lcc转换成R中的WGS84? lcc信息: 第一标准平行纬度:30.0 第二标准平行纬度:60.0 原点纬度:38.0原点经度:126.0 计算点东面:43 计算点北面:136 4边缘lon,最低点:左上(43.3935,123.3102),左下(31.794

  • 我正在将Bostock的美国地图集(未过滤的美国各州shp文件)中的地图文件转换为topojson。最后我得到了这张地图。有人知道为什么吗? 我的投影代码:var svg=d3.select("#交互式")。插入("svg")。attr("宽度",w)。attr("高度",h); 我尝试过的原始文件(做同样的事情):12,转换文件:12,

  • 我试图使用一个投影来从一个实体中提取数据,它有一些关系。然而。投影上的构造函数接受三个参数;一个集合,整数和另一个整数。如果没有这个集合作为参数,这一切都很好,但是一旦我添加了这个集合,我就开始得到SQL语法查询错误。 这里有一个我正在使用的例子... 下面是我正在使用的查询(不完全相同,因为这是我正在处理的问题的简化版本).... 所以,我想我的主要问题是,我如何将一个集合作为一个对象包含在投影