Skip to content

Feat: Display local place name using image GPS (geocodes) in Memories section #1195

@codex-yv

Description

@codex-yv

Describe the feature

Description

In the Memories section, location-type memories currently display plain geocodes when the image coordinates are not near any of the predefined popular places listed in CITY_COORDINATES within memory_clustering.py.

Instead of showing raw latitude/longitude values, the application can display the nearest local place name (city/town/village) derived from the image’s geocodes.

If the distance to the nearest locality exceeds a configurable threshold (default: 4.0 km), only the state name should be displayed rather than plain geocodes.

Current Problem

  • When image geocodes do not match nearby entries in CITY_COORDINATES, the UI displays raw latitude/longitude values.
  • Plain geocodes are not user-friendly and reduce the overall UX quality.
  • Users cannot easily interpret the actual location represented by the coordinates.

Expected Feature

  • Determine the nearest locality (city/town/village) using reverse geocoding.
  • Display the local place name instead of plain geocodes.
  • If the nearest locality is farther than the threshold distance (default: 4.0 km):
    • Display only the state name.
    • Avoid showing raw coordinates.
  • Determination of nearest locality using reverse geocoding should be offline.

Implementation

Backend

  • Added GeoCodes.db file. It contains tables for all States and Union Territories, with approximately 500 cities/towns/villages per state. (Currently India)
    -The database also includes a classifier table used to determine which state should be searched for a given set of geocodes. (Example: For provided coordinates, the classifier predicts the most probable state where the location belongs.)

    • Table Columns:
      • states: place | latitude | Longitude
      • classifier: state | latitude | Longitude
  • Implemented the Haversine formula to compute distances and identify the nearest locality (city/town/village) within the predicted state

  • Updated return values of function _reverse_geocode in memories_clustering.py as:

def _reverse_geocode(self, lat: float, lon: float) -> Optional[str]: # added optional return 
    """Find nearest city within 50km"""
    for city_name, (city_lat, city_lon) in self.CITY_COORDINATES.items():
        distance = haversine_distance(lat, lon, city_lat, city_lon)
        if distance < 50:
            return city_name, True # True -> because city name found
    return f"{lat:.4f}°, {lon:.4f}°", False # False -> because of formatted coordinates
  • Updated return value in function _create_simple_memory in memories_clustering.py as:
# Get actual location name using reverse geocoding
location_name, status = self._reverse_geocode(center_lat, center_lon) # status is true if nearest tourist place (actual location) is found 
if not status: 
    # getting place name if no nearest tourist place found
    place = get_location_by_geocode(latitude=center_lat, longitude=center_lon, offset=4.0)
else:
    place = None

return {
    "memory_id": memory_id,
    "title": title,
    "description": f"{len(images)} photos",
    "location_name": location_name,
    "place":place, # added key value pair for place
    "date_start": date_start,
    "date_end": date_end,
    "image_count": len(images),
    "images": sorted_images,
    "thumbnail_image_id": sorted_images[0].get("id", ""),
    "center_lat": center_lat,
    "center_lon": center_lon,
    "type": memory_type, 
}
  • Updated Memory Schemas in routes/memories.py for new key.

  • added !GeoCodes.db in .gitignore

Frontend

  • Modified memories.ts to include the place: string | null field in the Memory interface
place: string | null;
  • Updated MemoryCard Component:
    • Added logic in Memories/MemoryCard.tsx, to override the displayTitle with the value of place if it is available.
    // If "place" is provided (from backend), use it as the main title
    if (memory.place) {
        displayTitle = memory.place;
    }
  • Updated MemoryDetail Component:
    • Updated the tempMemory object for the "On This Day" feature to include the place field.
    • Synchronized the displayTitle logic in MemoryDetail.tsx with MemoryCard.tsx to ensure consistency between the list view and the detail view.

Add ScreenShots

Screenshots

Before

Image

Image

After

Image

Image

Record

  • I agree to follow this project's Code of Conduct
  • I want to work on this issue

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions