|
|
|
import geonamescache
|
|
|
|
from geopy.distance import geodesic
|
|
|
|
|
|
|
|
gc = geonamescache.GeonamesCache()
|
|
|
|
cities = gc.get_cities()
|
|
|
|
us_cities = {k: c for k, c in cities.items() if c.get("countrycode") == "US"}
|
|
|
|
|
|
|
|
print(gc.search_cities("Jamaica"), "\n")
|
|
|
|
print(gc.search_cities("Manhattan"), "\n")
|
|
|
|
print("lengths:", len(cities), len(us_cities))
|
|
|
|
|
|
|
|
|
|
|
|
def get_coordinates(city_name, country_code="US"):
|
|
|
|
search_results = gc.search_cities(city_name, case_sensitive=True)
|
|
|
|
for city in search_results:
|
|
|
|
print(f"searching {city}")
|
|
|
|
possible_matches = city.get("alternatenames") + [city_name]
|
|
|
|
if city_name in possible_matches and city.get("countrycode") == country_code:
|
|
|
|
return city.get("latitude"), city.get("longitude")
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|
def get_distance(city1, city2, country1="US", country2="US"):
|
|
|
|
city1_coords = get_coordinates(city1, country1)
|
|
|
|
city2_coords = get_coordinates(city2, country2)
|
|
|
|
|
|
|
|
if (city1_coords is None) or (city2_coords is None):
|
|
|
|
return None
|
|
|
|
|
|
|
|
return geodesic(city1_coords, city2_coords).km
|
|
|
|
|
|
|
|
|
|
|
|
MAX_DISTANCE = 20_037.5
|
|
|
|
|
|
|
|
city1 = "New York"
|
|
|
|
city2 = "Jamaica"
|
|
|
|
country1 = "US"
|
|
|
|
country2 = "US"
|
|
|
|
|
|
|
|
distance = get_distance(city1, city2, country1, country2)
|
|
|
|
|
|
|
|
if distance is not None:
|
|
|
|
print(f"Distance between {city1} and {city2} is {distance:.2f} km.")
|
|
|
|
else:
|
|
|
|
print("One or both city names were not found.")
|