一个点周围的缓冲区怎么可能不是一个圆? (或者, rgeos::gBuffer() 的奇怪行为)

How can a buffer around a point not be a circle? (Or, strange behavior of rgeos::gBuffer() )

对于 R 中的许多地理事物,我已经从包 sp 切换到 sf,直到现在我才注意到 sp 中的一个奇怪行为/rgeos。这是:

library(sp)
library(sf)
library(rgeos)

# crs
WGS84M = "+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs"

# a point
point = data.frame(x = 0, y = 0)

# simple feature from point
f.point = st_as_sf(point, coords = c('x', 'y'))
st_crs(f.point) = WGS84M
f.buf = st_geometry(st_buffer(f.point, dist = 5 * 1000))

# spatial object from point
s.point = SpatialPoints(point, proj4string = CRS(WGS84M))
s.buf = gBuffer(s.point, width = 5 * 1000)

plot(s.buf, border = "blue")
plot(f.buf, border = "red", add = T)

我明白了:

可能是我上传的图片分辨率不太好,重点是:有一个红色的圆圈,一个不是圆圈(我数了一下边,好像是20边形的) 穿蓝色衣服。如果你将 sf 对象转换为 sp 你仍然得到一个圆,如果你将 sp 对象转换为 sf,你仍然得到一个 20 边形(所以它不仅仅是绘图方法上的差异)。

我预计 gBuffer() 围绕一个点 return 一个圆。有什么我不应该期待的理由吗?任何人都可以解释发生了什么事吗?

罚款rgeos::gBuffer documentation包括

quadsegs [default=5] Number of line segments to use to approximate a quarter circle.

因此 20 边形 (=4*5) 正是您在默认设置下所期望的。如果您想要更接近圆形的东西,请增加 quadsegs.

的值

我假设这样做是为了提高计算效率。