1

试图让 st_buffer 函数在 mapview 中显示缓冲区。让它工作,但我必须先执行转换(我怀疑这是必要的)。寻找一种更直接的方法来做到这一点。

编辑:澄清......我想在点周围绘制的缓冲区(在这种情况下,多边形)将是点周围的距离(例如,公里)。

library(sf)
library(mapview)

data("breweries")

test_coords <- st_geometry(breweries[1:2,])

# This code doesn't work. Not sure why.
# buff_test_coords <- st_buffer(test_coords, dist = 10000)
# mapview(test_coords) + mapview(buff_test_coords)

# This code words. Not sure what's special about transforming to 3488
sf_test_coords <- test_coords %>% st_transform(3488)
sf_buff_test_coords <- st_buffer(sf_test_coords, 10000)
sf_buff_test_coords2 <- st_transform(sf_buff_test_coords, 4326)
mapview(test_coords) + mapview(sf_buff_test_coords2)
4

1 回答 1

1

好吧,警告很清楚,缓冲不适用于非投影数据。

#> Warning in st_buffer.sfc(test_coords, dist = 2): st_buffer does not correctly
#> buffer longitude/latitude data
#> dist is assumed to be in decimal degrees (arc_degrees).

您的数据显示proj4string: "+proj=longlat +datum=WGS84 +no_defs",因此您要么对其进行投影,要么更改方法。最重要的是,您尝试将 lonlat(-180,180 度)投影 10000,即 10000 度。所以这是一个无意义的缓冲区,缓冲在投影的相同单元上工作。

您在这里有两种无需投影的方法:

  • 缓冲 2 度,它可以工作,但缓冲区很奇怪。
  • 另一种选择是绘制两次相同的点,但不将其传递给POLYGON,这就是缓冲区的作用。只需用更大的cex.
library(sf)
#> Warning: package 'sf' was built under R version 3.5.3
#> Linking to GEOS 3.6.1, GDAL 2.2.3, PROJ 4.9.3
library(mapview)
#> Warning: package 'mapview' was built under R version 3.5.3

data("breweries")

test_coords <- st_geometry(breweries[1:2,])
st_crs(test_coords)
#> Coordinate Reference System:
#>   EPSG: 4326 
#>   proj4string: "+proj=longlat +datum=WGS84 +no_defs"
buff_test_coords <- st_buffer(test_coords, dist = 2)
#> Warning in st_buffer.sfc(test_coords, dist = 2): st_buffer does not correctly
#> buffer longitude/latitude data
#> dist is assumed to be in decimal degrees (arc_degrees).

#Buffering non-projected coords
mapview(test_coords) + mapview(buff_test_coords)


#Plotting the same points with a bigger cex
mapview(test_coords) + mapview(test_coords, cex=100, col.regions ="red")

reprex 包(v0.3.0)于 2020 年 3 月 28 日创建

于 2020-03-28T09:43:43.897 回答