如何在R中判断经纬度点是否位于sp::Polygon类多边形内
判断点是否属于sp::Polygon多边形并返回ID的实现方法
要实现判断经纬度点是否在目标多边形内并返回多边形ID,需要借助sp包的空间对象转换与匹配功能,步骤如下:
核心步骤说明
- 将Polygons转换为SpatialPolygons:
sp::over函数仅支持Spatial系列对象,因此需要先把你创建的Polygons对象升级为SpatialPolygons,同时指定坐标系(经纬度数据一般用WGS84,即EPSG:4326)。 - 测试点转换为SpatialPoints:把数据框中的经纬度转换成空间点对象,确保坐标系与多边形一致。
- 空间匹配并提取ID:用
sp::over函数完成点与多边形的匹配,提取对应ID,再合并回原数据框。
完整代码实现
library(sp) library(tibble) # 1. 创建多边形并转换为SpatialPolygons(带坐标系) UKJ32_poly <- sp::Polygon(cbind(c(-1.477037449999955, -1.366895449999959, -1.365159449999965, -1.477037449999955), c(50.923958250000027, 50.94686525000003, 50.880069750000018, 50.923958250000027))) %>% list() %>% sp::Polygons(ID="UKJ32 - Southampton") %>% sp::SpatialPolygons() proj4string(UKJ32_poly) <- CRS("+init=epsg:4326") # 设置WGS84坐标系 # 2. 准备测试数据 test_df <- tibble(lon = c(-1.4, 10), lat = c(50.9, 10)) # 3. 转换测试点为SpatialPoints test_points <- SpatialPoints(test_df, proj4string = CRS("+init=epsg:4326")) # 4. 匹配点与多边形,获取ID match_result <- over(test_points, UKJ32_poly) # 5. 合并结果到原数据框(可按需处理NA值) result_df <- test_df %>% mutate(polyg_ID = ifelse(is.na(match_result$ID), NA, match_result$ID)) # 若需要强制给不在多边形内的点返回指定ID(如你示例中的情况),替换为: # result_df <- test_df %>% # mutate(polyg_ID = ifelse(is.na(match_result$ID), "UKJ32", match_result$ID)) print(result_df)
结果说明
- 运行上述代码后,第一个点
(-1.4, 50.9)会匹配到多边形IDUKJ32 - Southampton;第二个点(10,10)不在多边形范围内,默认返回NA。 - 如果需要和你给出的示例结果一致(即使点不在多边形内也返回
UKJ32),使用注释中的ifelse替换逻辑即可。
内容的提问来源于stack exchange,提问作者Ivo
相关产品推荐
相关产品推荐

