我知道“应该使用 aes 创建映射”位已经完成,所以我希望这是一个足够不寻常的案例,因为我试图找出它发生的原因并提出不足。
根据这个线程stars
,我可以使用ggplot
. 我正在尝试将相同的对象绘制为轮廓。有问题的数据文件是All_Rasters_Scaled.asc。ggmap
geom_stars
library(stars)
lemons.ras <- read_stars("All_Rasters_Scales.asd")) %>%
st_set_crs(2958) %>%
st_transform(4326)
ggplot() +
geom_stars(data = lemons.ras)
工作正常。Edzer 告诉我st_contour
返回一个sf
带有轮廓的对象,你必须将它传递给geom_sf
. 所以:
mycontour <- st_contour(x = lemons.ras, contour_lines = FALSE, breaks = c(0.5, 0.95))
ggmap(myMap) + geom_sf(mycontour)
错误:
mapping
必须由aes()
我的印象是,在使用对象时不应该看到这个错误sf
,实际上这在某种程度上是sf
生态系统的重点,因为geometry
存在该列。该对象可能以某种方式被错误地创建并且具有所有 NA:
st_bbox(mycontour)
xmin ymin xmax ymax
呐呐呐呐呐
但是,如果我在没有指定任何参数的情况下创建它:
mycontour <- st_contour(x = lemons.ras)
bbox 输出是一样的。对象中的轮廓最小值/最大值也奇怪地重叠。无论我创建的方式如何mycontour
,我都会遇到同样的aes
错误。尝试指定 aes:
geom_sf(mycontour, mapping = aes())
坐标系已经存在。添加新的坐标系,它将替换现有的坐标系。FUN(X[[i]], ...) 中的错误:找不到对象“lon”
或者
geom_sf(mycontour, mapping = aes(geometry))
警告:忽略未知的美学:x 坐标系已经存在。添加新的坐标系,它将替换现有的坐标系。FUN(X[[i]], ...) 中的错误:找不到对象“纬度”
基本上看起来ggmap
/ggplot
框架不理解mycontour
, 创建者geom_contour
是一个sf
对象,并且它的aes
映射是geometry
列。
任何建议都非常感谢。我不确定是否存在geom_contour
无法正确创建对象的潜在问题,因此所有值都是NA
,并且我不知道如何从对象中提取geometry
数据。sf
mymap
对象的代码ggmap
是:
myLocation <- st_bbox(lemons.ras) %>% as.vector()
myMap <- get_map(location = myLocation)
但是sf
对象通常可以在空白处正常工作ggplot()+
提前致谢!
编辑:添加更多细节:
class(mycontour)
“sf” “data.frame”
mycontour$geometry[1]
为 1 个特征设置的几何图形
几何类型:MULTIPOLYGON
尺寸:XY
边界框: xmin: NA ymin: NA xmax: NA ymax: NA
大地 CRS:WGS 84
多多边形((((NA NA,NA NA,NA NA,NA NA,NA ...
更多编辑:
ggplot() +
geom_stars(lemons.ras)
工作正常,创建:
st_bbox(lemons.ras)
xmin ymin xmax ymax
-79.28970 25.68331 -79.21143 25.78939
即看起来也不错。
summary(lemons.ras)
Length Class Mode
All_Rasters_Scaled.asc 36270 -none- numeric
包括或不包括在内不x=
应该st_contour()
(并且,经过测试,不会)有所作为。我知道这是不必要的,但我喜欢这样做有两个原因:
明确表达很少会受到伤害,尤其是在共享代码和教他人时。
使用 RStudio 的代码完成宏,您可以在函数中点击选项卡,它会为您提供可供选择的参数列表。我尝试按顺序使用它们。此外,如果您明确使用
x
(或任何默认的第一个参数),那么宏将停止为您提供该参数选项。虽然所有次要语义:)
lemons.ras$All_Rasters_Scaled.asc
是一个矩阵数组,大小为 155x234,值范围从 0 到 1(它已被缩放,因此得名)。所以从概念上讲,mycontour
from中的任何值都不st_contour
应该是NA
.
st_contour
的参数na.rm
是默认的,因此我觉得无论如何TRUE
都应该删除这些s。NA
我越来越觉得有问题st_contour
...
根据getGDALVersionInfo()
有“GDAL 3.2.2,于 2021/03/05 发布”
@lovelery 的测试代码:
tif = system.file("tif/L7_ETMs.tif", package = "stars")
x = read_stars(tif)[, 1:50, 1:50, 1:2]
x[[1]] = round(x[[1]]/5)
l = st_contour(x, contour_lines = TRUE, breaks = 11:15)
plot(l[1], key.pos = 1, pal = sf.colors, lwd = 2, key.length = 0.8)
工作正常:
l
使用它创建st_contour(x, contour_lines = TRUE, ...)
多线串特征而不是多面特征。如果我对 执行相同操作lemons.ras
,则结果mycontour
具有所有 NA 值,这可能与问题有关。l
:
mycontour
:
创建它们的文件是st_contour
: x
:
lemons.ras
(注意这里有值,从 0 到 1):
差异:
x$L7_ETMs.tif
值是整数。但是将值放大lemons.ras
为整数,mycontour
仍然失败。x$L7_ETMs.tif
是 3 维 [50 x 50 x 2],lemons.ras$All_Rasters_Scales.asc
是 2 维 [155 x 234]。但是代码可以使用plot(l[1])
,plot(l)
所以额外的带/尺寸应该无关紧要,对吧?!
编辑:如果我从 , 中删除1:2
,x = read_stars
效果plot(l)
相同。但是:x 现在是类型:列表 [50 x 50 x 6]。之前是 [50 x 50 x 2]。好的,这是因为输入文件 ,L7_ETMs.tif
是 [349 x 352 x 6] 并且索引将其read_stars(tif)[, 1:50, 1:50, 1:2]
限制为 2 个波段。
st_dimensions(x)
给出:
st_dimensions(lemons.ras)
给出:
所以这可能是问题的根源。即使lemons.rasplot
已作为栅格导入并读入stars
,但它似乎缺少band
属性,老实说,这些属性看起来并没有添加太多东西,但也许st_contour
代码期望它们存在并且没有他们。
实际上看 st_dimensions 的直接输出可能更有启发性:对于 x:
对于柠檬.ras:
相比x
,lemons.ras
有NA
offset
,delta
和point
。x
有NULL
value
s,所以我猜x/y
几何数据x
在 中band
,而对于lemons.ras
它在value
s 中。LAWD 栅格数据令人困惑。
再次阅读星星介绍,看起来拆分和合并属性band
首先需要存在。所以这个问题看起来越来越多地是由于lemons.ras
输入栅格没有band
维度。
该文件是使用以下内容创建的:
writeRaster(x, name, format = "ascii", datatype = "FLT4S", bylayer = T)
我不知道选择是否ascii
意味着没有乐队信息?我对此表示怀疑?在代码前面创建原始栅格后,它具有以下属性:
类:光栅层
尺寸:3270、3245、10611150(nrow、ncol、ncell)
分辨率:50, 50 (x, y)
范围:594830.7、757080.7、2763971、2927471(xmin、xmax、ymin、ymax)
crs : +proj=utm +zone=17 +datum=WGS84 +units=m +no_defs
来源:记忆
名称:层
值:1、1(最小值、最大值)
在创建此文件期间,看起来band
或未layer
使用参数。这必然是一个单层/波段栅格,显然输出足够成功,可以在遇到这个问题之前经历多轮处理、编辑、连接、应用等。在创建栅格后使用setValues
. 上面有“名称:层”条目。
今天早上的中间结论:
我的输入栅格没有波段属性,只是一个普通/平面栅格,这对于简单的绘图来说很好,但显然不是星星所期望的丰富格式。然而,stars 将使用此文件并将其转换为(弱)stars 对象,但随后它将在 st_contour 中失败,可能是由于缺少乐队。