在R中筛选美国西海岸各州指定英里范围内的经纬度点(禁用管道符)
筛选美国西海岸指定范围内经纬度点并打标签(无管道符实现)
核心思路
不用管道符的前提下,通过sf包的空间处理功能完成三个核心操作:
- 将CSV里的经纬度转成空间点对象
- 获取西海岸三州的边界并生成指定距离的缓冲区
- 匹配点与缓冲区,给点打上对应州的标签
具体实现步骤
1. 加载依赖包
先加载需要的工具包,sf负责空间数据处理,tigris用来获取官方州边界数据(也可以用maps包替代,数据精度稍低):
# 安装未安装的包(首次运行时执行) # install.packages(c("sf", "tigris", "dplyr")) library(sf) library(tigris) library(dplyr)
2. 读取并转换自有数据
把你的太平洋数据CSV转成sf空间点对象,注意指定坐标系为WGS84(全球通用的经纬度坐标系,EPSG代码4326):
# 读取CSV数据(替换成你的文件路径) pacific_data <- read.csv("太平洋数据.csv") # 将经纬度列转成sf点对象 pacific_sf <- st_as_sf(pacific_data, coords = c("经度列名", "纬度列名"), crs = 4326)
注意:把代码里的
经度列名和纬度列名替换成你CSV里实际的列名。
3. 获取西海岸州边界并生成缓冲区
先获取华盛顿、俄勒冈、加州的边界数据,再转换到适合计算英里距离的投影(比如UTM 10N,EPSG:26910,覆盖西海岸大部分区域),最后生成指定距离的缓冲区:
# 获取美国州边界数据,过滤出目标三州 west_coast_states <- states(cb = TRUE) west_coast_states <- filter(west_coast_states, NAME %in% c("Washington", "Oregon", "California")) # 转换投影到UTM 10N(单位为米,方便计算英里) west_coast_utm <- st_transform(west_coast_states, crs = 26910) # 生成缓冲区:100英里≈160934米,可根据需求修改数值 # 这里给俄勒冈设100英里,华盛顿和加州可自行调整 oregon_buffer <- st_buffer(filter(west_coast_utm, NAME == "Oregon"), dist = 160934) washington_buffer <- st_buffer(filter(west_coast_utm, NAME == "Washington"), dist = 160934) # 示例100英里 california_buffer <- st_buffer(filter(west_coast_utm, NAME == "California"), dist = 160934) # 示例100英里
4. 匹配点与缓冲区并打标签
先把点数据转成和缓冲区一致的投影,然后逐个判断点是否在对应缓冲区内,添加标签列:
# 将点数据转成UTM投影,和缓冲区保持一致 pacific_utm <- st_transform(pacific_sf, crs = 26910) # 初始化标签列 pacific_utm$state_label <- NA # 判断每个点是否在俄勒冈缓冲区内,打标签 oregon_points <- st_within(pacific_utm, oregon_buffer, sparse = FALSE) pacific_utm$state_label[oregon_points] <- "Oregon" # 判断华盛顿缓冲区(优先已打标签的点不覆盖,可根据需求调整) washington_points <- st_within(pacific_utm, washington_buffer, sparse = FALSE) pacific_utm$state_label[washington_points & is.na(pacific_utm$state_label)] <- "Washington" # 判断加州缓冲区 california_points <- st_within(pacific_utm, california_buffer, sparse = FALSE) pacific_utm$state_label[california_points & is.na(pacific_utm$state_label)] <- "California" # 可选:转回到WGS84坐标系,方便后续导出 result_data <- st_transform(pacific_utm, crs = 4326) # 导出结果到CSV(替换成你想要的路径) write.csv(st_drop_geometry(result_data), "西海岸筛选结果.csv", row.names = FALSE)
关键注意事项
- 投影选择:如果你的数据覆盖西海岸全部区域,UTM 10N(EPSG:26910)是合适的;如果范围更大,可以用Albers等面积投影(EPSG:5070),确保距离计算准确。
- 重叠区域处理:代码里默认优先给俄勒冈打标签,再处理华盛顿和加州,如果需要标记重叠区域(比如点同时在两个州缓冲区内),可以修改逻辑,比如用
paste合并标签。 - 数据精度:
tigris包的cb=TRUE参数返回简化后的边界,速度更快;如果需要高精度边界,去掉该参数即可。
内容的提问来源于stack exchange,提问作者Ashley Smith
相关产品推荐
相关产品推荐

