我是空间数据的新手,需要一些帮助。我有一组 100 万个点,想确定哪些点位于 5 个多边形之一内。一旦确定,我想删除该点的整行。
多边形位于 kml 文件中,点位于 csv 文件中。读完数据后,我做了以下事情:
library(sf)
library(dplyr)
#create sf of lat long
heat_df$point <- heat_df[,5:6] %>%
as.data.frame %>%
st_as_sf(coords = c(1,2)) %>%
st_set_crs(4326)
#make planar
heat_df$point <- st_transform(heat_df$point, 2163)
kml$geometry <- st_transform(kml$geometry, 2163)
#itterate through the following 5 times (once per polygon)
heat_df$inter <- st_intersects(heat_df$point, kml$geometry[1], sparse = FALSE)
heat_df <- heat_df[!(heat_df$inter == TRUE),]
然而,我无法在这些多边形中找到任何点,即使我知道这些多边形中有点。我检查了数据框并注意到坐标的格式明显不同:
> print(heat_df$point[1])
[[1]]
[1] 6407800 9211903
attr(,"class")
[1] "XY" "POINT" "sfg"
> print(kml$geometry[1])
[[1]]
[[1]]
[,1] [,2] [,3]
[1,] 4520903 5043254 0
[2,] 4520945 5043244 0
[3,] 4521016 5043207 0
[4,] 4521029 5043312 0
[5,] 4521027 5043325 0
[6,] 4521016 5043341 0
[7,] 4520962 5043405 0
[8,] 4520926 5043388 0
[9,] 4520903 5043254 0
attr(,"class")
[1] "XYZ" "POLYGON" "sfg"
至少 heat_df$point[1]
中的坐标与 kml$geometry[1]
中的坐标非常不同。所有点和所有多边形都位于彼此 1km 之内。所以我不期望像 [1] 6407800 9211903
这样的点坐标和像 [1,] 4520903 5043254 0
这样的多边形坐标。但也许我错了。我以前没有处理过空间数据。你能帮我弄清楚出了什么问题吗?如果可能,我想坚持使用 sf
套餐。
答案 0 :(得分:2)
您描述的问题类别称为多边形中的点。
您可以通过 sf::st_join()
处理它 - 它会将多边形列添加到您的点数据集中。它默认使用左连接 = 保留左手对象的行。因此,最好从您的点对象开始,并在空间对齐时添加多边形的特征(如果不对齐,则添加 NA)。
需要记住的两点:
st_transform
)st_as_sf()
考虑以下几点:
pip <- points %>%
st_join(heat_df)