R语言如何沿sf格式道路线shapefile生成随机经纬度点
沿线状Shapefile生成经纬度采样点实现方案
问题场景
- 核心需求:沿筛选得到的加拿大境内道路线状矢量,生成20个随机分布的经纬度采样点
- 数据处理流程:获取北美区域道路Shapefile数据集后,通过如下R代码筛选加拿大境内的开放高速公路子集:
library(raster) library(ggplot2) library(sf) library(sp) # 读取原始道路矢量 road <- read_sf(file.path(dir_ls$base,"roadshapefile","GRIP4_Region1_vector_shp","GRIP4_region1.shp")) # 筛选加拿大境内开放高速公路 road_canada <- road %>% dplyr::filter(GP_RTP %in% c(1,2), # 1对应高速公路 GP_REX == 1, # 1对应开放通行状态 GP_RRG == 1, # 1对应加拿大区域 GP_RCY == 124 # 对应加拿大国家编码 ) # 可视化验证筛选结果 ggplot(road_canada) + geom_sf()
- 报错说明:筛选得到的道路矢量可正常可视化,调用
spsample()执行随机采样时出现如下报错:
spsample(road_canada, n=20, type="random") Error in (function (classes, fdef, mtable) : unable to find an inherited method for function ‘spsample’ for signature ‘"sf"’
- 已知报错原因:
spsample()是sp生态的函数,仅支持Spatial系列格式对象,不兼容sf格式的矢量对象,需要适配实现方案。
可行实现方案
方案1:格式转换后兼容原有spsample逻辑
如果要保留原有spsample()的调用习惯,可先将sf对象转为sp体系支持的格式,采样完成后可按需转回sf格式方便后续处理:
# sf格式转sp格式 road_canada_sp <- as_Spatial(road_canada) # 执行随机采样 sample_points <- spsample(road_canada_sp, n=20, type="random") # (可选)采样结果转回sf格式 sample_points_sf <- st_as_sf(sample_points)
方案2:使用sf原生采样函数(推荐)
直接使用sf包自带的st_sample()函数,原生支持sf格式的线要素,无需跨格式转换,稳定性更高:
library(sf) # 沿线要素随机采样20个点 sample_points_sf <- st_sample(x = road_canada, size = 20, type = "random") # 转为标准sf对象并绑定坐标系 sample_points_sf <- st_sf(geometry = sample_points_sf, crs = st_crs(road_canada)) # 提取经纬度数值矩阵(确认坐标系为WGS84经纬度时使用) lon_lat_df <- as.data.frame(st_coordinates(sample_points_sf))
注意事项:采样前请确认道路矢量坐标系为WGS84经纬度坐标系(EPSG:4326),若原始数据为投影坐标系,需先通过
st_transform(road_canada, 4326)转换坐标系,否则采样得到的坐标为投影坐标,不是经纬度值。
内容的提问来源于stack exchange,提问作者89_Simple
相关产品推荐
相关产品推荐

