final commit
This commit is contained in:
@@ -0,0 +1,129 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user