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()