Zayeemk commited on
Commit
069dbdc
·
verified ·
1 Parent(s): 74af9e3

Update route_optimizer/green_route_optimizer.py

Browse files
route_optimizer/green_route_optimizer.py CHANGED
@@ -1,68 +1,56 @@
1
  # route_optimizer/green_route_optimizer.py
2
 
3
- import math
4
  from geopy.geocoders import Nominatim
 
5
 
6
  class GreenRouteOptimizer:
7
  """
8
- A route optimizer for green transport modes: rail, road, and ship.
9
- Calculates approximate distance and CO2 emissions.
10
  """
11
 
12
- # Emission factors in kg CO2 per km
13
- EMISSION_FACTORS = {
14
- "rail": 0.041,
15
- "road": 0.21,
16
- "ship": 0.015
17
- }
18
-
19
- def __init__(self):
20
- # Initialize geocoder
21
- self.geolocator = Nominatim(user_agent="green_route_optimizer")
22
 
23
  def geocode(self, place_name):
24
- """
25
- Convert a place name into coordinates (latitude, longitude).
26
- Accepts place name, city+country, or city+state+country.
27
- """
28
  location = self.geolocator.geocode(place_name)
29
  if location is None:
30
  raise ValueError(f"Could not geocode place: '{place_name}'")
31
  return (location.latitude, location.longitude)
32
 
33
- def optimize(self, start_coords, end_coords, mode):
34
- """
35
- Returns a mock optimized route result using Euclidean distance approximation.
36
- """
37
- distance_km = math.dist(start_coords, end_coords)
38
- return {
 
39
  "start": start_coords,
40
  "end": end_coords,
41
  "mode": mode,
42
  "optimized_distance_km": round(distance_km, 2),
43
- "estimated_emission_kg": round(distance_km * self.EMISSION_FACTORS[mode], 3)
44
  }
 
45
 
46
- def recommend_green_routes(self, start_place, end_place, modes=None):
47
  """
48
- Returns optimized routes for green transport modes.
49
-
50
- start_place, end_place: place names (city, city+state, or city+country)
51
- modes: optional list of modes (rail, road, ship). Defaults to all.
 
52
  """
53
  start_coords = self.geocode(start_place)
54
  end_coords = self.geocode(end_place)
55
-
56
- if modes is None:
57
- modes = ["rail", "road", "ship"]
58
-
59
- routes = []
60
- for mode in modes:
61
- if mode not in self.EMISSION_FACTORS:
62
- continue
63
- route = self.optimize(start_coords, end_coords, mode)
64
- routes.append(route)
65
-
66
- # Sort routes by lowest emission first
67
- routes.sort(key=lambda x: x["estimated_emission_kg"])
68
- return routes
 
1
  # route_optimizer/green_route_optimizer.py
2
 
 
3
  from geopy.geocoders import Nominatim
4
+ import math
5
 
6
  class GreenRouteOptimizer:
7
  """
8
+ GreenRouteOptimizer calculates optimized routes for rail, road, and ship.
9
+ Accepts place names (with optional country/short code) and returns distance and emission estimates.
10
  """
11
 
12
+ def __init__(self, user_agent="green_route_app"):
13
+ self.geolocator = Nominatim(user_agent=user_agent)
14
+ # Emission factors in kg CO2 per km (example values)
15
+ self.emission_factors = {
16
+ "road": 0.21, # road transport
17
+ "rail": 0.041, # rail transport
18
+ "ship": 0.014 # shipping
19
+ }
 
 
20
 
21
  def geocode(self, place_name):
22
+ """Returns (latitude, longitude) tuple for a given place name."""
 
 
 
23
  location = self.geolocator.geocode(place_name)
24
  if location is None:
25
  raise ValueError(f"Could not geocode place: '{place_name}'")
26
  return (location.latitude, location.longitude)
27
 
28
+ def optimize(self, start_coords, end_coords, mode="road"):
29
+ """Calculates Euclidean distance and estimated emissions."""
30
+ if mode not in self.emission_factors:
31
+ raise ValueError(f"Invalid mode '{mode}'. Choose from {list(self.emission_factors.keys())}.")
32
+
33
+ distance_km = math.dist(start_coords, end_coords) * 111 # approx km per degree
34
+ optimized_route = {
35
  "start": start_coords,
36
  "end": end_coords,
37
  "mode": mode,
38
  "optimized_distance_km": round(distance_km, 2),
39
+ "estimated_emission_kg": round(distance_km * self.emission_factors[mode], 3)
40
  }
41
+ return optimized_route
42
 
43
+ def recommend_green_routes(self, start_place, end_place):
44
  """
45
+ Returns optimized routes for all transport modes.
46
+ start_place and end_place can be:
47
+ - "City"
48
+ - "City, Country"
49
+ - "City, CountryCode" (short form)
50
  """
51
  start_coords = self.geocode(start_place)
52
  end_coords = self.geocode(end_place)
53
+ results = {}
54
+ for mode in self.emission_factors:
55
+ results[mode] = self.optimize(start_coords, end_coords, mode)
56
+ return results