68 lines
2.7 KiB
Python
68 lines
2.7 KiB
Python
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() |