Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 光栅:光栅;等高线不是连续的_R_Raster_Sf_R Raster - Fatal编程技术网

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

我正在尝试使用R中的
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缓冲区宽度)

有人对以下几点有想法:

  • 解释等高线“断裂”的原因
  • 提供将碎片“连接”在一起的有效方法
  • 如果这实际上是394行而不是15行的来源,则为
    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)