mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 07:11:08 -05:00
56 lines
1.9 KiB
Python
56 lines
1.9 KiB
Python
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
|