Как буфер вокруг точки не может быть кругом? (Или странное поведение rgeos :: gBuffer ()) - PullRequest
3 голосов
/ 23 октября 2019

Я переключился с пакета sp на sf для многих своих гео-вещей в R, и только сейчас я заметил странное поведение в 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)

Я получаю это:

enter image description here

Возможно, разрешение загруженного мной изображения не велико, но суть здесь в том, что есть красный круг, а некруглый (я пытался сосчитать стороны, кажется, 20-гоновый) синим цветом. Если вы конвертируете объект sf в sp, вы все равно получите круг, а если вы конвертируете объект sp в sf, вы все равно получите 20-гон (так что это не просто разница, скажем,, в методах построения графика).

Я ожидал gBuffer() вокруг точки, чтобы вернуть круг. Есть ли причина, по которой я не должен этого ожидать? Кто-нибудь может объяснить, что происходит?

1 Ответ

5 голосов
/ 23 октября 2019

Документация rgeos :: gBuffer включает в себя

четырехугольников [по умолчанию = 5] Количество отрезков линии, используемых для аппроксимации четверть круга.

Таким образом, 20-гон (= 4 * 5) - это именно то, что вы должны ожидать с настройками по умолчанию. Если вы хотите что-то ближе к кругу, увеличьте значение quadsegs.

Я предполагаю, что это сделано для вычислительной эффективности.

...