Как рассчитать центроид многоугольника с помощью sf :: st_centroid?

Я пытаюсь манипулировать некоторыми данными бразильской переписи населения в R с помощью нового пакета «sf». Я могу импортировать данные, но получаю сообщение об ошибке при попытке создать центроиды исходных многоугольников.

library(sf)

#Donwload data  
filepath <- 'ftp://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_de_setores_censitarios__divisoes_intramunicipais/censo_2010/setores_censitarios_shp/ac/ac_setores_censitarios.zip'
download.file(filepath,'ac_setores_censitarios.zip')
unzip('ac_setores_censitarios.zip')
d <- st_read('12SEE250GC_SIR.shp',stringsAsFactors = F) 

Теперь я пытаюсь создать новый столбец геометрии, содержащий центроид столбца «геометрия», но получаю сообщение об ошибке:

d$centroid <- st_centroid(d$geometry)
Warning message:
In st_centroid.sfc(d$geometry) :
  st_centroid does not give correct centroids for longitude/latitude data

Как я могу это решить?


person LucasMation    schedule 12.09.2017    source источник
comment
Это не ошибка, это предупреждение. Ценности созданы.   -  person Sven Hohenstein    schedule 12.09.2017


Ответы (1)


Все функции GEOS, лежащие в основе sf, для правильной работы нуждаются в проецируемых координатах, поэтому вы должны запускать st_centroid на правильно спроецированных данных. Я мало что знаю о доступных CRS в Бразилии, но EPSG: 29101, похоже, работает нормально:

library(tidyverse)

d$centroids <- st_transform(d, 29101) %>% 
  st_centroid() %>% 
  # this is the crs from d, which has no EPSG code:
  st_transform(., '+proj=longlat +ellps=GRS80 +no_defs') %>%
  # since you want the centroids in a second geometry col:
  st_geometry()

# check with
plot(st_geometry(d))
plot(d[, 'centroids'], add = T, col = 'red', pch = 19)
person obrl_soil    schedule 04.10.2017
comment
Второй вызов plot () дает мне отображение столбцов списка, которые не поддерживаются. Мне также не удалось получить центроиды в столбце, не уверен, что ответ устарел (они часто меняют пакет sf). - person CoderGuy123; 30.09.2019
comment
Привет @Deleet, похоже, что сейчас нужно активировать столбец вторичной геометрии, прежде чем строить график, например. plot(st_set_geometry(d, 'centroids')[, 0], add = T, col = 'red', pch = 19). Я использую sf 0.8-0 в среде Windows. - person obrl_soil; 30.09.2019