trackemdown / main.py
nikhilsingh's picture
added core geotagging logic & api
74c43d2
raw
history blame
1.94 kB
"""FastAPI application for the Geotagging Service."""
from fastapi import FastAPI, HTTPException, Query
from .models import GeotagResponse
from .core import fetch_geotags, NoResultsFoundError, GeocodingServiceError, InvalidCoordinatesError
app = FastAPI(
title="Geotagging Service",
description="An API to convert addresses and coordinates to Uber H3 geotags using OSM Nominatim.",
version="1.0.0",
)
@app.get(
"/geotag",
response_model=GeotagResponse,
summary="Get H3 geotag for an address or coordinates",
tags=["Geotagging"],
)
async def get_geotag(
q: str = Query(..., description="The address string or 'latitude,longitude' pair to look up."),
resolution: int = Query(12, ge=0, le=15, description="The H3 resolution (0-15). Default is 12.")
):
"""
This endpoint takes a query string `q` and an H3 `resolution` and returns a list of matching geotags.
- If `q` is a valid "latitude,longitude" string, it's converted directly.
- If `q` is an address, it's sent to the OpenStreetMap Nominatim API for geocoding.
- The resulting coordinates are then converted into H3 cell identifiers (geotags).
"""
try:
results = await fetch_geotags(q, resolution)
return GeotagResponse(
query=q,
resolution=resolution,
results=results,
)
except InvalidCoordinatesError as e:
raise HTTPException(status_code=400, detail=str(e))
except NoResultsFoundError as e:
raise HTTPException(status_code=404, detail=str(e))
except GeocodingServiceError as e:
raise HTTPException(status_code=503, detail=str(e))
except Exception as e:
raise HTTPException(status_code=500, detail=f"An unexpected error occurred: {e}")
@app.get("/", include_in_schema=False)
async def root():
"""Root endpoint for health check."""
return {"status": "ok", "message": "Geotagging Service is running."}