【问题标题】:Shapefile and Raster with same CRS but NO output when clipping具有相同 CRS 但裁剪时无输出的 Shapefile 和 Raster
【发布时间】:2021-08-03 02:02:47
【问题描述】:

问题:绘图为空,使用 shapefile 裁剪栅格时没有结果。

我正在使用带有原始 EPSG4326 投影的 shapefile 和带有原始正弦投影的 MODIS 产品。正如您在脚本中看到的那样,我将两者都转换为相同的投影(DesiredCRS),但是在制作栅格剪辑时,我没有得到任何结果。

library(terra)
library(sf) 
library(sp) 
library(raster)

# Inputs
HDFfile <- "ModisProductsOriginal/MCD18A1.A2001001.h15v05.061.2020097222704.hdf"
Shapefile <- "Shapefile/Outline_5/Portugal_Outline_5_CAOP2019.shp"
DesiredCRS <- "+proj=longlat +datum=WGS84"

# Feature
Shp <- st_read(Shapefile)
Terceira <- Shp[Shp$DI == '43',1]
Terceira <- st_transform(Terceira, DesiredCRS)
plot(Terceira, axes=TRUE)

特塞拉的情节: Plot Output

# Modis data
SDSs <- sds(HDFfile)
SDS8 <- SDSs[8]
SDS8_template <- rast(ncol=1200, nrow=1200, xmin=-34, xmax=-24, ymin=36, ymax=41, crs=DesiredCRS)
SDS8_reprojected <- project(SDS8, SDS8_template) # Reproject changes pixels?
SDS8_raster <- raster(SDS8_reprojected)
plot(SDS8_raster)

SDS8_raster 的绘图:Plot Output

# Clip
Clip.step1 <- crop(SDS8_raster, extent(Terceira))
Clip <- mask(Clip.step1, Terceira)
plot(Clip)

Clip.step1 的情节:Plot Output

剪辑的情节:Plot Output

所有图像都显示具有相同投影的轴。我不明白我做错了什么......我是否正确定义了 CRS 和范围?

更新:

原始 shapefile 和原始 HDF 产品的全景视图: Panoply Output

Hijmans 将两个数据集绘制在一起:Plot Output

【问题讨论】:

  • 您可以将library(terra)library(sf) 放在顶部。 SDS8 的维度是什么,或者我们应该认为它们与 SDS8_template 相同?对 ?terra::project 模板的东西有点摸不着头脑..
  • Terceira 的 x 轴是 +,SDS8 是 -,尽管数字通常相同。
  • 感谢您的回复,已添加库。 dim(SDS8) 是 1200, 1200, 1。SDS8 是 SpatRaster,我使用 SDS8_template 和 SDS8_reprojected 来更好地控制栅格创建,但欢迎使用其他方法。
  • 是的,Terceira的x轴是正的,但是你有W(西),不应该被R认为是负的吗?
  • 是的,素数以西为负数。好吧,我猜表示形式并不重要,每个库都有一个绘图方法,使用哪种方法取决于所绘制对象的签名。 Clip.step1 的情节是什么样的?

标签: r crop raster mask shapefile


【解决方案1】:

调试起来很棘手,因为你混合了不同的包,而你没有show(object)。无论如何,这是一种 terra 方法,显示了查看对象元数据的位置;以及同时显示栅格和矢量数据的图。

library(terra)
HDFfile <- "MCD18A1.A2001001.h15v05.061.2020097222704.hdf"
Shapefile <- "Portugal_Outline_5_CAOP2019.shp"
DesiredCRS <- "+proj=longlat +datum=WGS84"

Shp <- vect(Shapefile)
Terceira <- Shp[Shp$DI == '43',1]

SDSs <- sds(HDFfile)
SDS8 <- SDSs[8]

首先将矢量数据投影到原始栅格数据。

TercSin <- project(Terceira, crs(SDS8))
plot(SDS8, 1)
lines(TercSin)

如您所见,这是行不通的。原因是GDAL/PROJ从文件中读取或者假设了错误的椭球体

cat(substr(crs(SDS8),1,230), "\n")
#PROJCRS["unnamed",
#    BASEGEOGCRS["Unknown datum based upon the Clarke 1866 ellipsoid",
#        DATUM["Not specified (based on Clarke 1866 spheroid)",
#            ELLIPSOID["Clarke 1866",6378206.4,294.978698213898,
               

或者像这样

describe("HDF4_EOS:EOS_GRID:\"MCD18A1.A2001001.h15v05.061.2020097222704.hdf\":MODISRAD:GMT_1200_DSR")[1:8]

#[1] "Driver: HDF4Image/HDF4 Dataset"                                         
#[2] "Files: MCD18A1.A2001001.h15v05.061.2020097222704.hdf"                   
#[3] "Size is 1200, 1200"                                                     
#[4] "Coordinate System is:"                                                  
#[5] "PROJCRS[\"unnamed\","                                                   
#[6] "    BASEGEOGCRS[\"Unknown datum based upon the Clarke 1866 ellipsoid\","
#[7] "        DATUM[\"Not specified (based on Clarke 1866 spheroid)\","       
#[8] "            ELLIPSOID[\"Clarke 1866\",6378206.4,294.978698213898,"      

正如您所指出的(请参阅here),MODIS(或至少某些产品)使用

modcrs <- "+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m"

让我们试试吧

TercSin <- project(Terceira, modcrs)
plot(SDS8, 1)
lines(TercSin)

看起来不错。所以我们需要这样做

crs(SDS8) <- modcrs

然后继续

Terceira <- project(Terceira, DesiredCRS)
Terceira

SDS8_template <- rast(ncol=1200, nrow=1200, xmin=-34, xmax=-24, ymin=36, ymax=41, crs=DesiredCRS)
SDS8_reprojected <- project(SDS8, SDS8_template) 
SDS8_reprojected

# Again plot the two datasets together
plot(SDS8_reprojected)
lines(Terceira)

Clip.step1 <- crop(SDS8_reprojected, Terceira)
Clip <- mask(Clip.step1, Terceira)
Clip

plot(Clip)
lines(Terceira)

【讨论】:

  • 这无疑简化了调试,并且考虑到事物r-geospatial 的不断变化和快速发展,也许这里/现在应该指向讨论愿望/成就的链接,以便可以替换复杂的库调用以后用更简单的方法。而我之前的想法让我松了一口气,Hijmans 会来引导我们走出目前的困境。
  • 感谢这种方法,两个数据集的图一起显示 shapefile (Terceira) 相对于栅格 (SDS8_reprojected) 向南位移。我怀疑这可能是问题所在,但是在 Panoply 中打开 shapefile 和 HDF 时,这种位移不存在,所以我怀疑问题出在文件上。我会将图片添加到问题中。
  • 你能分享一下HDF文件吗?另外,我会首先将矢量数据投影到原始栅格数据,以便找到问题的根源(参见编辑)。
  • 非常感谢您的帮助!我在 TercSin 之前添加了这一行:crs(SDS8)
  • 谢谢,我用它来扩展我的答案
猜你喜欢
  • 2021-11-05
  • 2015-05-08
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 2022-09-24
  • 2019-05-15
  • 1970-01-01
相关资源
最近更新 更多