简化osm路网
1. 教程
思路:
-
通过缓冲区分析将细细的平行道路融合成一个道路面(融合:all)
-
然后转换成栅格图(将整个地图文件进行导出为栅格文件,设置为单一阈值,重新导入到地图文件中,设置为分类显示)
-
通过ArcScan工具再对道路面的中心线进行一个矢量化,最后得到我们想要的道路数据(先创建一个线要素,坐标系要一致)
(上面操作得到的结果是 中心线)
-
osm路段数据中,highway列值对应的是什么?
-
-
-
关于osm道路的语义信息的去看”智能车未来挑战“比赛评分标准
-
-
2. 具体操作
1. 生成道路缓冲区
测量出来的道路的宽度,长的有30m的,融合字段选ALL
上面的图有问题,注意设置线性单位的时候是20m,不是20(十进制度)
2. 导出为tif(并不是使用`要素转栅格`工具)
具体看 教程(https://zhuanlan.zhihu.com/p/384373379)
3. 使用arcscan工具
-
最后简化出来的效果
-
4. 检查是否存在断线(拓扑检查)
上面是拓扑检查出现的错误点
下面就是修正差错
我看了一下,里面的点虽然是悬挂点,但不是有问题的点,就是一条路的尽头。
二、简化-提取3级以上的路网
1. highway-国内道路等级匹配
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. 简化(提取三级以上的)
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()
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. 给不同的等级的道路匹配不同的速度
《城市道路工程设计规范》,
还是按照规范来,取中间的那个值;
高德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的可视化结果)