Passei um tempo tentando descobrir a resposta para essa pergunta. Não é imediatamente óbvio em uma pesquisa no Google , então achei útil postar a resposta aqui. Há também uma pergunta adicional sobre polígonos não contíguos .
Resposta fácil instantânea: use o comando:
centroids <- getSpPPolygonsLabptSlots(polys)
(Isso foi encontrado na descrição da classe da classe de dados SpatialPolygonsDataFrame R para o pacote espacial abrangente em R, sp )
Isso parece fazer exatamente a mesma coisa que
cents <- SpatialPointsDataFrame(coords=cents, data=sids@data, proj4string=CRS("+proj=longlat +ellps=clrk66"))
no código a seguir, que deve ser replicável em qualquer instalação do R (tente!)
#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")
Onde centavos (azul) e centróides (vermelho) são centróides idênticos (o gráfico deve aparecer após a execução do código):
Por enquanto, tudo bem. Mas quando você calcula os centróides de polígono no QGIS (menu: Vetor | Geometria | Centroides de polígonos), há resultados ligeiramente diferentes para polígonos não contíguos:
Portanto, esta pergunta é composta por três coisas:
- Uma resposta rápida e fácil
- Um aviso para pessoas que usam R para calcular centróides para polígonos não contíguos
- Uma pergunta sobre como deve ser feito no R para considerar adequadamente os polígonos de várias partes (não contíguas)
Respostas:
Em primeiro lugar, não consigo encontrar nenhuma documentação que diga isso
coordinates
ougetSpPPolygonsLabptSlots
retorne o centróide do centro de massa. De fato, a última função agora aparece como 'Descontinuada' e deve emitir um aviso.O que você deseja para calcular o centróide como o centro de massa de um recurso é a
gCentroid
função dorgeos
pacote. Fazendohelp.search("centroid")
terá encontrado isso.deve mostrar a diferença e ser o mesmo que os centróides Qgis.
fonte
aqui está uma abordagem usando sf. Como demonstro, os resultados de sf :: st_centroid e rgeos :: gCentroid são os mesmos.
fonte
O que fiz para superar esse problema é gerar uma função que armazena em buffer negativamente o polígono até que seja pequeno o suficiente para esperar um polígono convexo. A função a ser usada é
centroid(polygon)
fonte