Сложность с gBuffer в R: результирующий буфер имеет неправильный размер - PullRequest
0 голосов
/ 22 апреля 2019

Общая цель этого кода - генерировать случайные точки в кольцевом буфере, основываясь на одной точке широты / долготы, которую я буду вводить по мере необходимости. Моя очевидная проблема заключается в том, что буфер, сгенерированный из gBuffer, имеет неправильный размер / местоположение, и, следовательно, точки находятся дальше, чем нужно от местоположения ввода.

Я пытаюсь создать 130-метровый буфер вокруг точки. Для создания своего кода я использовал 44.55555, -68.55555. Я использую десятичные градусы широта / долгота, так как это то, что мои данные.

Я пробовал несколько потоков stackoverflow, чтобы найти ответ, в том числе: Буферные (гео) пространственные точки в R с помощью gbuffer Создание буфера и подсчет точек в R

#Enter in the lat and Long
NestLat <- readline(prompt="Enter Nest Latitude:") #Use 44.55555 
NestLong <- readline(prompt="Enter Nest Longitude:") #Use -68.55555

#Coordinate from text to spatial points
NestLat <- as.numeric(NestLat)
NestLong <- as.numeric(NestLong)

nestcoords <- cbind(NestLat, NestLong)
nestcoords_sp <- SpatialPoints(nestcoords, proj4string=CRS("+proj=longlat +datum=WGS84"))
nestcoords_sp <- spTransform(nestcoords_sp, CRS("+init=epsg:2960"))

#Create buffer to generate 3 random points within 130m of nest
nestbuffer130 <- gBuffer(nestcoords_sp, width = 130)
nestbuffer130 <- spTransform(nestbuffer130, CRS("+proj=longlat +datum=WGS84"))

randoms130 <- spsample(nestbuffer130, 3, type = "random")
randoms130 <- spTransform(randoms130, CRS("+proj=longlat +datum=WGS84"))

nestbuffer130spdf <- as(nestbuffer130, "SpatialPolygonsDataFrame")
randoms130 <- as(randoms130, "SpatialPointsDataFrame")

Последний буфер выглядит как круг с радиусом 335 и не помещается в правильном месте пространственно.

1 Ответ

0 голосов
/ 22 апреля 2019

Как вы измеряете радиус? Код работает нормально, если вы просто хотите, чтобы точки выборки находились в нужном месте. Вот ваш код, слегка измененный с помощью функции gDistance, показывающий, что ваши точки находятся в буферной зоне. SF сейчас является предпочтительным пространственным пакетом для R, а синтаксис более понятен и прост. Я добавил, как будет выглядеть ваш код с пакетом SF.

library(rgeos)
library(sp)
#Enter in the lat and Long
NestLat <- 44.55555 
NestLong <- -68.55555

#Coordinate from text to spatial points
NestLat <- as.numeric(NestLat)
NestLong <- as.numeric(NestLong)

nestcoords <- cbind(NestLat, NestLong)
nestcoords_sp <- SpatialPoints(nestcoords, proj4string=CRS("+proj=longlat +datum=WGS84"))
nestcoords_sp <- spTransform(nestcoords_sp, CRS("+init=epsg:2960"))

#Create buffer to generate 3 random points within 130m of nest
nestbuffer130 <- gBuffer(nestcoords_sp, width = 130)
randoms130 <- spsample(nestbuffer130, 3, type = "random")
nestbuffer130spdf <- as(nestbuffer130, "SpatialPolygonsDataFrame")
randoms130 <- as(randoms130, "SpatialPointsDataFrame")

# measure distance
gDistance(randoms130, nestcoords_sp, byid = T)

SF

library(sf)
# turn coordinates into spatial poitns using sf
NestLat <- 44.55555 
NestLong <- -68.55555
nestPoints <- st_point(c(NestLong,NestLat)) %>%
  st_sfc(crs = 4326) %>% 
  st_transform(crs = 2960)
mapview(randoms130) + nestPoints

#Create buffer to generate 3 random points within 130m of nest
nestbuffer130 <- st_buffer(nestPoints, dist = 130)
randoms130 <- st_sample(nestbuffer130, 3)

# measure distance between points
st_distance(nestPoints,randoms130)
nestbuffer130SF <- st_sf(data = data.frame(ID = 1:length(randoms130)),
                         geometry = randoms130, crs = st_crs(randoms130)) %>% 
  st_transform(crs = 4326)

# check data visually
library(mapview)
mapview(nestbuffer130SF) + nestPoints
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...