rose_des_sables / data /sol_data.py
pasquierjb's picture
first
b20834a
import pandas as pd
import geopandas as gpd
from shapely.geometry import Point
import re
import os
# Assuming __file__ contains the absolute path to the current file
current_dir = os.path.dirname(__file__)
shapefile_path = os.path.join(current_dir, "soil/30169_L93/30169_L93.shp")
stu_path = os.path.join(current_dir,'soil/stu.csv')
smu_path = os.path.join(current_dir,'soil/smu.csv')
stuorg_path = os.path.join(current_dir,'soil/stuorg.csv')
smu_stu_path = os.path.join(current_dir,'soil/attricod.txt')
def read_soil_types(file_path):
soil_types = {}
with open(file_path, 'r') as file:
for line in file:
# Using regular expression to match short name and full name
match = re.match(r'^\s*([A-Za-z]+)\s+(.*)\s*$', line)
if match:
short_name, full_name = match.groups()
soil_types[short_name] = full_name.strip()
return soil_types
def get_full_soil_names(short_names, soil_types):
full_names = []
for short_name in short_names:
full_name = soil_types.get(short_name)
if full_name:
full_names.append(full_name)
return full_names
def get_soil_types(lat, lon):
'SOIL Full 1974 (modified CEC 1985) FAO-Unesco legend soil name.'
gdf = gpd.read_file(shapefile_path)
gdf = gdf.to_crs(4326)
stu = pd.read_csv(stu_path, delimiter=";")
smu = pd.read_csv(smu_path, delimiter=";")
stuorg = pd.read_csv(stuorg_path, delimiter=";")
point = Point(lon, lat)
for idx, row in gdf.iterrows():
if row.geometry.contains(point):
break
smu = row['SMU']
stu_list = stuorg[stuorg["smu"] == smu]['stu'].tolist()
all_stu = stu[stu["stu"].isin(stu_list)]
soiltypes_shortnames = all_stu['soil'].tolist()
soiltypes = read_soil_types(smu_stu_path)
soiltypes_fullnames = get_full_soil_names(soiltypes_shortnames, soiltypes)
return soiltypes_fullnames