Show rail routes using GeoJSON
This commit is contained in:
		
							parent
							
								
									4e719a07ab
								
							
						
					
					
						commit
						e2fdd1d198
					
				| 
						 | 
					@ -124,10 +124,20 @@ coordinates.forEach(function(item) {
 | 
				
			||||||
  marker.bindPopup(item.name);
 | 
					  marker.bindPopup(item.name);
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Draw lines for routes
 | 
					// Draw routes
 | 
				
			||||||
routes.forEach(function(route) {
 | 
					routes.forEach(function(route) {
 | 
				
			||||||
  var color = route[0] === "train" ? "green" : "red"; // Green for trains, red for flights
 | 
					  if (route.geojson) {
 | 
				
			||||||
  L.polyline([route[1], route[2]], {color: color}).addTo(map);
 | 
					    // If route is defined as GeoJSON
 | 
				
			||||||
 | 
					    L.geoJSON(JSON.parse(route.geojson), {
 | 
				
			||||||
 | 
					      style: function(feature) {
 | 
				
			||||||
 | 
					        return {color: route.type === "train" ? "green" : "blue"}; // Green for trains, blue for flights
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }).addTo(map);
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    // If route is defined by 'from' and 'to' coordinates
 | 
				
			||||||
 | 
					    var color = route.type === "train" ? "green" : "red"; // Green for trains, red for flights
 | 
				
			||||||
 | 
					    L.polyline([route.from, route.to], {color: color}).addTo(map);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</script>
 | 
					</script>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										38
									
								
								web_view.py
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								web_view.py
									
									
									
									
									
								
							| 
						 | 
					@ -301,23 +301,51 @@ def latlon_tuple(stop: StrDict) -> tuple[float, float]:
 | 
				
			||||||
    return (stop["latitude"], stop["longitude"])
 | 
					    return (stop["latitude"], stop["longitude"])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_trip_routes(
 | 
					def read_geojson(filename: str) -> str:
 | 
				
			||||||
    trip: Trip,
 | 
					    data_dir = app.config["PERSONAL_DATA"]
 | 
				
			||||||
) -> list[tuple[str, tuple[float, float], tuple[float, float]]]:
 | 
					    return open(os.path.join(data_dir, "train_routes", filename + ".geojson")).read()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_trip_routes(trip: Trip) -> list[StrDict]:
 | 
				
			||||||
    routes = []
 | 
					    routes = []
 | 
				
			||||||
 | 
					    seen_geojson = set()
 | 
				
			||||||
    for t in trip.travel:
 | 
					    for t in trip.travel:
 | 
				
			||||||
        if t["type"] == "flight":
 | 
					        if t["type"] == "flight":
 | 
				
			||||||
            if "from_airport" not in t or "to_airport" not in t:
 | 
					            if "from_airport" not in t or "to_airport" not in t:
 | 
				
			||||||
                continue
 | 
					                continue
 | 
				
			||||||
            fly_from, fly_to = t["from_airport"], t["to_airport"]
 | 
					            fly_from, fly_to = t["from_airport"], t["to_airport"]
 | 
				
			||||||
            routes.append(("flight", latlon_tuple(fly_from), latlon_tuple(fly_to)))
 | 
					            routes.append(
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    "type": "flight",
 | 
				
			||||||
 | 
					                    "from": latlon_tuple(fly_from),
 | 
				
			||||||
 | 
					                    "to": latlon_tuple(fly_to),
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            assert t["type"] == "train"
 | 
					            assert t["type"] == "train"
 | 
				
			||||||
            for leg in t["legs"]:
 | 
					            for leg in t["legs"]:
 | 
				
			||||||
                train_from, train_to = leg["from_station"], leg["to_station"]
 | 
					                train_from, train_to = leg["from_station"], leg["to_station"]
 | 
				
			||||||
 | 
					                geojson_filename = train_from.get("routes", {}).get(train_to["uic"])
 | 
				
			||||||
 | 
					                if not geojson_filename:
 | 
				
			||||||
 | 
					                    routes.append(
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            "type": "train",
 | 
				
			||||||
 | 
					                            "from": latlon_tuple(train_from),
 | 
				
			||||||
 | 
					                            "to": latlon_tuple(train_to),
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
 | 
					                    continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if geojson_filename in seen_geojson:
 | 
				
			||||||
 | 
					                    continue
 | 
				
			||||||
 | 
					                seen_geojson.add(geojson_filename)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                routes.append(
 | 
					                routes.append(
 | 
				
			||||||
                    ("train", latlon_tuple(train_from), latlon_tuple(train_to))
 | 
					                    {
 | 
				
			||||||
 | 
					                        "type": "train",
 | 
				
			||||||
 | 
					                        "geojson": read_geojson(geojson_filename),
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return routes
 | 
					    return routes
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue