Attender / utils.py
chualinwei3's picture
Upload 30 files
f742815 verified
Raw
History Blame Contribute Delete
2.35 kB
import base64
import numpy as np
from PIL import Image
import io
from math import radians, cos, sin, asin, sqrt
def base64_to_image(base64_string):
"""Convert base64 string to PIL Image"""
try:
# Remove data URL prefix if present
if ',' in base64_string:
base64_string = base64_string.split(',')[1]
# Decode base64
image_data = base64.b64decode(base64_string)
image = Image.open(io.BytesIO(image_data))
# Convert to RGB if necessary
if image.mode != 'RGB':
image = image.convert('RGB')
return image
except Exception as e:
raise ValueError(f"Failed to decode base64 image: {str(e)}")
def image_to_numpy(image):
"""Convert PIL Image to numpy array"""
return np.array(image)
def haversine_distance(lat1, lon1, lat2, lon2):
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
Returns distance in meters
"""
# Convert decimal degrees to radians
lat1, lon1, lat2, lon2 = map(radians, [lat1, lon1, lat2, lon2])
# Haversine formula
dlat = lat2 - lat1
dlon = lon2 - lon1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
# Radius of earth in meters
r = 6371000
return c * r
def format_error_response(message, code=400):
"""Format error response"""
return {
'success': False,
'error': message
}, code
def format_success_response(data=None, message=None):
"""Format success response"""
response = {'success': True}
if message:
response['message'] = message
if data:
response['data'] = data
return response, 200
def validate_coordinates(latitude, longitude):
"""Validate GPS coordinates"""
try:
lat = float(latitude)
lon = float(longitude)
if not (-90 <= lat <= 90):
return False, "Latitude must be between -90 and 90"
if not (-180 <= lon <= 180):
return False, "Longitude must be between -180 and 180"
return True, None
except (ValueError, TypeError):
return False, "Invalid coordinate format"