Вернуть центроид точек, используя st_centroid

Мне нужен центроид группы точек. Я ожидал, что 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)
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
88
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, проблема в том, что он предполагает, что каждая пара координат представляет собой другую геометрию, и пытается найти центр тяжести каждой точки, которая является именно этой точкой. Что, если вы обработаете весь набор точек как единую многоточечную геометрию:

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

Любой вариант без подмножества с помощью квадратных скобок? Мои реальные данные не содержат long и lat, только столбец geometry

luciano 31.03.2023 17:41

Являются ли геометрии вашей реальной точкой данных, полигоном, мультиточкой или чем-то еще? Если геометрия представляет собой отдельные точки, и вы хотите превратить несколько строк в многоточечные геометрии, вы можете использовать st_coordinates(), чтобы получить точки, а затем sf_multipoint() преобразовать эти координаты в многоточечные геометрии.

DaveArmstrong 31.03.2023 20:02
Ответ принят как подходящий

Вы после 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)

Другие вопросы по теме