Мне нужен центроид группы точек. Я ожидал, что st_centroid
вернет центр тяжести, но, похоже, он просто возвращает исходный набор точек. Кажется, что решение этой проблемы должно быть легко найдено, но не может найти ответ в хорошей охоте на переполнение стека.
Как я могу заставить st_centroid
возвращать центроид - следовательно, одну точку в центре группы точек.
library(dplyr)
library(sf)
df <- read.table(header=TRUE, text= "site lat long
site1 41.21 -115.11
site2 45.3 -112.31
site3 41.15 -115.15
site4 41.12 -115.19")
df_sf <- st_as_sf(df, coords = c('long', 'lat'))
st_centroid(df_sf)
Я думаю, проблема в том, что он предполагает, что каждая пара координат представляет собой другую геометрию, и пытается найти центр тяжести каждой точки, которая является именно этой точкой. Что, если вы обработаете весь набор точек как единую многоточечную геометрию:
library(dplyr)
library(sf)
library(sfheaders)
df <- read.table(header=TRUE, text= "site lat long
site1 41.21 -115.11
site2 45.3 -112.31
site3 41.15 -115.15
site4 41.12 -115.19")
sf_multipoint(df[,c("long", "lat")]) %>%
st_centroid()
#> Simple feature collection with 1 feature and 1 field
#> Geometry type: POINT
#> Dimension: XY
#> Bounding box: xmin: -114.44 ymin: 42.195 xmax: -114.44 ymax: 42.195
#> CRS: NA
#> id geometry
#> 1 1 POINT (-114.44 42.195)
Чтобы просто вернуть значения координат центроида, вы можете сделать следующее:
sf_multipoint(df[,c("long", "lat")]) %>%
st_centroid() %>%
st_coordinates()
#> X Y
#> 1 -114.44 42.195
Created on 2023-03-31 with reprex v2.0.2
Являются ли геометрии вашей реальной точкой данных, полигоном, мультиточкой или чем-то еще? Если геометрия представляет собой отдельные точки, и вы хотите превратить несколько строк в многоточечные геометрии, вы можете использовать st_coordinates()
, чтобы получить точки, а затем sf_multipoint()
преобразовать эти координаты в многоточечные геометрии.
Вы после 1 центроида всего вашего набора данных?
Если это так, рассмотрите возможность объединения всех ваших точек в одну функцию с помощью вызова sf::st_combine()
перед вычислением центроида.
Потому что пример больше, чем слова:
library(dplyr)
library(sf)
df <- read.table(header=TRUE, text= "site lat long
site1 41.21 -115.11
site2 45.3 -112.31
site3 41.15 -115.15
site4 41.12 -115.19")
df_sf <- st_as_sf(df, coords = c('long', 'lat'))
st_centroid(df_sf) # your original code; not quite what we want...
# Simple feature collection with 4 features and 1 field
# Geometry type: POINT
# Dimension: XY
# Bounding box: xmin: -115.19 ymin: 41.12 xmax: -112.31 ymax: 45.3
# CRS: NA
# site geometry
# 1 site1 POINT (-115.11 41.21)
# 2 site2 POINT (-112.31 45.3)
# 3 site3 POINT (-115.15 41.15)
# 4 site4 POINT (-115.19 41.12)
df_mod <- df_sf %>%
st_combine()
st_centroid(df_mod) # would this fit your expectations better?
# Geometry set for 1 feature
# Geometry type: POINT
# Dimension: XY
# Bounding box: xmin: -114.44 ymin: 42.195 xmax: -114.44 ymax: 42.195
# CRS: NA
# POINT (-114.44 42.195)
Любой вариант без подмножества с помощью квадратных скобок? Мои реальные данные не содержат
long
иlat
, только столбецgeometry