将 lat/long 坐标绘制成正式的 Class 栅格图层(因子)地图,并在 R 中使用 aea 投影?

Plotting lat/long coordinates into a Formal Class Raster Layer (factor) map with aea projection in R?

我对使用空间数据框还很陌生,我认为这是一个相对简单的任务:取一个包含 6 个点的数据框,x 和 y 列代表这些点的 lat/long 位置,并投影它们,以便它们可以在我制作的空间数据框中使用。

这是我在 6 点中编码的方式:

d1 <- structure(list(latitude = c(37.427733, 37.565759, 37.580956, 37.429285, 37.424270, 37.502496), longitude = c(-108.011061, -107.814039, -107.676662, -107.677166, -108.898826, -108.586042)))

d2 <- as.data.frame(d1)

d3 <- SpatialPointsDataFrame(c(d2[,c('longitude','latitude')]), data = d2)

我尝试了 changing/assigning 投影(这些 lat/long 数据取自 Google 地图),但我似乎无法让它工作。我要叠加这些点的数据投影如下:

+proj=aea +lat_0=23 +lon_0=-96 +lat_1=29.5 +lat_2=45.5 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs

所以基本上我的问题是,如何将这些 lat/long 转换为此投影使用的 x/y 格式?这是我要叠加的数据集的范围以供参考,表明它显然不是简单的 lat/long:

class      : Extent 
xmin       : -1145835 
xmax       : -1011345 
ymin       : 1613205 
ymax       : 1704855 

先谢谢大家了!

您需要将空间点(重新)投影到与其他数据源相同的投影中。我更熟悉用于在 R 中处理空间矢量信息的 sf 包,但看起来您正在使用 sp 包笼。

第一步是将数据框分配给正确的投影。经纬度一般都是WGS84,或者epsg:4326所以:

library(sp)

d1 <- structure(list(latitude = c(37.427733, 37.565759, 37.580956, 37.429285, 37.424270, 37.502496), longitude = c(-108.011061, -107.814039, -107.676662, -107.677166, -108.898826, -108.586042)))

d2 <- as.data.frame(d1)

d3 <- SpatialPointsDataFrame(c(d2[,c('longitude','latitude')]), data = d2)


proj4string(d3) <- CRS("+init=epsg:4326")

sf::st_bbox(d3)
# xmin       ymin       xmax       ymax 
# -108.89883   37.42427 -107.67666   37.58096 

看summary,或者this extent,可以看到经纬度和原来一样。现在我们可以使用您提供的 proj4string 重新投影

target_crs = CRS("+proj=aea +lat_0=23 +lon_0=-96 +lat_1=29.5 +lat_2=45.5 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs")  # This is your string assigned to an object


d4 = spTransform(d3, target_crs) ## object used to transform your data frame

sf::st_bbox(d4)
# xmin     ymin     xmax     ymax 
# -1127246  1661667 -1018854  1679942 

您的坐标现在显示在目标 space 中,并且应该能够绘制在您的背景数据之上。

如果您愿意使用替代包,sf::st_transform() 更容易使用,sf 包通常更易于使用。