GPS.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import re
  2. from pyproj import Transformer
  3. def _dms_vers_decimal(coord):
  4. """Convertit une coordonnée DMS ou décimale en degrés décimaux."""
  5. if isinstance(coord, (int, float)):
  6. return float(coord)
  7. match = re.match(
  8. r"(\d+)[°\s]+(\d+)'(\d+(?:\.\d+)?)\"?([NSEW])",
  9. coord.strip(),
  10. re.IGNORECASE
  11. )
  12. if not match:
  13. raise ValueError(f"Coordonnée invalide : {coord}")
  14. deg, minute, sec, direction = match.groups()
  15. valeur = (
  16. float(deg)
  17. + float(minute) / 60
  18. + float(sec) / 3600
  19. )
  20. if direction.upper() in ("S", "W"):
  21. valeur *= -1
  22. return valeur
  23. def gps_vers_lambert93(latitude, longitude) -> str:
  24. """
  25. Convertit des coordonnées GPS (décimal ou DMS) vers Lambert-93.
  26. Exemples :
  27. gps_vers_lambert93(48.85825, 2.29453)
  28. gps_vers_lambert93('48°51\'29.7"N', '2°17\'40.3"E')
  29. """
  30. latitude = _dms_vers_decimal(latitude)
  31. longitude = _dms_vers_decimal(longitude)
  32. transformer = Transformer.from_crs(
  33. "EPSG:4326",
  34. "EPSG:2154",
  35. always_xy=True
  36. )
  37. x, y = transformer.transform(longitude, latitude)
  38. return f"{round(x / 1000):04d};{round(y / 1000):04d}"
  39. def listeLambertCentre(latitude, longitude,kilometre):
  40. e, n = map(int, gps_vers_lambert93(latitude, longitude).split(";"))
  41. debut_est = e - (kilometre // 2)
  42. debut_nord = n + (kilometre // 2)
  43. liste = []
  44. for nord in range(debut_nord, debut_nord - kilometre, -1):
  45. for est in range(debut_est, debut_est + kilometre):
  46. liste.append(f"{est:04d};{nord:04d}")
  47. return liste