Фильтрация полигонов по координатам

В настоящее время я работаю с шейп-файлом, который не содержит явных координат широты и долготы. Моя цель — отфильтровать области с широтой выше 60 градусов. Я хочу удалить небольшую область в правом нижнем углу, но у меня нет широты и долготы. Может ли кто-нибудь предложить код для достижения этой цели?

Шейп-файл выглядит следующим образом:

Это мой текущий код:

shapefile_path <- "/Users/langbai/Desktop/lcsd000b16a_e/lcsd000b16a_e.shp"

shapefile_data <- st_read(shapefile_path)

convex_hulls_inset <- convex_hulls_with_farms %>%
  filter(lat < 60)

shapefile_inset <- shapefile_data %>%
  filter(st_coordinates(st_centroid(geometry))[, 2] < 80)

что такое \<-? вы всегда можете разделить столбец geometry, используя st_coordinates(). это позволяет вам фильтровать любую долготу/широту, которую вы хотите. хотя вы можете быть осторожны при использовании этой геометрии в виде линий или полигонов.

D.J 05.06.2024 08:49
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
80
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Сначала создайте новый столбец, используя mutate(), затем filter() этот столбец. Вот пример использования встроенного набора данных NC:

library(sf)
library(dplyr)
library(ggplot2)

# Example data
nc <- st_read(system.file("shape/nc.shp", package = "sf"))

shapefile_inset <- nc %>%
  mutate(y = st_coordinates(st_centroid(geometry))[, 2]) %>%
  filter(y < 35) %>%
  select(-y)

ggplot() + 
  geom_sf(data = nc) +
  geom_sf(data = shapefile_inset, fill = "#DF536B")

хотя и элегантно, я не уверен, что st_centroid() — это правильное решение. посмотрите на многоугольник справа от 80°W, который не был окрашен в красный цвет, в то время как все соседи были окрашены в красный цвет.

D.J 05.06.2024 08:58

Большое спасибо за ваш код! Наконец-то я получил нужную мне карту. Это мне очень помогло!

Amy Xiejing 05.06.2024 09:25

@D.J - безусловно, но если вы изучите пример карты ОП, вы заметите, что южные канадские провинции/территории либо заканчиваются на 60 ° северной широты, либо имеют центроид <60 ° северной широты. В случае данных ОП этот метод является правильным.

L Tyrone 06.06.2024 05:01

Из вопроса неясно, хочет ли ОП, чтобы функции были разделены по центроиду или разделены по координатам ниже порогового значения. Принятие ответа, кажется, указывает на то, что первого достаточно. В дальнейшем вы можете использовать st_coordinates на многоугольном объекте, протестировать столбец Y и извлечь соответствующие значения столбца L3.

Spacedman 08.06.2024 08:37

Вот как можно сделать выбор на основе того, что любая точка многоугольника находится выше пороговой широты.

Образец данных:

library(sf)
nc <- st_read(system.file("shape/nc.shp", package = "sf"))

Получите полную матрицу компонентов X, Y и L1, L2, L3:

xy = st_coordinates(nc)

Теперь выберите строки этой матрицы, где столбец Y находится выше порога:

thresh=35
above = xy[ xy[,"Y"] > thresh, ]

Тогда уникальными значениями L3 будут строки, находящиеся на пороге или выше него:

row.above = unique(above[,"L3"])

И мы можем построить их линией на пороге:

plot(nc$geometry)
plot(nc$geometry[row.above], col = "red", add=TRUE)
plot(nc$geometry[-row.above], col = "blue", add=TRUE)
abline(h=thresh, lwd=3)

Вы можете настроить логику в зависимости от того, хотите ли вы, чтобы функции были полностью выше или полностью ниже порогового значения:

below = xy [ xy[,"Y"] < thresh, ]
row.below = unique(below[,"L3"])
plot(nc$geometry)
plot(nc$geometry[row.below], col = "blue", add=TRUE)
plot(nc$geometry[-row.below], col = "red", add=TRUE)
abline(h=thresh, lwd=3)

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