最终push
齐瑞臻 authored
06712ec6

road_geo_regularization

通用的城市主要道路路网简化,可用于非高精度的地块划分等

运行环境:

  • Arcgis Pro
  • Python 3.x from Arcgis Pro
  • Arcpy from Arcgis Pro
  • Encoding utf-8_sig
  • tqdm

所需数据:

  • OSM 路网数据
  • QQ 路网数据
  • 目标城市行政边界数据
  • 数据需要事先按照 config.py 路径放置,注意命名格式

说明书:

  1. 先在 config/config.py 里手动指定目录 !!!!!!请仔细阅读 config 内的备注说明
    • 配置项:
      • ./config/config.py 需手动指定:
        • GDB 文件路径(不存在会自动创建),所有步骤成功执行会自动清空 GDB
        • 路网数据根目录(注意路网数据命名规则)
        • boundary 数据根目录(注意命名规则)
        • 简化后道路输出文件夹(OUTPUT_PATH)(.shp 文件)
      • 道路类别:
        • 目前道路类型选择主要以划分地块为目的,地块内部路网全部抛除,后续定制化精细路网处理时添加新类即可
        • 当 MODE 为 mixed 时,不去区分高架桥、普通道路,全部类型同时简化,道路类型在 config 中配置:
          • OSM_MAIN_FCLASS['motorway', 'trunk', 'primary', 'secondary', 'tertiary']
          • QQ_MAIN_SUBTYPE: ['131184', '131491', '131489']
        • 当 MODE 为 divided 时,会区分高架桥、普通道路,OSM,QQ 的道路需要分一次高架处理与一次普通道路处理,道路类型在 config 中配置:
          • OSM_MAIN_FCLASS_NO_HIGHWAY:['primary', 'secondary', 'tertiary']
          • OSM_MAIN_FCLASS_HIGHWAY = ['motorway', 'trunk']
          • QQ_MAIN_SUBTYPE_NO_HIGHWAY = ['131184', '131491', '131489']
          • QQ_MAIN_SUBTYPE_HIGHWAY = ['131332']
  2. 执行 main.py(执行时需要释放对应 GDB 的占用)
    • main.py 启动函数 start_process 主要参数:
      • CITY: 城市名,注意命名需要与路网后缀相同(详见注释)
      • MODE:简化方式,必须为'mixed'或'divided'其中一种
      • smooth_level: 简化程度,值越高结果越平滑(失真)
      • extend_distance: 断头路延伸的距离,值越高,闭合的路网越多,(但会在不存在道路的地方伸出一条道路)
      • spike_keep: 清理毛细断头道路的阈值,道路长度低于这个 threshold 的都会被清除掉,值越高,道路越规整,但会使一些现实是断头路的道路消失

整体处理思路:

  1. preprocess:
    • 路网裁剪
    • select by attribute
  2. 多转单:
    • Merge qq & osm
    • Buffer & Dissolve
    • Extract Center lines
  3. 路网除杂:
    • 拓扑检查(找出断头道路、验证连通性)
    • 去除断头的琐碎道路
    • centerline 根据与 raw_road 的近似程度,重新 sjoin 要素属性

一个隐藏参数:

在 simplify.py 的 clean_spike 函数中有一个 keep_spike 参数被隐藏起来了,不太常用。

丸姐可能会在作图时需要用到断头路数据,若需要可手动将 keep_spike 改为 True.

断头点、断头线数据将会输出到结果路径中,分别命名'err_points.shp'及'err_lines.shp'

注意每次测试失败后需要手动删除 gdb

执行前请注意是否已有 gdb,并且释放相关文件的占用