| import pandas as pd |
| import geopandas as gpd |
| from shapely.geometry import Point |
| import re |
| import os |
|
|
| |
| 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: |
| |
| 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 |
|
|