当我 运行 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)
我不确定为什么每当我 运行 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)