【发布时间】:2018-08-09 09:09:36
【问题描述】:
我已将这个问题作为Efficient way to plot data on an irregular grid 问题的一部分提出,但一般反馈是将原始问题拆分为更易于管理的部分。因此,这个新问题。
我使用在不规则二维网格上组织的卫星数据,其维度是扫描线(沿轨道维度,即 Y 轴)和地面像素(跨轨道维度,即 X 轴)。每个中心像素的经纬度信息存储在辅助坐标变量中,以及四个角坐标对(经纬度坐标在 WGS84 参考椭球上给出)。
让我们构建一个玩具数据集,其中包含一个 12x10 的潜在不规则网格和相关的表面温度测量值。
library(pracma) # for the meshgrid function
library(ggplot2)
num_sl <- 12 # number of scanlines
num_gp <- 10 # number of ground pixels
l <- meshgrid(seq(from=-20, to=20, length.out = num_gp),
seq(from=30, to=60, length.out = num_sl))
lon <- l[[1]] + l[[2]]/10
lat <- l[[2]] + l[[1]]/10
data <- matrix(seq(from = 30, to = 0, length.out = num_sl*num_gp),
byrow = TRUE, nrow = num_sl, ncol = num_gp) +
matrix(runif(num_gp*num_sl)*6, nrow = num_sl, ncol = num_gp)
df <- data.frame(lat=as.vector(lat), lon=as.vector(lon), temp=as.vector(data))
lon 和 lat 数据包含我正在使用的原始产品中提供的中心像素坐标,存储为二维矩阵,其轴为 ground_pixel(X 轴)和扫描线(Y 轴) . data 矩阵(相同的维度)包含我的测量值。然后我展平这三个矩阵并将它们存储在一个数据框中。
我想在地图上绘制地面像素(作为四边形),并相应地填充温度测量值。
使用我得到的图块:
ggplot(df, aes(y=lat, x=lon, fill=temp)) +
geom_tile(width=2, height=2) +
geom_point(size=.1) +
borders('world', colour='gray50', size=.2) +
coord_quickmap(xlim=range(lon), ylim=range(lat)) +
scale_fill_distiller(palette='Spectral') +
theme_minimal()
但这不是我所追求的。我可以使用width 和height 来使图块相互“接触”,但这当然不会接近我想要的目标,即绘制实际的投影地图上的地面像素。
例如,Python 的 xarray 可以根据像素中心坐标自动推断像素边界:
问题
有没有办法在 R 中实现相同的结果,即:从像素中心自动推断像素边界,并将像素绘制为地图上的填充多边形?也许使用sf 包?
我可以在这个question 的答案中看到它已经完成,但是我认为使用sf 的答案有点不清楚,因为它处理不同的投影和潜在的规则网格,而在我的情况下,我想我不必重新投影我的数据,而且,我的数据不在常规网格上。
如果这是不可能的,我想我可以在我的产品中使用像素边界信息,但如果这个问题被证明不容易解决,那么这可能是另一个问题的主题。
【问题讨论】:
-
你说你有每个瓦片角的坐标?我建议使用
sf创建平铺网格并使用ggplot的开发版本使用geom_sf进行绘图。如果在制作这些多边形时正确设置了 CRS,则应该可以获得所需的 python 图。具体如何做到这一点取决于坐标和温度测量值的存储方式——当前示例数据只有中心像素,对吧? -
是的,没错。我希望有一种简单的方法可以从像素中心推断像素边界。我已经看到了这个:
polys = as(SpatialPixelsDataFrame(orig_grid, orig_grid@data, tolerance = 0.149842),"SpatialPolygonsDataFrame")在这个answer 中完成,但是目前这实际上是如何工作的有点超出我的理解。但是,是的,我可以使用像素边界,事实上我已经这样做了,但这意味着创建 ID 列并合并两个数据帧,并且需要数百万个点的时间。我会为此发布另一个问题。 -
@stm4tt 使用您指向的答案我认为在这里不起作用,因为您的点网格未对齐。这个答案的关键是网格中心确实在 wgs lat long 但原始网格投影在另一个 crs 中。重新投影单元格进入原始 crs 使点对齐并适合
SpatialPixels转换。是否可以共享原始 NetCDF 数据以检查 crs ? -
@Gilles 我明白了,所以我想唯一的方法是利用提供的像素角点,用它们构建多边形,构造一个
sf空间数据框并从那里开始(例如ggplot+geom_sf)。我会试一试。至于原始的 NetCDF,它是一个 600+MB 的文件,太大而无法共享(也不允许共享)。但我print(nc)ed 并粘贴了here。