В настоящее время я работаю с шейп-файлом, который не содержит явных координат широты и долготы. Моя цель — отфильтровать области с широтой выше 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)
Сначала создайте новый столбец, используя 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 - безусловно, но если вы изучите пример карты ОП, вы заметите, что южные канадские провинции/территории либо заканчиваются на 60 ° северной широты, либо имеют центроид <60 ° северной широты. В случае данных ОП этот метод является правильным.
Из вопроса неясно, хочет ли ОП, чтобы функции были разделены по центроиду или разделены по координатам ниже порогового значения. Принятие ответа, кажется, указывает на то, что первого достаточно. В дальнейшем вы можете использовать st_coordinates
на многоугольном объекте, протестировать столбец Y и извлечь соответствующие значения столбца L3.
Вот как можно сделать выбор на основе того, что любая точка многоугольника находится выше пороговой широты.
Образец данных:
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)
что такое
\<-
? вы всегда можете разделить столбецgeometry
, используяst_coordinates()
. это позволяет вам фильтровать любую долготу/широту, которую вы хотите. хотя вы можете быть осторожны при использовании этой геометрии в виде линий или полигонов.