web-dev-qa-db-ja.com

sf :: st_centroidを使用してポリゴンの重心を計算する方法は?

新しい「sf」パッケージを使用して、Rのブラジル国勢調査データを操作しようとしています。データをインポートできますが、元のポリゴンの図心を作成しようとするとエラーが発生します

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) 

ここで、列「geometry」の図心を含む新しいジオメトリ列を作成しようとしましたが、エラーが発生します。

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

どうすればこれを解決できますか?

8
LucasMation

sfの基礎となるすべてのGEOS関数は、正しく機能するために投影座標を必要とするため、適切に投影されたデータに対して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)
8
obrl_soil