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

为何sf::st_join未为Dryden测雪站点返回对应行政区面要素?

解决Dryden测雪站无法匹配行政区的问题

以下是几种针对性的排查和解决方法:

1. 修复多边形的无效几何

行政区多边形可能存在拓扑错误(比如自相交),导致空间判断失效,先检查并修复:

# 检查行政区几何有效性
districts_old %>% 
  mutate(is_valid = st_is_valid(geometry)) %>% 
  filter(!is_valid)

# 修复所有无效几何
districts_fixed <- districts_old %>% 
  st_make_valid()

# 用修复后的图层重新做连接
check_fixed <- st_join(
  snowlocs %>% select(STATION_NUMBER),
  districts_fixed %>% select(DISTRICT_NAME)
)
check_fixed

2. 彻底切换到平面坐标系运算

有时候仅设置sf_use_s2(FALSE)可能不生效,建议在加载数据前就关闭S2,再重新转换投影:

# 先关闭S2几何运算
sf_use_s2(FALSE)

# 重新加载并转换两个图层
snowlocs_flat <- arc.select(arc.open("https://ws.lioservices.lrc.gov.on.ca/arcgis2/rest/services/LIO_OPEN_DATA/LIO_Open08/MapServer/31")) %>% 
  arc.data2sf() %>% 
  st_transform(3162) %>% 
  filter(STATION_NUMBER %in% c("SNOW-WLF-MK", "SNOW-WLF-DY", "SNOW-WLF-PK")) %>%
  group_by(STATION_NUMBER) %>% 
  slice(1)

districts_old_flat <- arc.select(arc.open("https://services1.arcgis.com/TJH5KDher0W13Kgo/arcgis/rest/services/MNR_Administrative_Boundaries/FeatureServer/1")) %>% 
  arc.data2sf() %>% 
  st_transform(3162) %>% 
  filter(DISTRICT_NAME %in% c("Kenora", "Dryden", "Sioux Lookout"))

# 重新执行连接
check_flat <- st_join(
  snowlocs_flat %>% select(STATION_NUMBER),
  districts_old_flat %>% select(DISTRICT_NAME)
)
check_flat

3. 指定更精确的空间判断规则

st_join默认用st_intersects,可以换成更严格的st_within或者st_contains_properly,避免边界点的判断误差:

# 使用st_within作为连接规则
check_within <- st_join(
  snowlocs %>% select(STATION_NUMBER),
  districts_old %>% select(DISTRICT_NAME),
  join = st_within
)

# 或者用st_contains(从多边形角度判断包含点)
check_contains <- st_join(
  snowlocs %>% select(STATION_NUMBER),
  districts_old %>% select(DISTRICT_NAME),
  join = function(x, y) st_contains(y, x)
)

4. 手动验证单个点与多边形的关系

先单独提取Dryden行政区和SNOW-WLF-DY站点,直接测试空间关系,确认是否真的存在包含关系:

# 提取Dryden多边形和目标站点
dryden_poly <- districts_old %>% filter(DISTRICT_NAME == "Dryden")
dy_point <- snowlocs %>% filter(STATION_NUMBER == "SNOW-WLF-DY")

# 测试是否在多边形内
st_within(dy_point, dryden_poly)
# 测试多边形是否包含点
st_contains(dryden_poly, dy_point)

如果返回TRUE说明几何本身没问题,只是连接时的参数或环境设置问题;如果返回FALSE,可能是坐标转换时出现偏差,需要检查投影参数是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 02:35:57