Spaces:
Runtime error
Runtime error
import math | |
import httpx | |
def generate_circle_centers(center_lat, center_lon, radius_km, small_radius_km=10): | |
""" | |
Generate a list of centers of small circles (radius=10km) needed to cover a larger circle. | |
Circles are arranged in hexagonal pattern to minimize # of small circles. | |
No overlapping among small circles, but some small circles may be outside the larger circle. | |
Input: | |
- center_lat: Latitude of the center of the larger circle | |
- center_lon: Longitude of the center of the larger circle | |
- radius_km: Radius of the larger circle in kilometers | |
- small_radius_km: Radius of the smaller circles in kilometers (default 10km, more than that wiki api cannot accomodate) | |
Output: | |
- A list of tuples, each containing the latitude and longitude of a small circle's center. [(lat1, lon1), (lat2, lon2),...] | |
""" | |
R = 6371 # Earth radius | |
dx = 2 * small_radius_km | |
dy = math.sqrt(3) * small_radius_km | |
max_dist = radius_km + small_radius_km | |
results = [] | |
lat_rad = math.radians(center_lat) | |
n_y = int(max_dist // dy) + 2 | |
for row in range(-n_y, n_y + 1): | |
y = row * dy | |
offset = 0 if row % 2 == 0 else dx / 2 | |
n_x = int((max_dist + dx) // dx) + 2 | |
for col in range(-n_x, n_x + 1): | |
x = col * dx + offset | |
distance = math.sqrt(x ** 2 + y ** 2) | |
if distance <= max_dist: | |
delta_lat = (y / R) * (180 / math.pi) | |
delta_lon = (x / (R * math.cos(lat_rad))) * (180 / math.pi) | |
lat = center_lat + delta_lat | |
lon = center_lon + delta_lon | |
results.append((lat, lon)) | |
return results | |
async def fetch_url(client: httpx.AsyncClient, url: str): | |
""" | |
Fetch a URL asynchronously using httpx and return the response status and data. | |
This function is asynchrounously used to fetch multiple URLs in parallel when search radius > 10km. | |
Input: | |
- client: httpx.AsyncClient instance | |
- url: URL to fetch | |
Output: | |
- A dictionary with the URL, status code, and data if available. | |
- Data includes the JSON format of wiki geosearch response. | |
If an error occurs, return a dictionary with the URL and the error message. | |
""" | |
try: | |
response = await client.get(url, timeout=10.0) | |
return { | |
"url": url, | |
"status": response.status_code, | |
"data": response.json() if response.status_code == 200 else None, | |
} | |
except Exception as e: | |
return {"url": url, "error": str(e)} |