Spaces:
Sleeping
Sleeping
| # planmate/attractions.py | |
| import requests | |
| from typing import List, Dict | |
| from .config import OPENTRIPMAP_API_KEY # Geoapify key stored under this name | |
| GEOAPIFY_BASE = "https://api.geoapify.com/v2/places" | |
| def _get(params: Dict): | |
| params = dict(params or {}) | |
| params["apiKey"] = OPENTRIPMAP_API_KEY # keep the same name | |
| r = requests.get(GEOAPIFY_BASE, params=params, timeout=30) | |
| try: | |
| r.raise_for_status() | |
| except requests.HTTPError as e: | |
| snippet = (r.text or "")[:300] | |
| raise RuntimeError(f"Geoapify error {r.status_code}: {snippet}") from e | |
| return r.json() | |
| def get_poi_radius(lat: float, lon: float, radius=7000, categories="tourism.sights", limit=50) -> List[Dict]: | |
| return _get( | |
| { | |
| "categories": categories, | |
| "filter": f"circle:{lon},{lat},{radius}", | |
| "limit": limit | |
| } | |
| ).get("features", []) | |
| def enrich_pois(pois: List[Dict]) -> List[Dict]: | |
| out = [] | |
| for p in pois: | |
| props = p.get("properties", {}) | |
| item = { | |
| "name": props.get("name") or "(Unnamed)", | |
| "dist": props.get("distance"), | |
| "kinds": props.get("categories", ""), | |
| "point": {"lat": props.get("lat"), "lon": props.get("lon")}, | |
| "address": props.get("formatted") | |
| } | |
| out.append(item) | |
| return out | |
| def get_attractions_and_stays(lat: float, lon: float, radius=7000, limit=40): | |
| attractions_categories = "tourism.sights,tourism.museum,historic" | |
| stays_categories = "accommodation.hotel,accommodation.hostel,accommodation.guest_house,accommodation.apartment" | |
| attractions = get_poi_radius(lat, lon, radius, attractions_categories, limit) | |
| stays = get_poi_radius(lat, lon, radius, stays_categories, limit=30) | |
| return { | |
| "attractions": enrich_pois(attractions), | |
| "stays": enrich_pois(stays), | |
| } | |