Agorverse高清地图转OpenStreetMap及SUMO路网
1. Agorverse osm转换说明
根据作者的描述,其高清地图的osm文件与标准osm的区别在于以下几点:
在 OpenStreetMap (OSM) 中,“Node”是指一个兴趣点,或者是某条线性特征(例如道路)的组成点。在 OSM 中,Node 可以包含标签(tags),例如:
- natural:如果是自然特征,标明类型(如山顶等)。
- man_made:如果是人工设施,标明类型(如水塔、信号塔等)。
- amenity:如果是服务设施(如酒吧、餐馆、回收中心等),标明类型。
在 OSM 中,“Way”通常是由一系列有序的“Nodes”组成的道路中心线。OSM 中的 Way 通常表示线性或多边形特征,例如道路、溪流、森林或湖泊。Way 至少包含两个或更多的 Node,并可能具有以下标签:
- highway:道路的类别(如高速公路、主干道、次干道等)。
- maxspeed:道路的最高限速(单位:km/h)。
- ref:道路的参考编号。
- oneway:是否为单行道(布尔值)。
然而,在 Argoverse 中,“Way”对应的是车道段的中心线。一个 Argoverse Way 包含以下 9 个属性:
- id:整数,唯一的车道 ID,作为此“Way”的标识符。
- has_traffic_control:布尔值,表示是否有交通管制。
- turn_direction:字符串,表示转向方向(“RIGHT”、“LEFT”或“NONE”)。
- is_intersection:布尔值,表示是否为交叉路口。
- l_neighbor_id:整数,左侧相邻车道的唯一 ID。
- r_neighbor_id:整数,右侧相邻车道的唯一 ID。
- predecessors:整数列表或 None,表示前序车道。
- successors:整数列表或 None,表示后续车道。
- centerline_node_ids:列表,包含中心线的 Node IDs。
在 Argoverse 中,一个 LaneSegment 对象由一个 Way 和两个或更多的 Node 组合而成。
2. 转换源码
转换源码如下:
from pyproj import Proj, transform
# 假设原始坐标是 UTM Zone 33N,投影信息需要根据具体数据集调整
proj_utm = Proj(proj="utm", zone=33, ellps="WGS84", south=False)
proj_wgs84 = Proj(proj="latlong", datum="WGS84")
# Load the Argoverse XML file
input_file = "/home/moresweet/Downloads/hd_maps/map_files/pruned_argoverse_PIT_10314_vector_map.xml"
output_file = "/home/moresweet/Downloads/hd_maps/map_files/converted_osm_file.osm"
import xml.etree.ElementTree as ET
import datetime
from concurrent.futures import ThreadPoolExecutor
import math
# 经纬度参考点 (假设参考点在赤道和本初子午线交汇处)
REFERENCE_LAT = 0.0
REFERENCE_LON = 0.0
# 将笛卡尔坐标转换为 WGS84 经纬度
def convert_coordinate(x, y):
earth_radius = 6378137 # 地球半径,单位为米
lon = REFERENCE_LON + (x / (earth_radius * math.cos(math.pi * REFERENCE_LAT / 180))) * (180 / math.pi)
lat = REFERENCE_LAT + (y / earth_radius) * (180 / math.pi)
return lon, lat
# 格式化 XML 节点为美观的缩进格式
def prettify_xml(elem, level=0):
indent = " "
i = "\n" + level * indent
if len(elem):
if not elem.text or not elem.text.strip():
elem.text = i + indent
if not elem.tai