You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中判断经纬度点是否位于sp::Polygon类多边形内

判断点是否属于sp::Polygon多边形并返回ID的实现方法

要实现判断经纬度点是否在目标多边形内并返回多边形ID,需要借助sp包的空间对象转换与匹配功能,步骤如下:

核心步骤说明

  1. 将Polygons转换为SpatialPolygons:sp::over函数仅支持Spatial系列对象,因此需要先把你创建的Polygons对象升级为SpatialPolygons,同时指定坐标系(经纬度数据一般用WGS84,即EPSG:4326)。
  2. 测试点转换为SpatialPoints:把数据框中的经纬度转换成空间点对象,确保坐标系与多边形一致。
  3. 空间匹配并提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 04:45:36