微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从PROJ4升级到PROJ6,并显示“废弃基准”警告 SF指向空间物体 SP指向空间物体光栅使用来自raster的自动重投影将点手动重新投影到栅格的crs 将栅格手动重新投影到点的crs

如何解决从PROJ4升级到PROJ6,并显示“废弃基准”警告 SF指向空间物体 SP指向空间物体光栅使用来自raster的自动重投影将点手动重新投影到栅格的crs 将栅格手动重新投影到点的crs

上下文

我的问题与从PROJ4升级到PROJ6引起的变化有关 以及在各种R空间包({{1},spsf)中的后果。

我们现在收到许多有关“废弃原点”的警告,看起来有些令人担忧,我 我对此应该怎么办有点疑惑。我看到这可能会带来可怕的后果 在某些情况下,在其他情况下可以忽略它们。

似乎我不是唯一一个有点迷路的人(请参阅here)。 我希望我的问题带有可复制的具体示例,有助于我们更好地理解该主题

我了解我们可以remove the warnings, 我已经阅读了上下文:r-spatial blog postMigration to PROJ6/GDAL3these workshop notes(地图视图似乎 在较新的版本中对此进行不同的处理)

问题

问题1:

可能是一个幼稚的问题:

我了解需要实施一种新的符号/格式(WKT) 在PROJ6中(例如,由于需要更高的精度),但我不明白为什么会有 需要从旧的proj4字符串符号中删除基准部分。为什么不只是 保持原样(并以新的WKT格式/符号实现新功能

问题2:

似乎有3种情况涉及旧proj4格式的数据丢失:

  1. 无警告:原点保留旧的proj4string表示法(rasterdéfault吗?)
  2. 我们有一个警告“已丢弃基准(...),但+ towgs84 =保留了值”
  3. 我们有一个警告“废弃的基准(...)”(在这种情况下,“ + towgs84 =” 字符串被丢弃/丢弃–> sf认? )

下面的示例说明了我们收到这些警告的不同情况。

为什么在同一CRS(此处为epsg 31370)上有这3种不同的情况?
删除基准点和/或sp部分有什么后果?
我应该对第二个警告比对第三个警告更担心吗?

问题3:

在下面的可复制示例中,我尝试从对应的栅格中提取值 到3点,栅格和点具有不同的CRS。 但是,根据使用的方法,我会得到不同的结果。 我的印象是,这与PROJ4 –> PROJ6的更改和基准有关 下降,但我可能错了。 我创建此示例仅是因为我想了解这些“基准下降”的后果 在crs

我使用函数+towgs84和3种不同的通用方法(每次都使用 raster::extractsf个对象),我希望从中得到相同的输出

  1. 无需人工重新投影,我让sp进行工作以匹配点和栅格的crs
  2. 手动将点投影到栅格的crs
  3. 将栅格手动投影到点的crs

使用第三种方法,我为raster::extractsp对象获得了2组不同的值,并且 我用第二种方法(也是第一种方法)得到了第三组值(然后,如果 我使用sfsp对象)。

  • 哪个值是“正确的”值? (可能是sf
  • 为什么某些方法会失败(这与警告消息/基准数据有关吗?)?
  • 当我对空间物体进行投影并且收到这些警告时,如何检查 我的空间物体已经“正确”投影了?

问题4:

是否可以就应该做什么提供一般性建议 当我们收到这些警告消息时?

例如:

  • 如果可能的话,不要使用旧的proj4字符串表示法,而应使用WKT表示法 (但这并不总是可能的。例如,在这里-如果我没记错,我被迫使用 旧的proj4表示法,因为这是351.7868 236.4216 309.0073用法
  • 如果我知道这里使用的栅格的epsg代码,我想最安全的方法是 使用带有raster代码重新投影点,例如:sf

可复制的示例

创建点和栅格空间数据+检查CRS的处理方式

SF指向空间物体

简而言之:CRS主要以WKT格式存储。 旧的proj4string可应要求提供,并且不会删除基准/ st_transform(SF,crs = xxxx)部分

towgs84

SP指向空间物体

简而言之:CRS主要以proj4字符串格式存储,并删除基准点和library(sf) #> Linking to GEOS 3.8.0,GDAL 3.0.2,PROJ 6.2.1 library(sp) library(raster) # create 3 points coo <- data.frame(x = c(246000,247000,246500),y = c(184000,186000,185000)) # create an sf spatial object SF <- st_as_sf(coo,coords = c("x","y"),crs = 31370) # Check the CRS : # the proj4string includes the datum/+towgs84 information - no warning st_crs(SF)$proj4string #> [1] "+proj=lcc +lat_0=90 +lon_0=4.36748666666667 +lat_1=51.1666672333333 +lat_2=49.8333339 +x_0=150000.013 +y_0=5400088.438 +ellps=intl +towgs84=-99.059,53.322,-112.486,0.419,-0.83,1.885,-1 +units=m +no_defs" # Same value with `raster::crs` but with a # Warning "discarded datum (...) but +towgs84= values preserved" raster::crs(SF) #> Warning in showSRID(uprojargs,format = "PROJ",multiline = "NO"): discarded datum UnkNown_based_on_International_1909_Hayford_ellipsoid in CRS deFinition,#> but +towgs84= values preserved #> CRS arguments: #> +proj=lcc +lat_0=90 +lon_0=4.36748666666667 +lat_1=51.1666672333333 #> +lat_2=49.8333339 +x_0=150000.013 +y_0=5400088.438 +ellps=intl #> +towgs84=-99.059,-1 +units=m +no_defs # WKT st_crs(SF) #> Coordinate Reference System: #> User input: epsg:31370 #> wkt: #> BOUNDCRS[ #> SOURCECRS[ #> PROJCRS["Belge 1972 / Belgian LAmbert 72",#> BASEGEOGCRS["Belge 1972",#> DATUM["Reseau National Belge 1972",#> ELLIPSOID["International 1924",6378388,297,#> LENGTHUNIT["metre",1]]],#> PRIMEM["Greenwich",#> ANGLEUNIT["degree",0.0174532925199433]],#> ID["epsg",4313]],#> CONVERSION["Belgian LAmbert 72",#> METHOD["LAmbert Conic Conformal (2SP)",#> #> (...) #> #> ID["epsg",1609],#> REMARK["Scale difference is given by information source as 0.999999. Given in this record in ppm to assist application usage. Very similar parameter values (to slightly less precision) used for BD72 to ETRS89: see code 1652."]]] cat(raster::wkt(SF)) # does not work with sf #> Error in raster::wkt(SF): tentative d'obtenir le slot "crs" d'un objet (classe "sf") qui n'est pas un objet S4 部分 与towgs84不同)。 新的WKT表示法将作为注释存储在CRS对象中,但与sf

不同
sf

光栅

SP <- coo coordinates(SP) <- ~x+y proj4string(SP) <- CRS("+init=epsg:31370") #> Warning in showSRID(uprojargs,multiline = "NO"): discarded #> datum Reseau_National_Belge_1972 in CRS deFinition # the proj4 string do not contain the `towgs84` part # Warning "discarded datum (...)" CRS("+init=epsg:31370") #> Warning in showSRID(uprojargs,multiline = "NO"): discarded #> datum Reseau_National_Belge_1972 in CRS deFinition #> CRS arguments: #> +proj=lcc +lat_0=90 +lon_0=4.36748666666667 +lat_1=51.1666672333333 #> +lat_2=49.8333339 +x_0=150000.013 +y_0=5400088.438 +ellps=intl +units=m #> +no_defs # With `raster::crs` same proj4string but no warning raster::crs(SP) #> CRS arguments: #> +proj=lcc +lat_0=90 +lon_0=4.36748666666667 +lat_1=51.1666672333333 #> +lat_2=49.8333339 +x_0=150000.013 +y_0=5400088.438 +ellps=intl +units=m #> +no_defs # WKT notation + a warning: this WKT is indeed different from the SF one (no datum here ?) cat(comment(CRS("+init=epsg:31370"))) #> Warning in showSRID(uprojargs,multiline = "NO"): discarded #> datum Reseau_National_Belge_1972 in CRS deFinition #> PROJCRS["Belge 1972 / Belgian LAmbert 72",#> BASEGEOGCRS["Belge 1972",#> DATUM["Reseau National Belge 1972",#> ELLIPSOID["International 1924",#> LENGTHUNIT["metre",#> #> (...) #> #> USAGE[ #> ScopE["unkNown"],#> AREA["Belgium - onshore"],#> BBox[49.5,2.5,51.51,6.4]]] # Same output without warning cat(raster::wkt(SP)) #> PROJCRS["Belge 1972 / Belgian LAmbert 72",6.4]]] 中,似乎同时存储了旧的proj4表示法和新的WKT表示法。

raster

此数据集的proj4string中不包含r <- raster::raster(system.file("external/test.Grd",package="raster")) raster::crs(r) #> CRS arguments: #> +proj=sterea +lat_0=52.1561605555556 +lon_0=5.38763888888889 #> +k=0.9999079 +x_0=155000 +y_0=463000 +datum=wgs84 +units=m +no_defs cat(raster::wkt(r)) #> PROJCRS["unkNown",#> BASEGEOGCRS["unkNown",#> DATUM["World Geodetic System 1984",#> ELLIPSOID["WGS 84",6378137,298.257223563,1]],#> ID["epsg",6326]],#> #> (...) #> #> AXIS["(N)",north,#> ORDER[2],#> LENGTHUNIT["metre",1,9001]]]] 部分。但是当你读 在proj4string中带有+towgs84部分的栅格似乎已被删除
不可复制的示例:

+towgs84

我可能还应该探讨当我们使用GISfolder <- "/my/path" tmp <- raster(paste0(GISfolder,'my_file.tif')) #> Warning in showSRID(uprojargs,multiline = "NO"): discarded #> datum UnkNown_based_on_International_1909_Hayford_ellipsoid in CRS deFinition raster::crs(tmp) #> CRS arguments: #> +proj=lcc +lat_0=90 +lon_0=4.36748666666667 +lat_1=49.8333339 #> +lat_2=51.1666672333333 +x_0=150000.01256 +y_0=5400088.4378 +ellps=intl #> +units=m +no_defs cat(raster::wkt(tmp)) #> PROJCRS["unkNown",#> DATUM["UnkNown based on International 1909 (Hayford) ellipsoid",#> ELLIPSOID["International 1909 (Hayford)",#> ID["epsg",9001]]]],#> PRIMEM["Greenwich",#> ANGLEUNIT["degree",0.0174532925199433],8901]]],9001]]]] 软件包而不是 stars,但这个问题 已经很长了(我在光栅包上有很多代码

从栅格中提取值

使用来自raster自动重投影

raster::extract

将点手动重新投影到栅格的crs

光栅中带有proj4string的SF
# extract the values from the raster,# the function extract reprojects the points
# in the same crs as the raster layer
extract(r,SF)
#> Warning in showSRID(uprojargs,#>  but +towgs84= values preserved
#> Warning in .local(x,y,...): Transforming SpatialPoints to the CRS of the
#> Raster
#> [1] 351.7868 236.4216 309.0073
extract(r,SP)
#> Warning in .local(x,...): Transforming SpatialPoints to the CRS of the
#> Raster
#> [1] 351.7868 236.4216 309.0073
栅格中的WKT进行SF
SF_proj <- st_transform(SF,crs = raster::crs(r))
extract(r,SF_proj)
#> [1] 351.7868 236.4216 309.0073
光栅中带有proj4string的SP
SF_proj <- st_transform(SF,crs = raster::wkt(r))
extract(r,SF_proj)
#> [1] 351.7868 236.4216 309.0073
栅格中带有WKT的SP

SP_proj <- spTransform(SP,raster::crs(r)) extract(r,SP_proj) #> [1] 351.7868 236.4216 309.0073 不接受wat fromat –>不起作用

sp::spTransform

将栅格手动重新投影到点的crs

使用SF的proj4string(带基准)

–>结果与以前的尝试不同

# error
SP_proj <- spTransform(SP,raster::wkt(r))
#> Error in CRS(CRSobj): PROJ4 argument-value pairs must begin with +: PROJCRS["unkNown",9001]]]]
# extract(r,SP_proj)
使用SF的WKT

–>不起作用,因为# epsg 31370 proj4 string with the datum: lAmbert72 <- sf::st_crs(31370)$proj4string lAmbert72 #> [1] "+proj=lcc +lat_0=90 +lon_0=4.36748666666667 +lat_1=51.1666672333333 +lat_2=49.8333339 +x_0=150000.013 +y_0=5400088.438 +ellps=intl +towgs84=-99.059,-1 +units=m +no_defs" # there is a warning when we project the raster but the full string seems to be used r2 <- raster::projectRaster(r,crs = lAmbert72) #> Warning in showSRID(uprojargs,#> but +towgs84= values preserved raster::crs(r2) #> CRS arguments: #> +proj=lcc +lat_0=90 +lon_0=4.36748666666667 +lat_1=51.1666672333333 #> +lat_2=49.8333339 +x_0=150000.013 +y_0=5400088.438 +ellps=intl #> +towgs84=-99.059,-1 +units=m +no_defs extract(r2,SP) #> [1] 341.6399 222.1028 301.2286 不接受WKT格式 其raster::projectRaster参数

crs
使用SP的proj4string(无基准)

–>结果与之前的尝试不同

lAmbert72 <- sf::st_crs(31370)
lAmbert72
#> Coordinate Reference System:
#>   User input: epsg:31370 
#>   wkt:
#> BOUNDCRS[
#>     SOURCECRS[
#>         PROJCRS["Belge 1972 / Belgian LAmbert 72",#>
#> (...)
#> 
#>             AREA["Belgium - onshore"],#>             BBox[49.5,6.4]],#>         ID["epsg",#>         REMARK["Scale difference is given by information source as 0.999999. Given in this record in ppm to assist application usage. Very similar parameter values (to slightly less precision) used for BD72 to ETRS89: see code 1652."]]]
r2 <- raster::projectRaster(r,crs = lAmbert72)
#> Error in wkt(projto): tentative d'obtenir le slot "crs" d'un objet (classe "crs") qui n'est pas un objet S4

sessionInfo

# epsg 31370 proj4 string without the datum:
lAmbert72 <- sp::CRS("+init=epsg:31370")@projargs
#> Warning in showSRID(uprojargs,multiline = "NO"): discarded
#> datum Reseau_National_Belge_1972 in CRS deFinition
lAmbert72
#> [1] "+proj=lcc +lat_0=90 +lon_0=4.36748666666667 +lat_1=51.1666672333333 +lat_2=49.8333339 +x_0=150000.013 +y_0=5400088.438 +ellps=intl +units=m +no_defs"
# warning
r3 <- raster::projectRaster(r,multiline = "NO"): discarded
#> datum UnkNown_based_on_International_1909_Hayford_ellipsoid in CRS deFinition
raster::crs(r3)
#> CRS arguments:
#>  +proj=lcc +lat_0=90 +lon_0=4.36748666666667 +lat_1=51.1666672333333
#> +lat_2=49.8333339 +x_0=150000.013 +y_0=5400088.438 +ellps=intl +units=m
#> +no_defs

extract(r3,coo)
#> [1] 348.5775 329.1199 277.2260

用于:

sessionInfo()
#> R version 3.6.2 (2019-12-12)
#> Platform: x86_64-pc-linux-gnu (64-bit)
#> Running under: Ubuntu 18.04.4 LTS
#>
#> (...)
#> 
#> other attached packages:
#> [1] raster_3.3-13 sp_1.4-2      sf_0.9-5      knitr_1.29   
#> 
#> (...)
#> 

reprex package(v0.3.0)于2020-09-03创建

解决方法

https://gis.stackexchange.com/questions/372692中给出的一些注释。请首先去那里。

  1. 我了解需要新的符号/格式(WKT) 在PROJ6中实现(例如,由于需要更高的精度),但是我 不明白为什么需要从 旧的proj4字符串表示法。为什么不保留它一如既往的 (并以新的WKT格式/符号实现新功能)

GDAL中的+datum=部分已从GDAL> = 3中弃用。由于 sf rgdal raster 如果使用GDAL来读取文件,则除了WGS84,NAD83和NAD27之外,Proj4字符串表示可能没有全部exportToProj4()。警告来自检查运行+datum=之前内部存在哪些节点以及之后存在哪些节点。当我们使用PROJ> = 6 / GDAL> = 3时,我们不能依靠exportToProj4()+datum=

有关示例的其他评论

+towgs84=

我正在使用开发版本以及PROJ和GDAL的最新版本。

> library(sf)
Linking to GEOS 3.8.1,GDAL 3.1.3,PROJ 7.1.1
> #> Linking to GEOS 3.8.0,GDAL 3.0.2,PROJ 6.2.1
> library(sp)
> library(raster)
> packageVersion("sf")
[1] ‘0.9.6’
> packageVersion("sp")
[1] ‘1.4.4’
> packageVersion("raster")
[1] ‘3.3.13’
> library(rgdal)
rgdal: version: 1.5-17,(SVN revision 1060)
Geospatial Data Abstraction Library extensions to R successfully loaded
Loaded GDAL runtime: GDAL 3.1.3,released 2020/09/01
Path to GDAL shared files: /usr/local/share/gdal
GDAL binary built with GEOS: TRUE 
Loaded PROJ runtime: Rel. 7.1.1,September 1st,2020,[PJ_VERSION: 711]
Path to PROJ shared files: /home/rsb/.local/share/proj:/usr/local/share/proj:/usr/local/share/proj
PROJ CDN enabled: FALSE
Linking to sp version:1.4-4
To mute warnings of possible GDAL/OSR exportToProj4() degradation,use options("rgdal_show_exportToProj4_warnings"="none") before loading rgdal.

现在Proj4字符串中没有> coo <- data.frame(x = c(246000,247000,246500),y = c(184000,186000,185000)) > SF <- st_as_sf(coo,coords = c("x","y"),crs = 31370) > st_crs(SF)$proj4string [1] "+proj=lcc +lat_0=90 +lon_0=4.36748666666667 +lat_1=51.1666672333333 +lat_2=49.8333339 +x_0=150000.013 +y_0=5400088.438 +ellps=intl +towgs84=-99.059,53.322,-112.486,0.419,-0.83,1.885,-1 +units=m +no_defs" > st_crs(SF) Coordinate Reference System: User input: EPSG:31370 wkt: PROJCRS["Belge 1972 / Belgian Lambert 72",BASEGEOGCRS["Belge 1972",DATUM["Reseau National Belge 1972",ELLIPSOID["International 1924",6378388,297,LENGTHUNIT["metre",1]]],PRIMEM["Greenwich",ANGLEUNIT["degree",0.0174532925199433]],ID["EPSG",4313]],CONVERSION["Belgian Lambert 72",METHOD["Lambert Conic Conformal (2SP)",9802]],PARAMETER["Latitude of false origin",90,0.0174532925199433],8821]],PARAMETER["Longitude of false origin",4.36748666666667,8822]],PARAMETER["Latitude of 1st standard parallel",51.1666672333333,8823]],PARAMETER["Latitude of 2nd standard parallel",49.8333339,8824]],PARAMETER["Easting at false origin",150000.013,1],8826]],PARAMETER["Northing at false origin",5400088.438,8827]]],CS[Cartesian,2],AXIS["easting (X)",east,ORDER[1],1]],AXIS["northing (Y)",north,ORDER[2],USAGE[ SCOPE["unknown"],AREA["Belgium - onshore"],BBOX[49.5,2.5,51.51,6.4]],31370]] ,但是WKT2_2019字符串中存在所有CRS规范。 +datum=对象中没有$proj4string,如果需要,它是即时生成的。

我们仍在进行强制,但已经有了:

"crs"

下一步:

> cat(raster::wkt(as(SF,"Spatial")),"\n")
PROJCRS["Belge 1972 / Belgian Lambert 72",31370]] 

您注意到 > SP <- coo > coordinates(SP) <- ~x+y > proj4string(SP) <- CRS("+init=epsg:31370") Warning message: In showSRID(uprojargs,format = "PROJ",multiline = "NO",prefer_proj = prefer_proj) : Discarded datum Reseau_National_Belge_1972 in CRS definition > cat(wkt(SP),8827]],19961]],AXIS["(E)",1,9001]]],AXIS["(N)",6.4]]] 已经消失了,这是因为WKT2_2019中的DATUM绝对足以在需要时生成坐标操作。 PROJ> = 6 / GDAL> = 3无需转换为WGS84 GEOGCRS集线器,也无需转换为目标CRS。发出警告是因为+towgs84=既生成WKT2_2019字符串(已完全指定),又生成旧版Proj4字符串-现代PROJ / GDAL缺少位,我们希望没人再依赖它-如果这样做,您已经被警告。

我现在将其留在这里,指的是SE线程上的回复。如果 raster 开发人员可以发表评论,这将是有帮助的,但是据我们从反向依赖性检查中可以看到,光栅似乎已经过渡为在使用Proj4时优先使用WKT2_2019(与其他软件包一样)。 PROJ> = 6 / GDAL> =3。由于某些平台仍然是PROJ

,

根据我现在的理解得出部分答案。
NB:我完全不完全确定这一点。因此,如果我错了,请提供反馈…

总体思路是,sfsp倾向于默认使用 新的WKT表示法(可正确处理基准),即使它们可以显示(或根据要求检索) 旧的且已弃用的proj4字符串表示法(带或不带基准)。

到目前为止(至少对我来说)情况尚不清楚 关于能够提供WKT标记(raster)作为{ 字符串,但似乎仍然严重依赖proj4字符串。

因此,在大多数情况下,除非您强制使用 proj4表示法。但是对于raster::wkt,我仍然感到困惑,可能想念一些东西…… 我暂时不愿意使用raster

我们现在可以尝试了解哪些答案是正确的,以及为什么:

raster::projectRaster

以下方法似乎是安全的,因为我们从 栅格(作为library(sf) #> Linking to GEOS 3.8.0,PROJ 6.2.1 library(sp) library(raster) # create a raster r <- raster::raster(system.file("external/test.grd",package="raster")) # create an sf spatial object coo <- data.frame(x = c(246000,185000)) SF <- st_as_sf(coo,crs = 31370) # create an equivalent sp object SP <- coo coordinates(SP) <- ~x+y proj4string(SP) <- CRS(SRS_string = "EPSG:31370") # better than CRS("+init=epsg:31370") ?? 提供的字符串),我们将 raster::wktsf指向这个新的坐标参考系统。

sp

当我们使用SF_to_r <- st_transform(SF,crs = raster::wkt(r)) raster::extract(r,SF_to_r) # result (correct) : 351.7868 236.4216 309.0073 # note the use of `SRS_string` argument. `CRS(raster::wkt(r))` won't work SP_to_r <- spTransform(SP,CRS(SRS_string = raster::wkt(r))) raster::extract(r,SF_to_r) # result (correct) : 351.7868 236.4216 309.0073 class(raster::wkt(r)) # character 时,以下方法似乎也可以工作(相同的结果) 从raster::crs包中返回CRS类对象。我想这是因为 spsf均安全使用此对象提供的新WKT表示法(即使 如果对象显然只包含proj4字符串,则WKT有点“隐藏” 在附加到对象的注释中)

sp

当我们投影栅格时,我们当然可以期望2 以下方法(一种使用SF_to_r <- st_transform(SF,crs = raster::crs(r)) raster::extract(r,SF_to_r) # result : 351.7868 236.4216 309.0073 SP_to_r <- spTransform(SP,raster::crs(r)) raster::extract(r,SF_to_r) # result : 351.7868 236.4216 309.0073 class(raster::crs(r)) # CRS class from `sp` str(raster::crs(r)) # 1 slot with the proj4 string cat(comment(raster::crs(r))) # this is where the WKT notation is "hidden" ,一种使用sp),因为我们强制使用 proj4字符串(带有提供简单字符向量的sf$proj4string)。 应该始终避免这种情况……

我不确定这两个选项为何提供不同的结果 但是我现在非常有信心这两个结果都是错误的。也许他们有所不同,因为 数据在管道中的不同时刻被删除(提供的初始字符串为 sp和sf之间的字符向量是否不同?

@projargs

我们可以期望提供完整的CRS对象(而不是强制使用 字符proj4字符串)即可解决此问题。但事实并非如此。 也许是因为r_to_sf <- raster::projectRaster(r,crs = sf::st_crs(31370)$proj4string) raster::extract(r_to_sf,SF) # result (wrong) : 341.6399 222.1028 301.2286 r_to_sp <- raster::projectRaster(r,crs = sp::CRS("+init=epsg:31370")@projargs) raster::extract(r_to_sp,SF) # result (wrong) : 348.5775 329.1199 277.2260 class(sf::st_crs(31370)$proj4string) # character class(sp::CRS("+init=epsg:31370")@projargs) # character 内部依赖于旧的proj4字符串??

不过,据罗杰·比万德(Roger Bivand)说:

从反向依赖检查中可以看到,栅格似乎已经过渡 PROJ> = 6 / GDAL> = 3

时,优先使用WKT2_2019(与其他软件包一样)优先于Proj4

所以我可能在某个地方错了,我仍然不知道如何安全地重新投影栅格对象...

raster

使用r_to_sp <- raster::projectRaster(r,crs = sp::CRS("+init=epsg:31370")) raster::extract(r_to_sp,SP) # result (wrong) : 341.6399 222.1028 301.2286 # same result with a slightly different syntax for CRS r_to_sp <- raster::projectRaster(r,crs = sp::CRS(SRS_string = "EPSG:31370")) raster::extract(r_to_sp,SP) # result (wrong) : 341.6399 222.1028 301.2286 包,我们可以通过重新投影点或将点重新投影来获得“正确”结果。 栅格。但是,似乎stars函数具有一些不可用的功能 直接raster::extract(例如,使用多边形时为每个单元格计算权重)

Usefull raster vs stars function comparison

stars

这可能对反射有用吗?

Recommenadations from Roger Bivand

如果可能,请避免使用Proj4字符串实例化“ CRS”对象,而应使用library(stars) STARS <- stars::read_stars(system.file("external/test.grd",package="raster")) # reproject the points into the same crs as the stars raster SF_to_STARS <- st_transform(SF,crs = st_crs(STARS)) aggregate(STARS,SF_to_STARS,function(x) x[1],as_points = FALSE)$test.grd # result (correct) = 351.7868 236.4216 309.0073 # reproject the stars raster into the same crs as the points STARS_to_SF <- st_transform(STARS,crs = st_crs(SF)) aggregate(STARS_to_SF,SF,as_points = FALSE)$test.grd # result (correct) = 351.7868 236.4216 309.0073

例如:

CRS(SRS_string=

所以(??)也可能是

# preferd syntax :
CRS(SRS_string = "OGC:CRS84")
#> Error in if (in_format == 4L) {: valeur manquante là où TRUE / FALSE est requis
# instead of :
CRS("+proj=longlat +datum=WGS84")

而不是:

CRS(SRS_string = "EPSG:31370")

避免使用CRS("+init=epsg:31370") ,而是选择proj4string(x) <- proj4string(y)

reprex package(v0.3.0)于2020-09-09创建

,

这是我对您问题1的答复:

我了解需要新的符号/格式(WKT) 在PROJ6中实现(例如,由于需要更高的精度),但是我 不明白为什么需要从 旧的proj4字符串表示法。为什么不保留它一如既往的 (并以新的WKT格式/符号实现新功能)

我不知道为什么PROJ开发人员决定取消向后兼容性,但我认为这样做有充分的理由。而且没有人自愿参加这项工作。

作为R /空间开发人员(以及其他使用PROJ构建软件的人员),我们必须忍受这一点。问题是我们需要适应不同的PROJ版本(尤其是在Linux系统上)。试图向后兼容的同时向前移动会造成严重的混乱。

在R之类的脚本环境中,无法使用proj4表示法是一个真正的损失。proj4表示法可以直接理解; EPSG代码不透明,使用它们很容易导致错误。另外,如果没有可用的EPSG代码,则需要弄清楚如何编写自己的WKT。

栅格中的CRS

raster中的CRS对象与sprgdal中的CRS对象相同。它存储proj4和wkt表示法。罗杰·比万德(Roger Bivand)解释了为什么给出警告。

提取

要从栅格中提取值,请始终变换点(线,多边形),而不是栅格。转换栅格将导致新估计的值与原始值不同。请参阅讨论here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。