将 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
包通常更易于使用。
我对使用空间数据框还很陌生,我认为这是一个相对简单的任务:取一个包含 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
包通常更易于使用。