Продолжайте получать NA, когда я запускаю функцию Over () для точек (широта, долгота) на полигонах шейп-файлов - PullRequest
1 голос
/ 08 марта 2020

Я не уверен, почему я продолжаю получать NA, когда запускаю функцию Over с точкой широты и долготы на многоугольнике из шейп-файла. Пожалуйста, обратите внимание, что я впервые делаю пространственный анализ, но я провел исследование и воспроизвел все, но не смог. Мне нужно, чтобы некоторые точки за пределами многоугольника были NA, поэтому я могу сосредоточиться на реальных данных.

Я читаю эти источники, поскольку они относятся к моей причине, но я не могу решить мою проблему:
sp :: over () для точки в анализе многоугольника
https://gis.stackexchange.com/questions/133625/checking-if-points-fall-within-polygon-shapefile
https://gis.stackexchange.com/questions/278723/r-error-in-checking-point-inside-polygon

Здесь мой код кусок *

Буду признателен, если кто-нибудь сможет мне помочь.

1 Ответ

2 голосов
/ 08 марта 2020

Я понял, что ваши точечные данные являются 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))

enter image description here

Вы сказали: «Мне нужны некоторые точки, которые находятся вне полигона, чтобы быть 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))

enter image description here

Если вы Если вы хотите использовать 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)

enter image description here

...