Spaces:
Running
Running
| import os | |
| import gradio as gr | |
| import math | |
| from typing import Union | |
| import requests | |
| import json | |
| from urllib.parse import quote | |
| from dotenv import load_dotenv | |
| from time import sleep | |
| Number = Union[int, float] | |
| load_dotenv(override=True) | |
| def get_geo_coords(address, access_token): | |
| sleep_time = 1 | |
| while sleep_time < 10: | |
| base_url = "https://us1.locationiq.com/v1/search" | |
| # headers= {"key: " + f"{access_token}", "Content-Type: application/json",} | |
| url = f"{base_url}?key={access_token}&q={quote(address)}&format=json" | |
| response = requests.get(url) | |
| if response.status_code == 429: | |
| sleep(sleep_time) | |
| sleep_time *= 3 | |
| else: | |
| break; | |
| if sleep_time > 9: | |
| return (0.0, 0.0) | |
| rjson = json.loads(response.content) | |
| return (float(rjson[0]['lat']), float(rjson[0]['lon'])) | |
| def great_circle_distance_miles(lat1: Number, lon1: Number, lat2: Number, lon2: Number, | |
| radius_miles: float = 3958.8) -> float: | |
| """ | |
| Compute the great-circle distance between two points on the Earth using the haversine formula. | |
| Parameters: | |
| - lat1, lon1: Latitude and longitude of the first point in degrees. | |
| - lat2, lon2: Latitude and longitude of the second point in degrees. | |
| - radius_miles: Radius of the Earth in miles (default 3958.8 miles). | |
| Returns: | |
| - Distance between the two points in miles (float). | |
| Notes: | |
| - Latitude values should be in [-90, 90], longitude values in [-180, 180]. | |
| """ | |
| # convert degrees to radians | |
| phi1 = math.radians(lat1) | |
| phi2 = math.radians(lat2) | |
| dphi = math.radians(lat2 - lat1) | |
| dlambda = math.radians(lon2 - lon1) | |
| # haversine formula | |
| a = math.sin(dphi / 2.0) ** 2 + math.cos(phi1) * math.cos(phi2) * math.sin(dlambda / 2.0) ** 2 | |
| c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) | |
| return radius_miles * c | |
| def geo_distance(addr1: str, addr2: str, pwd: str) -> float: | |
| ''' Compute straight-line (great circle) distance in miles | |
| between two addresses or other location specifiers. | |
| Args: | |
| addr1: first address or location | |
| addr2: second address or location | |
| pwd: a password | |
| Returns: | |
| The great circle distance in miles between the two locations | |
| ''' | |
| good_pwd = os.getenv('PWD') | |
| if pwd != good_pwd: | |
| return 0.0 | |
| access_token = os.getenv('TOKEN') | |
| (lat1, lon1) = get_geo_coords(addr1, access_token) | |
| (lat2, lon2) = get_geo_coords(addr2, access_token) | |
| distance = great_circle_distance_miles(lat1, lon1, lat2, lon2) | |
| return distance | |
| demo = gr.Interface(fn=geo_distance, | |
| inputs=["text", "text", "text"], | |
| outputs="number") | |
| demo.launch(mcp_server=True) # exposes an MCP schema automatically |