R 光栅:光栅;等高线不是连续的
我正在尝试使用R中的R 光栅:光栅;等高线不是连续的,r,raster,sf,r-raster,R,Raster,Sf,R Raster,我正在尝试使用R中的raster包从光栅对象提取等高线 rasterToContour似乎工作良好,绘制效果良好,但调查时,轮廓线似乎被分割成不规则的部分。来自?rasterToContour library(raster) f <- system.file("external/test.grd", package="raster") r <- raster(f) x <- rasterToContour(r) class(x) plo
raster
包从光栅对象提取等高线
rasterToContour
似乎工作良好,绘制效果良好,但调查时,轮廓线似乎被分割成不规则的部分。来自?rasterToContour
library(raster)
f <- system.file("external/test.grd", package="raster")
r <- raster(f)
x <- rasterToContour(r)
class(x)
plot(r)
plot(x, add=TRUE)
然后,我们使用st_intersects
查找与站点相交的线(缓冲区宽度为100以确保其与该线接触)。但是,这将返回所有等高线
contours_sf %>%
filter(
st_intersects(., site_sf %>% st_buffer(100), sparse = FALSE)[1,]
) %>%
ggplot()+
geom_sf()
我假设所有行都返回,因为它们似乎是单个多行线
sf
对象
contours_sf
# Simple feature collection with 1 feature and 1 field
# geometry type: MULTILINESTRING
# dimension: XY
# bbox: xmin: 178923.1 ymin: 329720 xmax: 181460 ymax: 333412.3
# CRS: +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
# level geometry
# C_1 326.849822998047 MULTILINESTRING ((179619.3 ...
因此,我使用ngeo::st_segments()
(我找不到任何sf
方法来实现这一点,但我愿意使用替代方法,特别是如果这是问题的话)
出乎意料的是,这返回了394个特性;从图上看,我预计大约有15行
contours_sf %>%
nngeo::st_segments()
# Simple feature collection with 394 features and 1 field
# geometry type: LINESTRING
# dimension: XY
# bbox: xmin: 178923.1 ymin: 329720 xmax: 181460 ymax: 333412.3
# CRS: +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
# First 10 features:
# level result
# 1 326.849822998047 LINESTRING (179619.3 329739...
# 2 326.849822998047 LINESTRING (179580 329720.4...
# 3 326.849822998047 LINESTRING (179540 329720, ...
# 4 326.849822998047 LINESTRING (179500 329735.8...
# 5 326.849822998047 LINESTRING (179495.3 329740...
# 6 326.849822998047 LINESTRING (179460 329764, ...
# 7 326.849822998047 LINESTRING (179442.6 329780...
# 8 326.849822998047 LINESTRING (179420 329810, ...
# 9 326.849822998047 LINESTRING (179410.2 329820...
# 10 326.849822998047 LINESTRING (179380 329847.3...
然后,当我们过滤以仅保留与场地相交的线(缓冲区宽度为100)时,仅返回预期轮廓线的一小部分(线的红色部分,我假设反射100缓冲区宽度)
有人对以下几点有想法:
nngeo::st_segments()
的替代方案将多重字符串转换为线条字符串似乎可以满足您的需要:
contours_sf %>% st_cast("LINESTRING") %>%
filter(st_intersects(., st_buffer(site_sf, 100), sparse=FALSE)[,1]) %>%
ggplot()+
geom_sf(data = contours_sf)+
geom_sf(data = site_sf, color = 'red') +
geom_sf(color = 'pink')
如果您从分解行开始,可能效果会更好
library(raster)
f <- system.file("external/test.grd", package="raster")
r <- raster(f)
x <- rasterToContour(r)
x <- disaggregate(x)
你可以继续这样
y <- st_as_sf(x)
r <- rast(system.file("ex/meuse.tif", package="terra"))
site <- vect(xyFromCell(r, 5000), crs=crs(r))
elevation <- extract(r, site)
v <- disaggregate(as.contour(r, levels=elevation))
i <- which.min(distance(site, v))
vv <- v[i]
plot(r)
lines(v)
lines(vv, col="red", lwd=2)
points(site, col="blue", cex=2)
y谢谢@Robert,这两个选项都很有效
library(raster)
f <- system.file("external/test.grd", package="raster")
r <- raster(f)
x <- rasterToContour(r)
x <- disaggregate(x)
library(terra)
r <- rast(f)
x <- as.contour(r)
x
# class : SpatVector
# geometry : lines
# dimensions : 8, 1 (geometries, attributes)
x <- disaggregate(x)
x
# class : SpatVector
# geometry : lines
# dimensions : 56, 1 (geometries, attributes)
y <- st_as_sf(x)
r <- rast(system.file("ex/meuse.tif", package="terra"))
site <- vect(xyFromCell(r, 5000), crs=crs(r))
elevation <- extract(r, site)
v <- disaggregate(as.contour(r, levels=elevation))
i <- which.min(distance(site, v))
vv <- v[i]
plot(r)
lines(v)
lines(vv, col="red", lwd=2)
points(site, col="blue", cex=2)