【代码】从道路面矢量到中心线:端到端的道路中心线提取方法
【代码】从道路面矢量到中心线:端到端的道路中心线提取方法
ytkz在路线规划和高精度地图要素采集的过程中,获取道路的中心线是非常关键的步骤。这个过程本质上是将特殊的面矢量转化为线矢量。深度学习技术,特别是卷积神经网络(CNN),可以用于识别图像中的道路,生成一个道路的面矢量图,其中每个像素都被标记为“道路”或“非道路”。然后,我们需要将这个面矢量图转化为道路的中心线。这通常可以通过使用骨架化或细化技术来实现,这些技术可以将二维的面矢量细化为一维的线矢量,即道路的中心线。这样,我们就可以从深度学习生成的道路面矢量图中获取到道路的中心线,为路线规划和高精度地图要素采集提供重要信息。
本文主要讲解如何端对端获取道路中心线,不涉及深度学习道路识别。
输入是道路面矢量,输出是道路中心线矢量
代码
# -*- 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
测试数据2
代码逻辑
这段Python代码的主要目的是从代表道路轮廓的多边形中生成道路的中心线。它使用了geopandas
和pygeoops
两个库。下面是对这段代码的逐行解释:
- 首先,导入了
geopandas
和pygeoops
两个库。geopandas
是一个开源项目,它使得在Python中处理地理空间数据变得更加容易。pygeoops
是一个Python库,提供了一些地理空间操作的函数,例如计算几何对象的中心线。 - 定义了一个函数
generate_centerline
,这个函数接收三个参数:输入的shapefile文件路径、输出的shapefile文件路径和简化公差(simplifytolerance)。 - 在
generate_centerline
函数中,首先使用gpd.read_file
函数从输入的shapefile文件中读取多边形数据,这些多边形代表了道路的轮廓。 - 然后,使用
pygeoops.centerline
函数计算每个多边形的中心线。simplifytolerance
参数用于控制在计算中心线时的简化程度。负值表示允许一些小的偏离,这可以帮助处理一些复杂的多边形。 - 计算得到的中心线替换了原来的多边形数据,然后将结果保存到新的shapefile文件中。
- 在主函数中,定义了输入和输出的shapefile文件路径,然后调用
generate_centerline
函数生成道路的中心线。
总的来说,这段代码实现了从代表道路轮廓的多边形中生成道路的中心线的功能。