如何在ArcGIS、QGIS或R中删除或合并平行铁路线?
铁路Shapefile平行轨道处理方案(保留单条/合并为一条)
ArcGIS解决方案
保留单条轨道、删除另一条
- 若轨道有区分属性(如
track_side字段标记左/右轨):- 打开「选择图层 by 属性」工具,输入筛选表达式(例:
"track_side" = 'left'),选中目标轨道 - 右键图层→「数据」→「导出数据」,将选中要素保存为新Shapefile即可
- 打开「选择图层 by 属性」工具,输入筛选表达式(例:
- 若无区分属性:
- 运行「近邻分析」工具,设置搜索距离为轨道实际间距(如5米),生成含
NEAR_FID字段的结果图层 - 打开属性表,按
FID排序后,筛选FID < NEAR_FID的记录(避免重复选择成对轨道),选中后导出或删除未选中要素
- 运行「近邻分析」工具,设置搜索距离为轨道实际间距(如5米),生成含
合并两条平行轨道为一条(生成中心线)
- 方法1(需ArcGIS Advanced许可):
- 选中成对的平行轨道,运行「创建中心线」工具,设置偏移容差匹配轨道间距,直接生成中心线要素
- 方法2(通用版):
- 对轨道图层运行「缓冲区」工具,设置半径为轨道间距的一半(如轨道间距4米则设2米),生成面要素
- 对缓冲面运行「要素转线」工具,得到近似中心线,再用「简化线」工具优化线条平滑度
QGIS解决方案
保留单条轨道、删除另一条
- 若轨道有区分属性:
- 打开图层属性表,使用「筛选」功能输入表达式(例:
"track_side" = 'right'),选中目标轨道 - 右键图层→「导出」→「导出选中要素」,保存为新文件
- 打开图层属性表,使用「筛选」功能输入表达式(例:
- 若无区分属性:
- 打开「处理工具箱」→「矢量分析」→「近邻查询」工具,生成含相邻要素FID的字段(如
near_fid) - 打开属性表,用字段计算器生成临时字段:
is_keep = if("fid" < "near_fid", 1, 0),筛选is_keep=1的记录后导出或删除其他要素
- 打开「处理工具箱」→「矢量分析」→「近邻查询」工具,生成含相邻要素FID的字段(如
合并两条平行轨道为一条(生成中心线)
- 方法1:
- 选中成对平行轨道,打开「处理工具箱」→「矢量几何」→「创建中心线」工具,设置容差为轨道间距,生成中心线
- 方法2:
- 运行「缓冲区」工具,半径设为轨道间距一半,生成面要素
- 运行「多边形转线」工具得到中心线,再用「简化几何」工具调整线条平滑度
R语言解决方案(基于sf包)
保留单条轨道、删除另一条
- 有属性区分的情况:
library(sf) # 读取Shapefile数据 rail <- st_read("railway.shp") # 筛选保留右轨(假设存在track_side字段) rail_single <- rail[rail$track_side == "right", ] # 保存结果 st_write(rail_single, "railway_single.shp") - 无属性区分的情况:
library(sf) # 读取数据 rail <- st_read("railway.shp") # 计算每条线的最近邻要素ID nn_ids <- st_nearest_feature(rail) # 标记保留的要素(仅保留FID小于对应最近邻FID的线,避免重复) keep_flag <- seq_len(nrow(rail)) < nn_ids rail_single <- rail[keep_flag, ] # 保存结果 st_write(rail_single, "railway_single.shp")
合并两条平行轨道为一条(生成中心线)
library(sf) library(dplyr) # 读取数据 rail <- st_read("railway.shp") # 为成对轨道分配组ID(通过近邻关系分组) rail <- rail %>% mutate(nn_id = st_nearest_feature(.), group_id = pmin(seq_len(nrow(.)), nn_id)) # 按组生成中心线 rail_center <- rail %>% group_by(group_id) %>% summarise(geometry = st_union(geometry) %>% st_centroid() %>% st_cast("LINESTRING")) # 保存结果 st_write(rail_center, "railway_center.shp")
内容的提问来源于stack exchange,提问作者Freeego
相关产品推荐
相关产品推荐

