检查点坐标是否在多边形内

Check whether point coordinate lies within polygon

我是空间数据的新手,需要一些帮助。我有一组 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]中的坐标大不相同。所有点和所有多边形都位于彼此 1 公里以内。所以我不希望像 [1] 6407800 9211903 这样的点坐标和像 [1,] 4520903 5043254 0 这样的多边形坐标。但也许我错了。我以前没有使用过空间数据。你能帮我找出问题所在吗?如果可能的话,我想坚持使用 sf 包。

您描述的class个问题在多边形中称为点。

您可以通过 sf::st_join() 处理它 - 它会将多边形列添加到您的点数据集中。它默认使用左连接 = 保留左侧对象的行。因此,最好从您的点对象开始,并在空间对齐时添加多边形的特征(不对齐时添加 NA)。

请记住两点:

  • CRS 系统必须保持一致(您选择哪个系统很少有关系;它会出现极端情况 - 但它必须保持一致;为此使用 st_transform
  • 根据您的积分对象(sfc 与 sf)的 class,您可能需要先调用 st_as_sf()

沿着这些思路考虑一些事情:

pip <- points %>%
  st_join(heat_df)