Soil-Data / prepare_solid_data.py
l1aF2027's picture
add all
35bb22e
import json
import os
from solid_data import SolidData
class ProcessingSolidData:
def __init__(self, input_root="data", output_root="solid_data", data_info=None):
"""
Khởi tạo đối tượng GenSolidData với thông tin thư mục và ánh xạ.
- input_root: Thư mục chứa các tệp ASC (ví dụ: 'data').
- output_root: Thư mục lưu kết quả (ví dụ: 'solid_data').
- data_info: Dictionary chứa filename, name và dtype dữ liệu.
"""
self.input_root = input_root
self.output_root = output_root
# Kiểm tra nếu data_info không được cung cấp, tạo dictionary trống
self.data_info = data_info if data_info else {}
def load_data_info(self, filename="data_info.json"):
"""
Đọc file JSON và trả về dictionary ánh xạ từ filename sang name và dtype.
- filename: Đường dẫn đến file JSON chứa bộ ánh xạ.
"""
with open(filename, "r") as f:
self.data_info = json.load(f)
return self.data_info
def process_asc_files(self):
"""
Duyệt qua tất cả tệp .asc trong input_root, đọc và lưu vào output_root với cấu trúc tương ứng.
"""
# Duyệt qua tất cả thư mục và tệp trong input_root
for root, dirs, files in os.walk(self.input_root):
for file in files:
if file.endswith(".asc"): # Chỉ xử lý tệp .asc
# Đường dẫn đầy đủ của tệp .asc
asc_path = os.path.join(root, file)
# Tên tệp không có đuôi (sẽ dùng làm name và tên thư mục lưu)
file_name = os.path.splitext(file)[0]
# Ánh xạ file_name sang name và dtype nếu có trong dictionary
data_info = self.data_info.get(file_name, {"name": file_name, "dtype": "float", "description": "Unknown"})
name = data_info["name"]
dtype = data_info["dtype"]
description = data_info["description"]
# Đường dẫn tương đối từ input_root
relative_path = os.path.relpath(root, self.input_root)
if relative_path == ".":
output_dir = os.path.join(self.output_root, file_name)
else:
output_dir = os.path.join(self.output_root, relative_path, file_name)
print(f"Đang xử lý: {asc_path} -> {output_dir}")
try:
# Đọc tệp .asc và tạo SolidData với name từ ánh xạ
data = SolidData.read_asc(asc_path, name=name, dtype=dtype, description=description)
try:
data.plot(os.path.join(output_dir, "heatmap.png"))
except Exception as e:
print(f"Lỗi khi xử lý {asc_path}: {str(e)}")
# Lưu ma trận và metadata vào output_dir
data.save_dok_matrix(output_dir)
print(f"Đã lưu thành công: {output_dir}")
except Exception as e:
print(f"Lỗi khi xử lý {asc_path}: {str(e)}")
def generate_data_info_json(self, output_file="data_info.json"):
"""
Tạo file JSON ánh xạ filename sang name và dtype cho tất cả các tệp .asc trong thư mục input_root.
- output_file: Đường dẫn đến file JSON sẽ được tạo.
"""
data_info = {}
# Duyệt qua tất cả tệp .asc trong input_root
for root, dirs, files in os.walk(self.input_root):
for file in files:
if file.endswith(".asc"): # Chỉ xử lý tệp .asc
file_name = os.path.splitext(file)[0]
# Mặc định name và dtype
name = file_name # Dùng file_name làm name mặc định
dtype = "float" # Kiểu dữ liệu mặc định
# Thêm vào dictionary
data_info[file_name] = {"name": name, "dtype": dtype, "description": "Unknown"}
# Lưu dictionary vào file JSON
with open(output_file, "w") as f:
json.dump(data_info, f, indent=4)
print(f"File JSON đã được tạo: {output_file}")
if __name__ == "__main__":
# Khởi tạo đối tượng GenSolidData
input_dir = "./data"
output_dir = "./solid_data"
gen_solid_data = ProcessingSolidData(input_root=input_dir, output_root=output_dir)
# Tạo file JSON chứa ánh xạ từ filename sang name và dtype
# gen_solid_data.generate_data_info_json("data_info.json")
# Đọc bộ ánh xạ từ file JSON
gen_solid_data.load_data_info("data_info.json")
# Gọi phương thức để xử lý các tệp ASC
gen_solid_data.process_asc_files()