Мне нужно создать буферную зону по набору data points с координатами x и y (серые точки на графике). К сожалению, у меня нет границы периметра точек, из которых создается буфер. Я пытался вычислить периметр с помощью функции chull
, однако он не работает должным образом (оранжевая область). Я могу рассчитать граничные точки, используя max
/min
функции для данных на некоторый шаг (скажем, 10 м, красные точки) и попытаться вычислить буфер из этих точек. Кто-нибудь знает более правильный и чистый способ вычисления буферной зоны для множества точек.R Буфер по периметру точек данных
1
A
ответ
0
благодарит за ваши предложения и комментарии. Действительно, это была моя ошибка, когда я отказался от пакета alphahull
.
После определения границы с помощью ashape
Я создаю буферный многоугольник и идентифицирую данные, которые находятся внутри и вне буфера. Задача состояла в том, чтобы правильно извлечь многоугольник от ashap
, но решение RPubs безопасно меня. Вы можете увидеть также графический пример here.
Лучшие
## load
library(ggplot2); library(alphahull);
library(igraph); library(rgeos)
## Load the data
data.df<-read.csv("Data/Cencus/Lyford_meta.csv",sep=",",header=TRUE)
#Remove the duplicates in the data to do the chull calculation
data <- data.df[!duplicated(paste(data.df$xsite, data.df$ysite, sep ="_")), c("xsite","ysite") ]
#calculate the chull with alpha 20
data.chull <- ashape(data, alpha = 20)
## Below is the code to extract polygon from the ashape chull function
## credit to: http://rpubs.com/geospacedman/alphasimple
order.chull <- graph.edgelist(cbind(as.character(data.chull$edges[, "ind1"]), as.character(data.chull$edges[,"ind2"])), directed = FALSE)
cutg <- order.chull - E(order.chull)[1]
ends <- names(which(degree(cutg) == 1))
path <- get.shortest.paths(cutg, ends[1], ends[2])[[1]]
pathX <- as.numeric(V(order.chull)[unlist(path[[1]])]$name)
pathX = c(pathX, pathX[1])
data.chull <- as.data.frame(data.chull$x[pathX, ])
## Create a spatial object from the polygon and apply a buffer to
## Then extract the data to the dataframe.
data.chull.poly <- SpatialPolygons(list(Polygons(list(Polygon(as.matrix(data.chull))),"s1")))
data.chull.poly.buff <- gBuffer(data.chull.poly, width = -10)
data.buffer <- fortify(data.chull.poly.buff)[c("long","lat")]
## Identidfy the data that are inside the buffer polygon
data$posit <- "Outside"
data$posit[point.in.polygon(data$x,data$y,data.buffer$long,data.buffer$lat) %in% c(1,2,3)] <- "Inside"
## Plot the results
ggplot()+
theme_bw()+xlab("X coordinates (m)")+ylab("Y coordinates (m)") +
geom_point(data = data, aes(xsite, ysite, color = posit))+
geom_polygon(data = data.chull, aes(V1, V2), color = "black", alpha = 0)+
geom_polygon(data = data.buffer, aes(long, lat), color = "blue", alpha = 0)
1
Вы могли бы сделать тесселяцию вокруг точек. Точки на границе будут иметь гораздо большие полигоны.
library(deldir)
library(ggplot2)
triang <- deldir(data$x, data$y)
border <- triang$summary
border$Selected <- border$dir.area > 260
ggplot(border[order(border$Selected), ], aes(x = x, y = y, colour = Selected)) + geom_point()
Смежные вопросы
- 1. Алгоритм поиска интервала уникальных точек по периметру елки
- 2. ¨R kmeans точек данных
- 3. DBIx :: Поиск по периметру класса
- 4. раскраска точек данных в R
- 5. R - график точек данных неразличимы
- 6. Измерения по периметру Meshlab файла STL
- 7. Треугольник с точками по периметру круга, python
- 8. Можно ли выровнять точки по периметру пути?
- 9. AngularJS: пройти по периметру до $ location.path
- 10. Добавление точек данных в столбце по коэффициентам в R
- 11. R конвертирование 13 точек данных в месяц
- 12. r xyplot «шаги» с центрами точек данных
- 13. Подсчет точек данных в пределах, и применяя буфер изолированных точек [анализ данных]
- 14. Распространение точек перекрытия по кругу - R
- 15. Как найти ближайшую точку по периметру прямоугольника до заданной точки?
- 16. Упрощение 3D точек. R
- 17. Добавление точек данных на графике в r
- 18. R стрелка маркировки точек данных на графике
- 19. изменить цвет некоторых точек данных в r
- 20. Эффективное построение миллионов точек данных в R
- 21. Выбор случайных точек данных в R
- 22. Подсчет точек в R
- 23. Создание точек участка в R
- 24. Вставить буфер данных по нажатию кнопки
- 25. Проход по периметру Гримлина через разные направления краев
- 26. пространственное распределение точек, R
- 27. Идентификация точек данных между фоновым шумом для биндовых данных R
- 28. Максимальный размер точек в R?
- 29. R-графические числа вместо точек
- 30. Как ударить по периметру в extjs при нажатии кнопки
Является ли красная линия результат, что вы ищете? – Thierry
Я хотел бы получить все точки, попадающие в многоугольник, обозначенный красной линией. – Vova
'chull' работает нормально. Вы просто не хотите, чтобы ваш корпус был «выпуклым». –