| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- 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
|