Я понял, что ваши точечные данные являются sf-объектами, поскольку у вас есть POINT (-82.34323174 29.67058748)
как символ. Поэтому я сначала восстановил ваши данные. Здесь я также назначил проекцию.
library(tidyverse)
library(sf)
library(RCurl)
url <- getURL("https://raw.githubusercontent.com/THsTestingGround/SO_readOGR_quest/master/311_Service_Requests__myGNV_.csv")
mydf <- read_csv(url) %>%
mutate(Location = gsub(x = Location, pattern = "POINT \\(|\\)", replacement = "")) %>%
separate(col = "Location", into = c("lon", "lat"), sep = " ") %>%
st_as_sf(coords = c(3,4)) %>%
st_set_crs(4326)
Я импортировал ваш шейп-файл, используя пакет sf
, поскольку ваши данные (mydf
в этой демонстрации) являются объектами sf. Когда я импортировал данные, я понял, что у меня есть LINESTRING
, а не полигоны. Я считаю, что это причина, почему over()
не сработало. Здесь я создал полигоны. В частности, я объединил все семь полигонов.
mypoly <- st_read("cgbound.shp") %>%
st_transform(crs = 4326) %>%
st_polygonize() %>%
st_union()
Давайте проверим, как ваши точки данных и полигон похожи. У вас наверняка есть точки данных, находящиеся вне полигона.
ggplot() +
geom_sf(data = mypoly) +
geom_point(data = mydf, aes(x = Longitude, y = Latitude))
Вы сказали: «Мне нужны некоторые точки, которые находятся вне полигона, чтобы быть NA. " Поэтому я решил создать новый столбец в mydf
, используя st_intersects()
. Если точка данных остается в многоугольнике, вы увидите ИСТИНА в новом столбце check
. В противном случае вы увидите FALSE.
mutate(mydf,
check = as.vector(st_intersects(x = mydf, y = mypoly, sparse = FALSE))) -> result
Наконец, проверьте, как проверяются точки данных.
ggplot() +
geom_sf(data = mypoly) +
geom_point(data = result, aes(x = Longitude, y = Latitude, color = check))
Если вы Если вы хотите использовать over()
, смешивая с этим способом sf, вы можете сделать следующее.
mutate(mydf,
check = over(as(mydf, "Spatial"), as(mypoly, "Spatial")))
Последнее, что вы хотите сделать, это подмножество данных
filter(result, check == TRUE)
THE ПРОСТОЙ ПУТЬ
Я продемонстрировал вам, как все работает с этим подходом SF. Но следующее на самом деле все, что вам нужно. st_filter()
извлекает точки данных, оставаясь в mypoly
. В этом случае точки данных, оставшиеся снаружи, удаляются. Если вам не нужно создавать NA для этих точек, это намного проще.
st_filter(x = mydf, y = mypoly, predicate = st_intersects) -> result2
ggplot() +
geom_sf(data = mypoly) +
geom_sf(data = result2)