from decimal import Decimal, ROUND_DOWN, InvalidOperation def normalize_coordinate(value, max_digits, decimal_places): """Normalize coordinate to have exactly 6 decimal places""" try: if value is None: return None # Convert to Decimal for precise handling value = Decimal(str(value)) # Round to exactly 6 decimal places value = value.quantize(Decimal('0.000001'), rounding=ROUND_DOWN) return float(value) except (TypeError, ValueError, InvalidOperation): return None def get_english_name(tags): """Extract English name from OSM tags, falling back to default name""" # Try name:en first if 'name:en' in tags: return tags['name:en'] # Then try int_name (international name) if 'int_name' in tags: return tags['int_name'] # Fall back to default name return tags.get('name') def normalize_osm_result(result): """Normalize OpenStreetMap result to use English names and normalized coordinates""" # Normalize coordinates result['lat'] = normalize_coordinate(float(result['lat']), 9, 6) result['lon'] = normalize_coordinate(float(result['lon']), 10, 6) # Get address details address = result.get('address', {}) # Normalize place names to English where possible if 'namedetails' in result: # For main display name result['display_name'] = get_english_name(result['namedetails']) # For address components if 'city' in address and 'city_tags' in result: address['city'] = get_english_name(result['city_tags']) if 'state' in address and 'state_tags' in result: address['state'] = get_english_name(result['state_tags']) if 'country' in address and 'country_tags' in result: address['country'] = get_english_name(result['country_tags']) result['address'] = address return result