当我 运行 Over() 在 shapefile 多边形上的点(纬度,经度)上运行时,继续获取 NA

Keep getting NAs when I run Over() function on Points(Lat,Lon) on shapefile polygons

我不确定为什么每当我 运行 Over 函数在 shapefile 的多边形上使用纬度和经度点时,我总是得到 NA。请注意,这是我第一次进行空间分析,但我已经完成了研究并复制了一些东西,但没有成功。我需要多边形之外的一些点为 NA,这样我就可以专注于实际数据。

我阅读了这些资源,因为它们与我的事业有关,但我无法解决我的问题:
sp::over() for point in polygon analysis
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

这是我的代码块

library(sp)
library(rgdal)
library(readr)

gainsville_df <- read_csv("311_Service_Requests__myGNV_.csv")
gnv <- readOGR("~\Downloads\GIS_cgbound", layer = "cgbound")

gnv_latlon <- spTransform(gnv, CRS("+proj=longlat +ellps=WGS84 +datum=WGS84"))

gnv_raw <- data.frame(Longitude= gainsville_df$Longitude, Latitude= gainsville_df$Latitude)

coordinates(gnv_raw) <- ~Longitude + Latitude
proj4string(gnv_raw) <- proj4string(gnv)
over(gnv_raw, as(gnv,"SpatialLinesDataFrame"))

#Yeilds:
#  FID_cgboun Id Perimeter Area Acres Hectares Shape_Leng
#1         NA NA        NA   NA    NA       NA         NA

# Desired Output:
# Whereas I should have seen which gainesville Latitudes and Longitude are within the shpaefile
# polygon so I can drop the outliers, that have the NA. According to this, none of my LatLon points 
# are inside the polygon.

数据文件在这里:
形状文件:https://github.com/THsTestingGround/SO_readOGR_quest/tree/master/GIS_cgbound
读取 csv 文件:https://github.com/THsTestingGround/SO_readOGR_quest/blob/master/311_Service_Requests__myGNV_.csv

如果有人能帮助我,我将不胜感激。

我意识到你的点数据是一个 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 包导入了你的 shapefile,因为你的数据(本演示中的 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))

你说,"I need some points which are outside of the polygon to be NA." 所以我决定使用 st_intersects()mydf 中创建一个新列。如果数据点保留在多边形中,您会在新列 check 中看到 TRUE。否则,您会看到 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)

最简单的方法

我向您展示了使用这种 sf 方法是如何工作的。但以下实际上是您所需要的。 st_filter() 提取停留在 mypoly 中的数据点。在这种情况下,留在外面的数据点将被删除。如果您不必为这些点创建 NA,这就容易多了。

st_filter(x = mydf, y = mypoly, predicate = st_intersects) -> result2

ggplot() +
geom_sf(data = mypoly) +
geom_sf(data = result2)