PlanMate / planmate /attractions.py
Memoona648's picture
Update planmate/attractions.py
3be9446 verified
raw
history blame
1.88 kB
# 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),
}