简化osm路网

一、简化osm路网(提取中心线)

1. 教程

简化osm路网-知乎

思路:

  • 通过缓冲区分析将细细的平行道路融合成一个道路面(融合:all)

  • 然后转换成栅格图(将整个地图文件进行导出为栅格文件,设置为单一阈值,重新导入到地图文件中,设置为分类显示)

  • 通过ArcScan工具再对道路面的中心线进行一个矢量化,最后得到我们想要的道路数据(先创建一个线要素,坐标系要一致)

(上面操作得到的结果是 中心线

 

2. 具体操作

1. 生成道路缓冲区

测量出来的道路的宽度,长的有30m的,融合字段选ALL 

上面的图有问题,注意设置线性单位的时候是20m,不是20(十进制度)

 

2. 导出为tif(并不是使用`要素转栅格`工具)

具体看 教程(https://zhuanlan.zhihu.com/p/384373379

 

3. 使用arcscan工具

另外一个教程

1. 创建一个线要素(‘’道路中心线”),坐标系记得选择和原来的一致 【要记得设置坐标系】

2. 栅格值分类显示

3. arcscan 将栅格转要素(将要素添加到我们新建的“道路中心线”要素中)

 

 

 

 

 

  • 最后简化出来的效果

  •  

4. 检查是否存在断线(拓扑检查)

image-20220521135605886

image-20220521135707293

上面是拓扑检查出现的错误点

下面就是修正差错

image-20220521140030201

我看了一下,里面的点虽然是悬挂点,但不是有问题的点,就是一条路的尽头。

 


二、简化-提取3级以上的路网

1. highway-国内道路等级匹配

image-20220521141334919

 

 

 

match_level = {
  'primary': '一级道路',
  'service':'服务性道路',
  'tertiary':'第三级道路',
  'residential':'居民区道路',
  'footway':'人行道',
  'motorway_link':'高速公路link',
  'unclassified':'未分级的',
  'secondary':'第二级道路',
  'trunk_link':'城市快速路link',
  'living_street':'生活街道',
  'motorway':'高速公路',
  'secondary_link':'二级link',
  'track':'小路',
  'road':'road',
  'trunk':'城市快速路',
  'path': '小道',
  'pedestrian':'步行街道',
  'primary_link': '一级道路link',
  'cycleway': '自行车道',
  'steps':'台阶踏步',
  'construction':'construction'
}

#将dict转换成df
level_df = pd.DataFrame(match_level.items(), columns=['highway', 'road_level'])

#根据映射进行合并
road_line_new = pd.merge(road_line,level_df,left_on = 'highway',right_on = 'highway')

2. 简化(提取三级以上的)

image-20220521150132374

some_values = ['primary','secondary','tertiary','trunk','motorway','tertiary_link','motorway_link','secondary_link','primary_link','motorway_link']
road_line_new[road_line_new['highway'].isin(some_values)]

根据上面的代码选取出三级以上的道路。

行数简化到了:473行

3. 重新导入到arcgis

** 不能像上面的操作,那样子是错误的,我们从arcgis中,将shp导出为csv(这样子是不会导出地理信息的, 我的做法是用geopandas)

1. geopandas直接读取shp文件(代码如下)

,读取出来的表格类型是GeoDataFrame,一样和处理dataframe一样

 %matplotlib  inline
import shapely, geopandas, fiona
import seaborn as sns
from fiona.crs import from_epsg,from_string

tpath = 'D:\\gis_ex10\\new_database\\经开_ln_Clip2.shp'
shp_df = geopandas.GeoDataFrame.from_file(tpath,encoding = 'gb18030')
shp_df.head()
shp_df.plot()

image-20220522162344288

2. 提取三级以上路网的结果如下:

some_values = ['primary','secondary','tertiary','trunk','motorway','tertiary_link','motorway_link','secondary_link','primary_link','motorway_link']
# road_line_new[shp_df['highway'].isin(some_values)].to_csv('./简化路网2.shp')
shp_df[shp_df['highway'].isin(some_values)]

3. 给不同的等级的道路匹配不同的速度

根据,这个根据不是太型,取值太小

image-20220522185907443

image-20220522190306861

《城市道路工程设计规范》,

还是按照规范来,取中间的那个值;

高德api里面设置的速度,城市道路是60,快速路是80

#根据不同的道路等级设置速度
# 主干道,以及主干道连接段——50
output.loc[(output['highway'].isin(['primary','primary_link'])),'speed'] = 50

# 次干道,40
output.loc[(output['highway'].isin(['secondary','secondary_link'])),'speed'] = 40

#三级道路,30
output.loc[(output['highway'].isin(['tertiary','tertiary_link'])),'speed'] = 30

#'trunk':'城市快速路', 80
output.loc[(output['highway'].isin(['trunk','trunk_link'])),'speed'] = 80

#motorway,高速,80
output.loc[(output['highway'].isin(['motorway','motorway_link'])),'speed'] = 80

output

4. 将geodataframe保存至文件

output = shp_df[shp_df['highway'].isin(some_values)]
output.to_file(r'D:\gis_ex10\new_database\osm\三级以上路网\路网_三级以上.shp')

5. 结果(导入arcgis的可视化结果)

image-20220522193822993

 

image-20220522162750246

 

6.拓扑检查

posted @ 2022-05-23 11:03  sheyueyu  阅读(4304)  评论(0编辑  收藏  举报