import xml.etree.ElementTree as ET
from mayavi import mlab
import numpy as np
# 解析XML文件
tree = ET.parse('Shanghai_yanan.xml')
root = tree.getroot()
# 命名空间
ns = {
'default': 'http://www.dspace.com/XMLSchema/ScenarioAccess/Scenario/Road',
'common': 'http://www.dspace.com/XMLSchema/ScenarioAccess/Scenario/Common'
}
# 提取道路对象信息
road_objects = []
for obj_elem in root.findall('.//default:EnvironmentObjects', ns):
obj_info = {
'name': obj_elem.find('default:Name', ns).text,
'description': obj_elem.find('default:Description', ns).text,
'id': obj_elem.find('default:ID', ns).text,
'x': float(obj_elem.find('default:X', ns).text),
'y': float(obj_elem.find('default:Y', ns).text),
'z': float(obj_elem.find('default:Z', ns).text),
'angle_x': float(obj_elem.find('default:AngleX', ns).text),
'angle_y': float(obj_elem.find('default:AngleY', ns).text),
'angle_z': float(obj_elem.find('default:AngleZ', ns).text),
's': float(obj_elem.find('default:S', ns).text),
'd': float(obj_elem.find('default:D', ns).text),
}
road_objects.append(obj_info)
# 提取道路形状信息
road_shapes = []
for shape_elem in root.findall('.//default:Shape', ns):
nodes = shape_elem.findall('.//default:Node', ns)
node_positions = [(float(node.find('default:RelativePosition/default:X', ns).text),
float(node.find('default:RelativePosition/default:Y', ns).text)) for node in nodes]
road_shapes.append(node_positions)
# 可视化道路对象和形状
fig = mlab.figure(bgcolor=(1, 1, 1), size=(800, 600))
# 绘制道路形状
for shape in road_shapes:
x = [p[0] for p in shape]
y = [p[1] for p in shape]
mlab.plot3d(x, y, np.zeros_like(x), color=(0.5, 0.5, 0.5), tube_radius=None)
# 绘制道路对象
for obj in road_objects:
x, y, z = obj['x'], obj['y'], obj['z']
# 颜色映射示例:根据道路对象的ID确定颜色
color = (float(obj['id']) / len(road_objects), 0, 1 - float(obj['id']) / len(road_objects))
mlab.points3d(x, y, z, color=color, scale_factor=10)
# 用户交互功能和信息显示
@mlab.show
def picker_callback(picker_obj):
if picker_obj.actor in fig.children:
picked_id = picker_obj.point_id
if picked_id != -1:
obj = road_objects[picked_id]
info_text = f"""
Name: {obj['name']}
Description: {obj['description']}
ID: {obj['id']}
Position (X, Y, Z): ({obj['x']}, {obj['y']}, {obj['z']})
Orientation (Angle X, Angle Y, Angle Z): ({obj['angle_x']}, {obj['angle_y']}, {obj['angle_z']})
Road Coordinates (S, D): ({obj['s']}, {obj['d']})
"""
mlab.text(0.05, 0.9, info_text, width=0.4)
# 设置视图属性
mlab.view(azimuth=180, elevation=70, distance='auto')
# 添加标题和轴标签
mlab.title('Shanghai Yanan Road Network')
mlab.xlabel('X-axis')
mlab.ylabel('Y-axis')
mlab.zlabel('Z-axis')
# 添加交互选择器
picker = fig.on_mouse_pick(picker_callback)
# 显示可视化窗口
mlab.show()
01-17
544
02-09
3104
01-05
3905