Pasé un rato averiguando la respuesta a esta pregunta. No es inmediatamente obvio en una búsqueda en Google , por lo que pensé que podría ser útil publicar la respuesta aquí. También hay una pregunta adicional sobre polígonos no contiguos .
Respuesta fácil instantánea: use el comando:
centroids <- getSpPPolygonsLabptSlots(polys)
(Esto se encontró en la descripción de la clase de la clase de datos SpatialPolygonsDataFrame R para el paquete espacial global en R, sp )
Esto parece hacer exactamente lo mismo que
cents <- SpatialPointsDataFrame(coords=cents, data=sids@data, proj4string=CRS("+proj=longlat +ellps=clrk66"))
en el siguiente código, que debería ser replicable en cualquier instalación de R (¡pruébelo!)
#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")
Donde los centavos (azul) y los centroides (rojo) son centroides idénticos (este gráfico debería aparecer después de ejecutar el código):
Hasta aquí todo bien. Pero cuando calcula los centroides de polígonos en QGIS (menú: Vector | Geometría | Centroides de polígonos), hay resultados ligeramente diferentes para los polígonos no contiguos:
Entonces esta pregunta es de 3 cosas:
- Una respuesta rápida y fácil.
- Una advertencia para las personas que usan R para calcular los centroides para polígonos no contiguos
- Una pregunta sobre cómo se debe hacer en R para tener en cuenta adecuadamente los polígonos de varias partes (no contiguas)
Respuestas:
En primer lugar, no puedo encontrar ninguna documentación que diga eso
coordinates
ogetSpPPolygonsLabptSlots
devuelva el centroide de centro de masa. De hecho, la última función ahora aparece como 'Desaprobada' y debería emitir una advertencia.Lo que desea para calcular el centroide como el centro de masa de una característica es la
gCentroid
función delrgeos
paquete. Hacerlohelp.search("centroid")
habrá encontrado esto.debería mostrar la diferencia y ser igual a los centroides de Qgis.
fuente
Aquí hay un enfoque usando SF. Como demuestro, los resultados de sf :: st_centroid y rgeos :: gCentroid son los mismos.
fuente
Lo que hice para superar este problema es generar una función que amortigua negativamente el polígono hasta que sea lo suficientemente pequeño como para esperar un polígono convexo. La función a usar es
centroid(polygon)
fuente