fix: restrict map route domain to Chennai region and implement numbered stop markers

This commit is contained in:
Shanmuga Krishnan S M
2026-07-24 09:34:24 +05:30
parent 2295187788
commit 8e87bd72cd
4 changed files with 2492 additions and 675 deletions

View File

@@ -167,10 +167,6 @@
"lat": 13.0118,
"lng": 80.0214
},
"Ayyampettai": {
"lat": 10.8962881,
"lng": 79.1886395
},
"Ayyangarkulam": {
"lat": 13.0118,
"lng": 80.0214
@@ -178,5 +174,473 @@
"Ayyapanthangal": {
"lat": 13.041,
"lng": 80.1412
},
"B.B.Road": {
"lat": 13.0095255,
"lng": 80.2537619
},
"BDO Office": {
"lat": 12.9022177,
"lng": 80.0257182
},
"Bai Kadai": {
"lat": 13.0198261,
"lng": 80.1430544
},
"Balaji Dental College": {
"lat": 12.9441308,
"lng": 80.208506
},
"Banavaram koot": {
"lat": 13.0118,
"lng": 80.0214
},
"Beach Station": {
"lat": 13.0942257,
"lng": 80.2921033
},
"Bharath College": {
"lat": 12.9079915,
"lng": 80.1394791
},
"Bharathi nagar": {
"lat": 13.1226511,
"lng": 80.2237949
},
"Butt Road": {
"lat": 13.0084,
"lng": 80.1987
},
"Butt road": {
"lat": 13.0084,
"lng": 80.1987
},
"CIT Nagar": {
"lat": 13.0293843,
"lng": 80.2342825
},
"CMBT (Koyambedu)": {
"lat": 13.0678,
"lng": 80.2054
},
"CRP": {
"lat": 13.0118,
"lng": 80.0214
},
"CRPF": {
"lat": 12.9912054,
"lng": 80.1881366
},
"Camp Road ICICI Bank": {
"lat": 13.0118,
"lng": 80.0214
},
"Camp Road Singal": {
"lat": 13.0118,
"lng": 80.0214
},
"Canara Bank": {
"lat": 12.9764294,
"lng": 80.2224084
},
"Central": {
"lat": 13.0827,
"lng": 80.2707
},
"Chembarambakkam": {
"lat": 13.016769,
"lng": 80.1367942
},
"Chengalpattu Bypass": {
"lat": 13.0118,
"lng": 80.0214
},
"Chengalpattu Rattinakinaru": {
"lat": 13.0118,
"lng": 80.0214
},
"Chennai Trade Centre": {
"lat": 13.0142534,
"lng": 80.1905788
},
"Chennirkuppam": {
"lat": 13.0118,
"lng": 80.0214
},
"Cheriyan Hospital": {
"lat": 13.0118,
"lng": 80.0214
},
"Cheyyar-SBI": {
"lat": 13.0118,
"lng": 80.0214
},
"Chinmaiya Nagar": {
"lat": 13.0118,
"lng": 80.0214
},
"Chintadripet (Post Offiec)": {
"lat": 13.0761258,
"lng": 80.270781
},
"Chintamani": {
"lat": 13.0472403,
"lng": 80.1853252
},
"Chinthamani": {
"lat": 13.0410061,
"lng": 80.2373742
},
"Chithukadu Blue": {
"lat": 13.0118,
"lng": 80.0214
},
"Choolai Post Office": {
"lat": 13.0118,
"lng": 80.0214
},
"Choolaimedu": {
"lat": 13.0666515,
"lng": 80.230974
},
"Choolaimedu Subway": {
"lat": 13.0645,
"lng": 80.2224
},
"Choolaimedu bus stop": {
"lat": 13.0666287,
"lng": 80.2305198
},
"Chrompet": {
"lat": 12.961,
"lng": 80.1462
},
"Collector Nagar": {
"lat": 13.0884944,
"lng": 80.1909707
},
"Collector Office": {
"lat": 13.0959177,
"lng": 80.2922668
},
"Collector nagar": {
"lat": 13.0884944,
"lng": 80.1909707
},
"D.R.Super Market": {
"lat": 13.0118,
"lng": 80.0214
},
"D1 Police Station": {
"lat": 13.0683459,
"lng": 80.2135958
},
"Dasprakash": {
"lat": 13.0811,
"lng": 80.2524
},
"Deepam Foods": {
"lat": 13.0118,
"lng": 80.0214
},
"Donbosco": {
"lat": 13.0118,
"lng": 80.0214
},
"E.B": {
"lat": 13.0869258,
"lng": 80.2194441
},
"E.B. Stop": {
"lat": 13.0869258,
"lng": 80.2194441
},
"Eaga Theatre": {
"lat": 13.0118,
"lng": 80.0214
},
"Egambaranathar Koil": {
"lat": 13.0118,
"lng": 80.0214
},
"Egmore": {
"lat": 13.0792,
"lng": 80.2598
},
"Ekkatuthangal": {
"lat": 13.0118,
"lng": 80.0214
},
"Elango Nagar": {
"lat": 12.9715538,
"lng": 80.2523792
},
"Ellaimman Koil": {
"lat": 13.0118,
"lng": 80.0214
},
"Erumaiyur": {
"lat": 12.9547388,
"lng": 80.0815988
},
"Eswar Nagar": {
"lat": 13.0577106,
"lng": 80.2190678
},
"G3 Police Station": {
"lat": 13.0683459,
"lng": 80.2135958
},
"GRT": {
"lat": 12.9826003,
"lng": 80.2181059
},
"Ganga Cinima": {
"lat": 13.0118,
"lng": 80.0214
},
"Gangaiamman koil": {
"lat": 13.0551756,
"lng": 80.1913579
},
"Gerugambakkam": {
"lat": 13.0152345,
"lng": 80.1368538
},
"Golden Flats": {
"lat": 13.0883017,
"lng": 80.1784121
},
"Golden flat": {
"lat": 13.0118,
"lng": 80.0214
},
"Govardhanagari": {
"lat": 13.0118,
"lng": 80.0214
},
"Govarthanagiri Bus Stand": {
"lat": 13.0118,
"lng": 80.0214
},
"Government Hospital": {
"lat": 13.1093369,
"lng": 80.2312849
},
"Gudalore": {
"lat": 13.0118,
"lng": 80.0214
},
"Guduvanchery": {
"lat": 13.0118,
"lng": 80.0214
},
"Guindy": {
"lat": 13.0067,
"lng": 80.2206
},
"HDFC Bank": {
"lat": 13.0308653,
"lng": 80.2455467
},
"HVF": {
"lat": 13.0293266,
"lng": 80.1667524
},
"Housing Board": {
"lat": 13.0084674,
"lng": 80.2475552
},
"ICF Church": {
"lat": 13.0118,
"lng": 80.0214
},
"ICF Signal": {
"lat": 13.1001091,
"lng": 80.2145485
},
"IOB Bank": {
"lat": 13.0224668,
"lng": 80.2230059
},
"Ice House Police Station": {
"lat": 13.052,
"lng": 80.2762
},
"Indian Bank Thiruvninravur": {
"lat": 13.0118,
"lng": 80.0214
},
"Indira Gandhi Nagar": {
"lat": 13.0914233,
"lng": 80.2541906
},
"Indra Nagar (KPM Railwaygate)": {
"lat": 13.0370804,
"lng": 80.1887213
},
"Irungattukottai bus stand": {
"lat": 13.0118,
"lng": 80.0214
},
"Iyyappanthangal": {
"lat": 13.0118,
"lng": 80.0214
},
"JJ Nagar": {
"lat": 13.0790498,
"lng": 80.1719442
},
"JJ Nagar Police Station": {
"lat": 13.0118,
"lng": 80.0214
},
"Janappanchatram Bypass": {
"lat": 13.0118,
"lng": 80.0214
},
"Jaya College": {
"lat": 13.1225267,
"lng": 80.0454078
},
"Jayalakshmi Theatre": {
"lat": 13.0118,
"lng": 80.0214
},
"Jeyachandran": {
"lat": 12.9211296,
"lng": 80.1968403
},
"Joint Office": {
"lat": 13.101916,
"lng": 80.230392
},
"Joshua School": {
"lat": 13.0118,
"lng": 80.0214
},
"Jothi Nagar": {
"lat": 12.9459767,
"lng": 80.239775
},
"K4 Police Station": {
"lat": 13.0925413,
"lng": 80.2179712
},
"KK Nagar": {
"lat": 13.0373,
"lng": 80.2045
},
"KK Nagar ESI": {
"lat": 13.0373,
"lng": 80.2045
},
"Kachapeswarar Koil": {
"lat": 13.0118,
"lng": 80.0214
},
"Kaduveti": {
"lat": 13.0118,
"lng": 80.0214
},
"Kaiveli": {
"lat": 12.9633783,
"lng": 80.2160859
},
"Kakkalur": {
"lat": 13.1305159,
"lng": 79.9243758
},
"Kakkalur Signal": {
"lat": 13.1305159,
"lng": 79.9243758
},
"Kakkan Bridge": {
"lat": 13.0118,
"lng": 80.0214
},
"Kallikuppam": {
"lat": 13.1331405,
"lng": 80.1701786
},
"Kalmandapam": {
"lat": 13.1153712,
"lng": 80.2905548
},
"Kalpana Lamp": {
"lat": 13.0118,
"lng": 80.0214
},
"Kalyan Jewalrs": {
"lat": 13.0118,
"lng": 80.0214
},
"Kamarajapuram": {
"lat": 13.1933419,
"lng": 80.2612852
},
"Kambar Colony": {
"lat": 12.9755337,
"lng": 80.2296597
},
"Ayyampettai": {
"lat": 13.0118,
"lng": 80.0214
},
"Chitteri": {
"lat": 13.0118,
"lng": 80.0214
},
"Ganeshapuram": {
"lat": 13.0118,
"lng": 80.0214
},
"Kamban Nagar": {
"lat": 13.0118,
"lng": 80.0214
},
"Kammal Street": {
"lat": 13.0903441,
"lng": 80.2791264
},
"Kammala street": {
"lat": 13.0118,
"lng": 80.0214
},
"Kankaiyamman Kovil": {
"lat": 13.0118,
"lng": 80.0214
},
"Kannadhasan Nagar": {
"lat": 13.0118,
"lng": 80.0214
},
"Karanodai Bypass": {
"lat": 13.0118,
"lng": 80.0214
},
"Karapakkam": {
"lat": 12.9117073,
"lng": 80.2277203
},
"Karapakkam - TCS": {
"lat": 13.0118,
"lng": 80.0214
},
"Karayanchavadi": {
"lat": 13.0467114,
"lng": 80.1109051
},
"Karima Nagar": {
"lat": 13.0118,
"lng": 80.0214
},
"Kasi Theatre": {
"lat": 13.0305,
"lng": 80.2132
},
"Kasimedu": {
"lat": 13.1364038,
"lng": 80.2958012
}
}

View File

@@ -9,6 +9,13 @@ CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
BUS_ROUTES_PATH = os.path.abspath(os.path.join(CURRENT_DIR, "..", "backend", "src", "main", "resources", "bus_routes.json"))
CACHE_PATH = os.path.join(CURRENT_DIR, "coordinates_cache.json")
# Domain restriction (Chennai, Tiruvallur, Kanchipuram districts)
MIN_LAT, MAX_LAT = 12.7, 13.4
MIN_LNG, MAX_LNG = 79.6, 80.4
def is_valid_coordinate(lat, lng):
return MIN_LAT <= lat <= MAX_LAT and MIN_LNG <= lng <= MAX_LNG
# Predefined coordinates for hard-to-geocode stops or fallback landmarks in Chennai
STATIC_COORDINATES = {
"RIT Campus": {"lat": 13.0118, "lng": 80.0214},
@@ -68,7 +75,15 @@ def load_cache():
if os.path.exists(CACHE_PATH):
try:
with open(CACHE_PATH, "r", encoding="utf-8") as f:
return json.load(f)
data = json.load(f)
# Clean coordinates that are outside the map route domain
cleaned = {}
for name, coords in data.items():
if is_valid_coordinate(coords["lat"], coords["lng"]):
cleaned[name] = coords
else:
print(f"Removing invalid cache entry for '{name}': {coords}")
return cleaned
except Exception:
pass
return {}
@@ -114,8 +129,11 @@ def geocode_nominatim(name):
if data:
lat = float(data[0]["lat"])
lng = float(data[0]["lon"])
print(f"-> Found: {lat}, {lng}")
return {"lat": lat, "lng": lng}
if is_valid_coordinate(lat, lng):
print(f"-> Found within domain: {lat}, {lng}")
return {"lat": lat, "lng": lng}
else:
print(f"-> Found but DISCARDED (outside domain): {lat}, {lng}")
# Rest to respect API limit
time.sleep(1.2)
except Exception as e:
@@ -132,39 +150,7 @@ def geocode_nominatim(name):
print(f"-> No match found for '{name}'. Defaulting to RIT Campus.")
return STATIC_COORDINATES["RIT Campus"]
def geocode_routes():
if not os.path.exists(BUS_ROUTES_PATH):
print(f"Error: {BUS_ROUTES_PATH} does not exist.")
return
with open(BUS_ROUTES_PATH, "r", encoding="utf-8") as f:
routes = json.load(f)
cache = load_cache()
modified = False
# Collect all unique stop names
unique_names = set()
for r in routes:
unique_names.add(r["from"])
unique_names.add(r["to"])
for stop in r.get("stops", []):
unique_names.add(stop["name"])
print(f"Total unique stops to geocode: {len(unique_names)}")
# Geocode each stop
count = 0
for name in sorted(unique_names):
if name not in cache:
coords = geocode_nominatim(name)
cache[name] = coords
count += 1
# Save cache incrementally
if count % 5 == 0:
save_cache(cache)
save_cache(cache)
def update_bus_routes_json(routes, cache):
# Enrich bus_routes.json
for r in routes:
from_coords = cache.get(r["from"], STATIC_COORDINATES["RIT Campus"])
@@ -183,7 +169,49 @@ def geocode_routes():
with open(BUS_ROUTES_PATH, "w", encoding="utf-8") as f:
json.dump(routes, f, indent=2)
print("Geocoding process complete! bus_routes.json updated with coordinates.")
def geocode_routes():
if not os.path.exists(BUS_ROUTES_PATH):
print(f"Error: {BUS_ROUTES_PATH} does not exist.")
return
with open(BUS_ROUTES_PATH, "r", encoding="utf-8") as f:
routes = json.load(f)
cache = load_cache()
# Save the cleaned cache to start
save_cache(cache)
# Write coordinates to the JSON immediately for any stops that are already in the cache!
update_bus_routes_json(routes, cache)
print("Initial cache applied to bus_routes.json.")
# Collect all unique stop names
unique_names = set()
for r in routes:
unique_names.add(r["from"])
unique_names.add(r["to"])
for stop in r.get("stops", []):
unique_names.add(stop["name"])
print(f"Total unique stops to geocode: {len(unique_names)}")
# Geocode each stop
count = 0
for name in sorted(unique_names):
if name not in cache:
coords = geocode_nominatim(name)
cache[name] = coords
count += 1
# Save cache and update JSON incrementally
save_cache(cache)
update_bus_routes_json(routes, cache)
print(f"Updated routes JSON with '{name}' ({coords['lat']}, {coords['lng']})")
# Final save
save_cache(cache)
update_bus_routes_json(routes, cache)
print("Geocoding process complete! bus_routes.json fully synchronized.")
if __name__ == "__main__":
geocode_routes()