Files
luce/2025_04_08/main.py
T
2026-06-19 11:15:39 +02:00

130 lines
4.9 KiB
Python

import pandas as pd
import geopandas as gpd
import os
import pyproj
import matplotlib.pyplot as plt
from shapely.geometry import Point
def project_shp(L, wgs84_to_l93, l93_to_wgs84):
i = 0
while i < len(df):
if not df.loc[i, "has_gps"]:
start = i - 1
while i < len(df) and not df.loc[i, "has_gps"]:
i += 1
end = i
true_end = None
for j in range(end, min(end + 2000, len(df))):
if df.loc[j, "has_gps"] and df.loc[j, "Distance_entre_points_m"] > 0:
true_end = j
break
if true_end:
x_l93, y_l93 = wgs84_to_l93.transform(df.loc[start, "Longitude_WGS"],df.loc[start, "Latitude_WGS"])
P_start = Point(x_l93, y_l93, )
dist_start = L.project(P_start)
x_l93, y_l93 = wgs84_to_l93.transform(df.loc[true_end, "Longitude_WGS"],df.loc[true_end, "Latitude_WGS"])
P_end = Point(x_l93, y_l93)
dist_end = L.project(P_end)
n = true_end - start - 1
if n > 0:
step = (dist_end - dist_start) / (n + 1)
idx = start
# dist_temp_cumul = dist_start
for k in range(1, n + 1):
# dist_temp_cumul += step
# df.at[idx, "Distance_cumulee_corrigee"] = dist_temp_cumul
try:
x_l93, y_l93 = wgs84_to_l93.transform(df.loc[idx, "Longitude_WGS"],df.loc[idx, "Latitude_WGS"])
point = Point(x_l93, y_l93)
actual_distance = L.project(point)
projected_point = L.interpolate(actual_distance + step)
x_wgs, y_wgs = l93_to_wgs84.transform(projected_point.x, projected_point.y)
df.at[idx + 1, "Latitude_WGS"] = y_wgs
df.at[idx + 1, "Longitude_WGS"] = x_wgs
except:
continue
idx += 1
i += 1
def calcul_distance_cumulee(L, wgs84_to_l93, l93_to_wgs84):
x_l93, y_l93 = wgs84_to_l93.transform(df.loc[0, "Longitude_WGS"],df.loc[0, "Latitude_WGS"])
df.at[0, "Longitude_Lambert"] = x_l93
df.at[0, "Latitude_Lambert"] = y_l93
df.at[0, "Distance_Cele"] = L.project(Point(x_l93, y_l93))
df.at[0, "Distance_Cumulee"] = 0.0
for i in range(1, len(df)):
x_l93, y_l93 = wgs84_to_l93.transform(df.loc[i, "Longitude_WGS"],df.loc[i, "Latitude_WGS"])
current_point = Point(x_l93, y_l93)
df.at[i, "Longitude_Lambert"] = x_l93
df.at[i, "Latitude_Lambert"] = y_l93
previous_point = Point(wgs84_to_l93.transform(df.loc[i-1, "Longitude_WGS"],df.loc[i-1, "Latitude_WGS"]))
d1 = L.project(previous_point)
d2 = L.project(current_point)
dist = d2 - d1
df.at[i, "Distance_Cumulee"] = df.at[i-1, "Distance_Cumulee"] + dist
# === PARAMÈTRES ===
in_path = None # TODO
csv_file = "input.csv"
shapefile_name = "célé.shp"
# === 1. Chargement des données
df = pd.read_csv(os.path.join(in_path, csv_file), sep=";")
riv_line = gpd.read_file(os.path.join(in_path, shapefile_name)).to_crs(epsg=2154)
wgs84_to_l93 = pyproj.Transformer.from_crs("EPSG:4326", "EPSG:2154", always_xy=True)
l93_to_wgs84 = pyproj.Transformer.from_crs("EPSG:2154", "EPSG:4326", always_xy=True)
# === 2. Colonnes de travail
df["has_gps"] = df["Longitude_WGS"].notna() & df["Latitude_WGS"].notna()
df["Distance_Cele"] = 0.0
# === 3. Calcul des distances entre points
project_shp(riv_line, wgs84_to_l93, l93_to_wgs84)
calcul_distance_cumulee(riv_line, wgs84_to_l93, l93_to_wgs84)
# Nettoyage
df.drop(columns=["has_gps"], inplace=True)
df.drop(columns=["Distance_entre_points_m"], inplace=True)
df.drop(columns=["Distance_Cele"], inplace=True)
# === 4. Export final
out_path = None # TODO
out_name = "output.csv"
df.to_csv(os.path.join(out_path, out_name), sep=";", index=False, encoding="utf-8")
print("✅ Fichier exporté :", out_name)
# === 5. Visualisation rapide
valid_coords = df[df["Latitude_WGS"].notna() & df["Longitude_WGS"].notna()].copy()
valid_coords["geometry"] = [Point(xy) for xy in zip(valid_coords["Longitude_WGS"], valid_coords["Latitude_WGS"])]
gdf_corr = gpd.GeoDataFrame(valid_coords, geometry="geometry", crs="EPSG:4326")
fig, ax = plt.subplots(figsize=(14, 7))
gdf_corr.plot(ax=ax, color="green", markersize=6, label="Points corrigés v2")
riv_line.to_crs(epsg=4326).plot(ax=ax, edgecolor='black', linewidth=1)
ax.set_title("Carte des points GPS corrigés projetés sur le tracé")
ax.set_xlabel("Longitude")
ax.set_ylabel("Latitude")
ax.legend()
plt.grid(True)
plt.tight_layout()
plt.show()