求助:无经纬度字段的Shapefile按纬度筛选多边形的代码实现
解决Shapefile筛选高纬度区域的可行代码
首先,你的核心问题是当前Shapefile的坐标系大概率不是经纬度格式(EPSG:4326),导致直接用坐标值设置的筛选阈值不符合需求。以下是完整的实现步骤和代码:
核心思路
先确认Shapefile的原始坐标系,将其转换为通用的WGS84经纬度坐标系,这样就能直接用纬度值(y轴)作为筛选依据,精准移除纬度高于60度的区域。
完整代码
# 加载依赖包 library(sf) library(dplyr) # 定义Shapefile路径 shapefile_path <- "/Users/langbai/Desktop/lcsd000b16a_e/lcsd000b16a_e.shp" # 读取Shapefile并查看当前坐标系 shapefile_data <- st_read(shapefile_path) print(st_crs(shapefile_data)) # 输出结果可确认原始投影类型,比如UTM投影 # 转换为WGS84经纬度坐标系(EPSG:4326) shapefile_wgs84 <- st_transform(shapefile_data, crs = 4326) # 方式1:通过要素质心纬度筛选(快速筛选,适合多数场景) shapefile_filtered <- shapefile_wgs84 %>% mutate(centroid_lat = st_coordinates(st_centroid(geometry))[, 2]) %>% filter(centroid_lat < 60) # 方式2:通过要素边界纬度筛选(更严谨,确保整个要素都低于60度纬度) # shapefile_filtered <- shapefile_wgs84 %>% # mutate( # max_lat = st_bbox(geometry)[["ymax"]] # ) %>% # filter(max_lat < 60) # 可视化验证筛选结果 plot(st_geometry(shapefile_filtered), main = "筛选后区域")
关键说明
- 坐标系转换:这是解决问题的核心,只有转换为经纬度坐标系,才能用60度这个地理阈值进行筛选
- 两种筛选逻辑:
- 质心筛选:只要要素的几何中心纬度低于60度就保留,操作简单高效
- 边界筛选:确保要素的所有部分纬度都低于60度,适合对精度要求更高的场景
- 原代码中
convex_hulls_with_farms为未定义对象,已移除该无效逻辑
内容的提问来源于stack exchange,提问作者Amy Xiejing
相关产品推荐
相关产品推荐

