Fixed distant calculation

This commit is contained in:
2025-11-14 10:08:24 -05:00
parent 2ea720f2e5
commit 66f8b16286
+35 -14
View File
@@ -689,33 +689,54 @@ def calculate_distance_miles(lat1, lng1, lat2, lng2):
except Exception as gmaps_error: except Exception as gmaps_error:
print(f"⚠️ Google Maps Distance Matrix API error: {gmaps_error}") print(f"⚠️ Google Maps Distance Matrix API error: {gmaps_error}")
# Fallback: Use Enhanced Haversine formula for straight-line distance # Fallback: Use CORRECTED Haversine formula for straight-line distance
print(f"📐 Falling back to Haversine formula for straight-line distance") print(f"📐 Falling back to Haversine formula for straight-line distance")
# Convert decimal degrees to radians # CRITICAL FIX: Convert decimal degrees to radians with proper precision
lat1_rad, lng1_rad, lat2_rad, lng2_rad = map(radians, [float(lat1), float(lng1), float(lat2), float(lng2)]) # Use float() to ensure we're working with proper decimal values
lat1_val = float(lat1)
lng1_val = float(lng1)
lat2_val = float(lat2)
lng2_val = float(lng2)
# Enhanced Haversine formula for better precision # Convert to radians
dlng = lng2_rad - lng1_rad lat1_rad = radians(lat1_val)
lng1_rad = radians(lng1_val)
lat2_rad = radians(lat2_val)
lng2_rad = radians(lng2_val)
# Calculate differences
dlat = lat2_rad - lat1_rad dlat = lat2_rad - lat1_rad
dlng = lng2_rad - lng1_rad
# Haversine calculation # CORRECTED Haversine formula
a = sin(dlat/2)**2 + cos(lat1_rad) * cos(lat2_rad) * sin(dlng/2)**2 # Formula: a = sin²(Δlat/2) + cos(lat1) × cos(lat2) × sin²(Δlng/2)
c = 2 * asin(sqrt(a)) a = sin(dlat / 2.0) ** 2 + cos(lat1_rad) * cos(lat2_rad) * sin(dlng / 2.0) ** 2
# Earth's radius in miles (more precise value) # Ensure 'a' is within valid range [0, 1] for asin
a = min(1.0, max(0.0, a))
# c = 2 × asin(√a)
c = 2.0 * asin(sqrt(a))
# Earth's radius in miles (mean radius)
# Using more precise value: 3959.87433 miles
r_miles = 3959.87433 r_miles = 3959.87433
# Calculate distance with enhanced precision # Calculate distance with full precision
distance = c * r_miles distance = c * r_miles
# Round to 4 decimal places for better precision # Round to 4 decimal places for consistency
distance = round(distance, 4) distance = round(distance, 4)
print(f"📏 Haversine straight-line distance calculation:") print(f"📏 Haversine straight-line distance calculation:")
print(f" Point 1: {lat1:.10f}, {lng1:.10f}") print(f" Point 1: {lat1_val:.10f}, {lng1_val:.10f}")
print(f" Point 2: {lat2:.10f}, {lng2:.10f}") print(f" Point 2: {lat2_val:.10f}, {lng2_val:.10f}")
print(f" Straight-line Distance: {distance:.4f} miles") print(f" Δlat: {dlat:.12f} radians ({abs(lat2_val - lat1_val):.10f} degrees)")
print(f" Δlng: {dlng:.12f} radians ({abs(lng2_val - lng1_val):.10f} degrees)")
print(f" a value: {a:.15f}")
print(f" c value: {c:.15f}")
print(f" Straight-line Distance: {distance:.4f} miles ({distance * 5280:.2f} feet)")
# Log fallback distance calculation # Log fallback distance calculation
try: try: