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

如何修改R代码使不在Shapefile区域及坐标错误的点返回NA

修改R代码以返回NA给无效/非服务区点

我来帮你调整这段代码,让不在纽约出租车服务区的点,以及坐标明显错误的点都返回NA。咱们先看修改后的完整代码,再拆解关键改动:

library(sf)

# 读取出租车服务区数据
tt <- read_sf('taxi_zones.shp')

# 创建测试点数据框
pnts <- data.frame(
  "x" = c(-73.97817, -74.00668, 0, 500),
  "y" = c(40.75798, 40.73178, 0, 400)
)

# 1. 简化点的sf对象创建(替代原有的do.call写法)
pnts_sf <- st_as_sf(pnts, coords = c("x", "y"), crs = 4326)

# 2. 提前标记明显无效的坐标(纽约大致经纬度范围:-74.3~-73.7 经度,40.5~40.9 纬度)
# 超出这个范围的点直接标记为无效
valid_coords <- with(pnts, x > -74.3 & x < -73.7 & y > 40.5 & y < 40.9)

# 3. 坐标转换(保持原有的投影转换逻辑)
pnts_trans <- st_transform(pnts_sf, 2163)
tt_trans <- st_transform(tt, 2163)

# 4. 处理相交结果,返回NA给无效/无交集的点
zones <- sapply(seq_len(nrow(pnts_trans)), function(i) {
  # 如果坐标无效,直接返回NA
  if (!valid_coords[i]) {
    return(NA)
  }
  # 检查当前点是否与服务区相交
  intersect_idx <- st_intersects(tt_trans, pnts_trans[i, ], sparse = FALSE)[,1]
  # 无交集则返回NA,否则返回对应的LocationID
  if (sum(intersect_idx) == 0) {
    NA
  } else {
    tt_trans$LocationID[intersect_idx]
  }
})

# 查看结果
zones

关键改动说明:

  • 简化点对象创建:用st_as_sf直接将data.frame转为sf点对象,比原有的do.call + lapply写法更简洁易读,也减少出错概率。
  • 提前过滤无效坐标:通过判断经纬度是否在纽约合理范围内,直接标记明显错误的坐标(比如0,0或500,400这类完全偏离的点)为无效,后续直接返回NA。
  • 逐点处理相交逻辑:用sapply逐点处理,代替原有的apply,逻辑更清晰。对于每个点:
    1. 先检查坐标是否有效,无效则返回NA;
    2. 再计算该点与服务区的交集,无交集则返回NA,否则返回对应的LocationID。
  • 避免空值返回:原代码中无交集的点会返回空向量,修改后统一返回NA,符合你的需求。

运行这段代码后,你会得到结果:[1] 161 79 NA NA,正好对应前两个有效点的服务区ID,后两个点返回NA。

内容的提问来源于stack exchange,提问作者Allen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:08:14