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

点周围的缓冲区怎么可能不是圆?(或者,rgeos::gBuffer()的奇怪行为),r,sp,sf,R,Sp,Sf,我在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 p

我在
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()
围绕一个点返回一个圆。有什么理由我不应该期望那样吗?有人能解释发生了什么事吗

罚款包括

quadsegs[default=5]用于近似四分之一圆的线段数

因此,20个角(=4*5)正是默认设置所期望的。如果想要更接近圆的东西,请增加
quadsegs
的值


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

重要的一点是,红色形状也不是一个圆-它是120阿贡,因为
?st_buffer
具有
nqadsegs=30
。如果你想在R中画一个完美的柏拉图圆,你需要把它表示成一个有中心和半径的物体。@djas
c1=list(半径=4.3,中心=c(2.2,5.12))
或类似的东西。我不知道是否有一个R包来处理显式精确的几何对象。去检查一下起重机。