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

时间:2021-02-26 07:34:27

标签: r sf

我是空间数据的新手,需要一些帮助。我有一组 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 套餐。

1 个答案:

答案 0 :(得分:2)

您描述的问题类别称为多边形中的点。

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

需要记住的两点:

  • CRS 系统必须保持一致(您选择哪个系统很少有关系;这将采取极端的极端情况 - 但它必须保持一致;为此使用 st_transform
  • 根据您点对象的类别(sfc 与 sf),您可能需要先调用 st_as_sf()

考虑以下几点:

pip <- points %>%
  st_join(heat_df)