【代码】从道路面矢量到中心线:端到端的道路中心线提取方法

在路线规划和高精度地图要素采集的过程中,获取道路的中心线是非常关键的步骤。这个过程本质上是将特殊的面矢量转化为线矢量。深度学习技术,特别是卷积神经网络(CNN),可以用于识别图像中的道路,生成一个道路的面矢量图,其中每个像素都被标记为“道路”或“非道路”。然后,我们需要将这个面矢量图转化为道路的中心线。这通常可以通过使用骨架化或细化技术来实现,这些技术可以将二维的面矢量细化为一维的线矢量,即道路的中心线。这样,我们就可以从深度学习生成的道路面矢量图中获取到道路的中心线,为路线规划和高精度地图要素采集提供重要信息。

本文主要讲解如何端对端获取道路中心线,不涉及深度学习道路识别。

输入是道路面矢量,输出是道路中心线矢量

image-20240422141434454

代码

# -*- coding: utf-8 -*- 
# @Time : 2024/4/21 20:48 
# @File : road_centerline.py 

# 获取代表道路轮廓(红线)的多边形中心线

import geopandas as gpd
import pygeoops

def generate_centerline(input_shapefile_path, output_shapefile_path, simplifytolerance=-0.4):
    # Load the polygon representing the road contour as a GeoDataFrame
    gdf = gpd.read_file(input_shapefile_path)

    # Calculate centerline of the polygons
    gdf.geometry = pygeoops.centerline(gdf.geometry, simplifytolerance=simplifytolerance)

    # Save centerlines in a new shapefile.
    gdf.to_file(output_shapefile_path)



if __name__ == '__main__':
    input_shapefile_path = r'D:\道路clip.shp'
    output_shapefile_path = r'D:\道路clip_centerline.shp'
    generate_centerline(input_shapefile_path, output_shapefile_path)

测试效果

获取道路中心线,本质上是特殊的面矢量转为线矢量的过程。

测试数据1

image-20240422141731687

测试数据2

image-20240422141922260

代码逻辑

这段Python代码的主要目的是从代表道路轮廓的多边形中生成道路的中心线。它使用了geopandaspygeoops两个库。下面是对这段代码的逐行解释:

  1. 首先,导入了geopandaspygeoops两个库。geopandas是一个开源项目,它使得在Python中处理地理空间数据变得更加容易。pygeoops是一个Python库,提供了一些地理空间操作的函数,例如计算几何对象的中心线。
  2. 定义了一个函数generate_centerline,这个函数接收三个参数:输入的shapefile文件路径、输出的shapefile文件路径和简化公差(simplifytolerance)。
  3. generate_centerline函数中,首先使用gpd.read_file函数从输入的shapefile文件中读取多边形数据,这些多边形代表了道路的轮廓。
  4. 然后,使用pygeoops.centerline函数计算每个多边形的中心线。simplifytolerance参数用于控制在计算中心线时的简化程度。负值表示允许一些小的偏离,这可以帮助处理一些复杂的多边形。
  5. 计算得到的中心线替换了原来的多边形数据,然后将结果保存到新的shapefile文件中。
  6. 在主函数中,定义了输入和输出的shapefile文件路径,然后调用generate_centerline函数生成道路的中心线。

总的来说,这段代码实现了从代表道路轮廓的多边形中生成道路的中心线的功能。