map-wikireader / main.py
DebasishDhal99's picture
Add geodistance func as api
f07dae8
raw
history blame
3.44 kB
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse, HTMLResponse
from pydantic import BaseModel, Field
import requests
from geopy.geocoders import Nominatim
import geopy.distance
app = FastAPI()
loc = Nominatim(user_agent="GetLoc")
class Geodistance(BaseModel):
lat1: float = Field(..., ge=-90, le=90)
lon1: float = Field(..., ge=-180, le=180)
lat2: float = Field(..., ge=-90, le=90)
lon2: float = Field(..., ge=-180, le=180)
unit: str = "km"
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # Replace with your frontend domain in prod
allow_credentials=False,
allow_methods=["*"],
allow_headers=["*"],
)
@app.get("/")
def health_check():
return {"status": "ok"}
@app.get("/wiki/{page_name}")
async def get_wiki_page(page_name: str):
response = requests.get(f"https://en.wikipedia.org/api/rest_v1/page/summary/{page_name}", timeout=10)
if response.status_code != 200:
return JSONResponse(
content={"error": "Page not found"},
status_code=404
)
coords = loc.geocode(page_name)
return JSONResponse(
content={
"title": page_name,
"content": f"{response.json().get('extract', 'No content available')}",
"latitude": coords.latitude if coords else None,
"longitude": coords.longitude if coords else None
},
status_code=200
)
@app.get("/wiki/search/{full_page}")
def search_wiki(full_page: str):
response = requests.get(f"https://en.wikipedia.org/wiki/{full_page}", timeout=10)
try:
if response.status_code != 200:
return JSONResponse(
content={"error": "Page not found"},
status_code=404
)
coords = loc.geocode(full_page)
return JSONResponse(
content={
"title": full_page,
"content": str(response.text),
"latitude": coords.latitude if coords else None,
"longitude": coords.longitude if coords else None
},
status_code=200
)
except Exception as e:
return JSONResponse(
content={"error": str(e), 'response': str(response)},
status_code=500
)
@app.post("/geodistance")
def get_geodistance(payload: Geodistance):
lat1, lon1 = payload.lat1, payload.lon1
lat2, lon2 = payload.lat2, payload.lon2
unit = payload.unit
try:
distance_km = geopy.distance.distance((lat1, lon1), (lat2, lon2)).km
if unit == "km":
distance = distance_km
elif unit == "mi":
distance = distance_km * 0.621371
else:
return JSONResponse(
content={"error": "Invalid unit"},
status_code=400
)
except Exception as e:
return JSONResponse(
content={"error": str(e)},
status_code=500
)
return JSONResponse(
content={
"distance": distance,
"unit": unit,
"lat1": lat1,
"lon1": lon1,
"lat2": lat2,
"lon2": lon2
},
status_code=200
)