Я потратил немного времени, чтобы выяснить ответ на этот вопрос. Это не сразу очевидно из поиска в Google , поэтому я подумал, что может быть полезно опубликовать ответ здесь. Существует также дополнительный вопрос о несмежных многоугольниках .
Мгновенный легкий ответ: используйте команду:
centroids <- getSpPPolygonsLabptSlots(polys)
(Это было найдено в описании класса класса данных SpatialPolygonsDataFrame R для всеобъемлющего пространственного пакета в R, sp )
Это похоже на то же самое, что и
cents <- SpatialPointsDataFrame(coords=cents, data=sids@data, proj4string=CRS("+proj=longlat +ellps=clrk66"))
в следующем коде, который должен быть реплицируемым на любой установке R (попробуйте!)
#Rcentroids
install.packages("GISTools")
library(GISTools)
sids <- readShapePoly(system.file("shapes/sids.shp", package="maptools")[1],
proj4string=CRS("+proj=longlat +ellps=clrk66"))
class(sids)
plot(sids)
writeSpatialShape(sids, "sids")
cents <- coordinates(sids)
cents <- SpatialPointsDataFrame(coords=cents, data=sids@data,
proj4string=CRS("+proj=longlat +ellps=clrk66"))
points(cents, col = "Blue")
writeSpatialShape(cents, "cents")
centroids <- getSpPPolygonsLabptSlots(sids)
points(centroids, pch = 3, col = "Red")
Где центы (синие) и центроиды (красные) являются идентичными центроидами (этот график должен появиться после запуска кода):
Все идет нормально. Но когда вы вычисляете центроиды многоугольников в QGIS (меню: Вектор | Геометрия | Центроиды многоугольников), результаты для несмежных многоугольников немного отличаются:
Итак, этот вопрос состоит из трех вещей:
- Быстрый и простой ответ
- Предупреждение для людей, использующих R для вычисления центроидов для несмежных полигонов
- Вопрос о том, как это должно быть сделано в R для правильного учета многочастных (несмежных) полигонов
Ответы:
Во-первых, я не могу найти документацию, которая говорит, что
coordinates
илиgetSpPPolygonsLabptSlots
возвращает центра масс центроид. Фактически последняя функция теперь отображается как «Устаревшая» и должна выдавать предупреждение.То, что вы хотите для вычисления центроида как центра масс функции - это
gCentroid
функция изrgeos
пакета. Делатьhelp.search("centroid")
найдет это.должен показать разницу, и быть таким же, как центроиды Qgis.
источник
Вот подход с использованием SF. Как я демонстрирую, результаты от sf :: st_centroid и rgeos :: gCentroid совпадают.
источник
Чтобы решить эту проблему, я создал функцию, которая отрицательно буферизует многоугольник, пока он не станет достаточно маленьким, чтобы ожидать выпуклый многоугольник. Функция для использования
centroid(polygon)
источник