scripts/osm-itineraire-userscript/rendu_itineraire.py

68 lines
2.7 KiB
Python
Raw Permalink Normal View History

2024-08-06 16:52:59 +02:00
import osmnx as ox
import svgwrite
# Définir les coordonnées de la plage de Dieppe et de la gare SNCF de Dieppe
start_point = (49.9242, 1.0833) # Plage de Dieppe
end_point = (49.9239, 1.0764) # Gare SNCF de Dieppe
# Charger le graphe routier de Dieppe
G = ox.graph_from_place('Dieppe, France', network_type='drive')
# Trouver les noeuds les plus proches des coordonnées de départ et d'arrivée
start_node = ox.nearest_nodes(G, start_point[1], start_point[0])
end_node = ox.nearest_nodes(G, end_point[1], end_point[0])
# Trouver le plus court chemin entre les deux points
route = ox.shortest_path(G, start_node, end_node, weight='length')
# Trouver les 3 plus courts chemins entre les deux points
routes = ox.k_shortest_paths(G, start_node, end_node, k=3, weight='length')
# Définir les dimensions du canevas
canvas_width = 200
canvas_height = 200
# Définir la bounding box des coordonnées géographiques
min_lat = min(node['y'] for node in G.nodes.values())
max_lat = max(node['y'] for node in G.nodes.values())
min_lon = min(node['x'] for node in G.nodes.values())
max_lon = max(node['x'] for node in G.nodes.values())
# Créer une matrice de transformation pour mapper les coordonnées géographiques au canevas
transform = svgwrite.transforms.Matrix()
transform.translate(-min_lon, -min_lat)
transform.scale(canvas_width / (max_lon - min_lon), canvas_height / (max_lat - min_lat))
# Créer un objet SVG
dwg = svgwrite.Drawing('itineraire_dieppe.svg', (canvas_width, canvas_height), viewBox=f"0 0 {canvas_width} {canvas_height}")
# Ajouter le fond de carte
dwg.add(dwg.rect(insert=(0, 0), size=(canvas_width, canvas_height), fill='#f9f9f9'))
# Dessiner le tracé de l'itinéraire principal
path = svgwrite.path.Path(stroke='#00698f', stroke_width=2, fill='none')
for i in range(len(route) - 1):
node1 = G.nodes[route[i]]
node2 = G.nodes[route[i + 1]]
path.push('M', *transform.apply(node1['x'], node1['y']))
path.push('L', *transform.apply(node2['x'], node2['y']))
dwg.add(path)
# Dessiner les tracés des chemins alternatifs
for i, route_alt in enumerate(routes):
if i == 0:
continue # skip the shortest path
path = svgwrite.path.Path(stroke='#aaaaaa', stroke_width=1, fill='none')
for j in range(len(route_alt) - 1):
node1 = G.nodes[route_alt[j]]
node2 = G.nodes[route_alt[j + 1]]
path.push('M', *transform.apply(node1['x'], node1['y']))
path.push('L', *transform.apply(node2['x'], node2['y']))
dwg.add(path)
# Ajouter des marques pour les points de départ et d'arrivée
dwg.add(dwg.circle(center=transform.apply(*start_point), r=5, fill='#ff0000'))
dwg.add(dwg.circle(center=transform.apply(*end_point), r=5, fill='#00ff00'))
# Enregistrer le fichier SVG
dwg.save()