Trochę czasu zastanawiałem się nad odpowiedzią na to pytanie. Nie jest to od razu oczywiste z wyszukiwarki Google , więc pomyślałem, że warto opublikować odpowiedź tutaj. Istnieje również dodatkowe pytanie dotyczące niesąsiadujących wielokątów .
Natychmiastowa łatwa odpowiedź: użyj polecenia:
centroids <- getSpPPolygonsLabptSlots(polys)
(Stwierdzono to w opisie klasy klasy danych SpatialPolygonsDataFrame R dla nadrzędnego pakietu przestrzennego w R, sp )
Wydaje się, że robi to dokładnie to samo, co
cents <- SpatialPointsDataFrame(coords=cents, data=sids@data, proj4string=CRS("+proj=longlat +ellps=clrk66"))
w poniższym kodzie, który powinien być replikowany w dowolnej instalacji R (wypróbuj!)
#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")
Gdzie centy (niebieskie) i centroidy (czerwone) są identycznymi centroidami (powinno to pojawić się po uruchomieniu kodu):
Na razie w porządku. Ale gdy obliczasz centroidy wielokątów w QGIS (menu: Wektor | Geometria | Centroidy wielokątów), wyniki dla wielokątów niesąsiadujących są nieco inne:
Pytanie to składa się z 3 rzeczy:
- Szybka i łatwa odpowiedź
- Ostrzeżenie dla osób używających R do obliczania centroidów dla niesąsiadujących wielokątów
- Pytanie o to, jak należy to zrobić w R, aby poprawnie uwzględnić wieloczęściowe (niesąsiadujące) wielokąty
Odpowiedzi:
Po pierwsze, nie mogę znaleźć żadnej dokumentacji, która by to mówiła
coordinates
lubgetSpPPolygonsLabptSlots
zwraca środek ciężkości środka masy. W rzeczywistości ta ostatnia funkcja jest teraz wyświetlana jako „Przestarzała” i powinna wydać ostrzeżenie.To, co chcesz obliczyć centroid jako środek masy obiektu, to
gCentroid
funkcja zrgeos
pakietu. Robiąchelp.search("centroid")
to znajdzie.powinien pokazywać różnicę i być taki sam jak centroidy Qgis.
źródło
oto podejście wykorzystujące sf. Jak wykazałem, wyniki sf :: st_centroid i rgeos :: gCentroid są takie same.
źródło
To, co zrobiłem, aby rozwiązać ten problem, to wygenerowanie funkcji, która negatywnie buforuje wielokąt, dopóki nie będzie wystarczająco mały, aby oczekiwać wypukłego wielokąta. Funkcja do użycia to
centroid(polygon)
źródło