import re from pyproj import Transformer def _dms_vers_decimal(coord): """Convertit une coordonnée DMS ou décimale en degrés décimaux.""" if isinstance(coord, (int, float)): return float(coord) match = re.match( r"(\d+)[°\s]+(\d+)'(\d+(?:\.\d+)?)\"?([NSEW])", coord.strip(), re.IGNORECASE ) if not match: raise ValueError(f"Coordonnée invalide : {coord}") deg, minute, sec, direction = match.groups() valeur = ( float(deg) + float(minute) / 60 + float(sec) / 3600 ) if direction.upper() in ("S", "W"): valeur *= -1 return valeur def gps_vers_lambert93(latitude, longitude) -> str: """ Convertit des coordonnées GPS (décimal ou DMS) vers Lambert-93. Exemples : gps_vers_lambert93(48.85825, 2.29453) gps_vers_lambert93('48°51\'29.7"N', '2°17\'40.3"E') """ latitude = _dms_vers_decimal(latitude) longitude = _dms_vers_decimal(longitude) transformer = Transformer.from_crs( "EPSG:4326", "EPSG:2154", always_xy=True ) x, y = transformer.transform(longitude, latitude) return f"{round(x / 1000):04d};{round(y / 1000):04d}" def listeLambertCentre(latitude, longitude,kilometre): e, n = map(int, gps_vers_lambert93(latitude, longitude).split(";")) debut_est = e - (kilometre // 2) debut_nord = n + (kilometre // 2) liste = [] for nord in range(debut_nord, debut_nord - kilometre, -1): for est in range(debut_est, debut_est + kilometre): liste.append(f"{est:04d};{nord:04d}") return liste