J'ai passé un peu de temps à trouver la réponse à cette question. Ce n'est pas immédiatement évident à partir d'une recherche Google. Nous avons donc pensé qu'il serait utile de poster la réponse ici. Il y a aussi une question supplémentaire sur les polygones non contigus .
Réponse facile instantanée: utilisez la commande:
centroids <- getSpPPolygonsLabptSlots(polys)
(Cela a été trouvé dans la description de classe de la classe de données SpatialPolygonsDataFrame R pour le package spatial global dans R, sp )
Cela semble faire exactement la même chose que
cents <- SpatialPointsDataFrame(coords=cents, data=sids@data, proj4string=CRS("+proj=longlat +ellps=clrk66"))
dans le code suivant, qui devrait être réplicable sur toute installation de R (essayez-le!)
#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")
Où les cent (bleu) et les centroïdes (rouge) sont des centroïdes identiques (le tracé devrait apparaître après l'exécution du code):
Jusqu'ici tout va bien. Mais lorsque vous calculez des centroïdes de polygones dans QGIS (menu: Vecteur | Géométrie | Centroïdes polygonaux), les résultats obtenus pour les polygones non contigus sont légèrement différents:
Donc, cette question est 3-choses:
- Une réponse rapide et facile
- Avertissement pour les personnes utilisant R pour calculer les centroïdes de polygones non contigus
- Une question sur la manière de procéder en R pour prendre en compte correctement les polygones à plusieurs parties (non contigus)
Réponses:
Premièrement, je ne trouve pas de documentation indiquant cela
coordinates
ougetSpPPolygonsLabptSlots
renvoyant le centre de masse du centre de masse. En fait, cette dernière fonction apparaît désormais comme «Obsolète» et devrait émettre un avertissement.Ce que vous voulez pour calculer le centroïde en tant que centre de gravité d'une fonction est la
gCentroid
fonction durgeos
package. Fairehelp.search("centroid")
aura trouvé cela.devrait montrer la différence, et être le même que les centroïdes Qgis.
la source
Voici une approche utilisant SF. Comme je le démontre, les résultats de sf :: st_centroid et de rgeos :: gCentroid sont identiques.
la source
Ce que j’ai fait pour résoudre ce problème est de générer une fonction qui tamponne négativement le polygone jusqu’à ce qu’il soit suffisamment petit pour s’attendre à un polygone convexe. La fonction à utiliser est
centroid(polygon)
la source