检查点坐标是否在多边形内
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)
我是空间数据的新手,需要一些帮助。我有一组 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)