|
|
#pragma once
|
|
|
#include <vector>
|
|
|
#include <string>
|
|
|
#include <map>
|
|
|
#include <fstream>
|
|
|
#include <sstream>
|
|
|
#include <iostream>
|
|
|
#include <limits>
|
|
|
#include <cmath>
|
|
|
#include <algorithm>
|
|
|
#include <stdexcept>
|
|
|
#include "opencv2/core.hpp"
|
|
|
#include "opencv2/imgproc.hpp"
|
|
|
#include "../DrawOperator/nanoflann.hpp"
|
|
|
|
|
|
struct Sample {
|
|
|
double x, y;
|
|
|
int label;
|
|
|
};
|
|
|
|
|
|
struct FaciesConfig {
|
|
|
std::string name; // 相名称
|
|
|
std::string code; // 相代码
|
|
|
COLORREF fillColor; // 填充颜色
|
|
|
COLORREF borderColor; // 边界颜色
|
|
|
double x; // 横坐标
|
|
|
double y; // 纵坐标
|
|
|
int value; // 相值
|
|
|
};
|
|
|
|
|
|
using namespace nanoflann;
|
|
|
|
|
|
struct PointCloud {
|
|
|
std::vector<FaciesConfig> pts;
|
|
|
inline size_t kdtree_get_point_count() const { return pts.size(); }
|
|
|
inline double kdtree_distance(const double* p, const size_t idx, size_t) const {
|
|
|
double dx = p[0] - pts[idx].x;
|
|
|
double dy = p[1] - pts[idx].y;
|
|
|
return dx * dx + dy * dy;
|
|
|
}
|
|
|
inline double kdtree_get_pt(const size_t idx, int dim) const {
|
|
|
return dim == 0 ? pts[idx].x : pts[idx].y;
|
|
|
}
|
|
|
template<class BBOX> bool kdtree_get_bbox(BBOX&) const { return false; }
|
|
|
};
|
|
|
|
|
|
|
|
|
class KEDAlgorithm {
|
|
|
public:
|
|
|
KEDAlgorithm();
|
|
|
~KEDAlgorithm();
|
|
|
|
|
|
//KED生成沉积相网格(初版)
|
|
|
bool KEDMeshAlgorithm(const CString& csvFile, const CString& kevFile,
|
|
|
double grid_interval = 20, double bandwidth = 600, double beta = 0.18, int anchor_radius = 3,
|
|
|
std::function<void(int completed, int total)> progressCallback = nullptr);
|
|
|
|
|
|
/// <summary>
|
|
|
/// IDW
|
|
|
/// </summary>
|
|
|
/// <param name="csvFile"></param>
|
|
|
/// <param name="kevFile"></param>
|
|
|
/// <param name="boundaryFile">边界文件</param>
|
|
|
/// <param name="grid_interval">网格间隔</param>
|
|
|
/// <param name="subblock_count">分块处理数量(默认 4)</param>
|
|
|
/// <param name="idw_neighbors">IDW 邻居数</param>
|
|
|
/// <param name="idw_power">IDW 幂指数(控制距离衰减强度)</param>
|
|
|
/// <param name="use_shepard">是否使用 Shepard 改进型</param>
|
|
|
/// <param name="smooth_boundary">边界处理方式(简化并圆滑)</param>
|
|
|
/// <param name="progressCallback">进度回传</param>
|
|
|
/// <returns></returns>
|
|
|
bool IDWMeshAlgorithm(const CString& csvFile,
|
|
|
const CString& kevFile,
|
|
|
const CString& boundaryFile = _T(""),
|
|
|
double grid_interval = 10,
|
|
|
int subblock_count = 4,
|
|
|
int idw_neighbors = 15,
|
|
|
double idw_power = 3,
|
|
|
bool use_shepard = true,
|
|
|
bool smooth_boundary = true,
|
|
|
bool isFaciesBorder = false,
|
|
|
std::function<void(int completed, int total)> progressCallback = nullptr);
|
|
|
|
|
|
/// <summary>
|
|
|
/// 离散点最近邻分类 + 高斯平滑 + 形态学处理
|
|
|
/// </summary>
|
|
|
/// <param name="csvFile"></param>
|
|
|
/// <param name="kevFile"></param>
|
|
|
/// <param name="boundaryFile">边界文件</param>
|
|
|
/// <param name="grid_interval">网格间隔</param>
|
|
|
/// <param name="sigma">高斯平滑半径</param>
|
|
|
/// <param name="open_iter">开运算迭代次数</param>
|
|
|
/// <param name="close_iter">闭运算迭代次数</param>
|
|
|
/// <param name="progressCallback">进度回传</param>
|
|
|
/// <returns></returns>
|
|
|
bool NNMeshAlgorithm(const CString& csvFile,
|
|
|
const CString& kevFile,
|
|
|
const CString& boundaryFile = _T(""),
|
|
|
double grid_interval = 20.0,
|
|
|
double sigma = 5.0,
|
|
|
int open_iter = 1,
|
|
|
int close_iter = 1,
|
|
|
bool isFaciesBorder = false,
|
|
|
std::function<void(int completed, int total)> progressCallback = nullptr);
|
|
|
|
|
|
void StopTask();
|
|
|
|
|
|
std::unordered_map<std::string, int> GetDepositionalMap();
|
|
|
bool isCancelRequested() const { return m_cancelRequested.load(); }
|
|
|
|
|
|
//由grd文件生成相界
|
|
|
bool ProcessExistingGrd(
|
|
|
const CString& grdFile, // 已存在的 GRD 文件
|
|
|
const CString& kevFile, // 输出 KEV 文件
|
|
|
CColorBase base,
|
|
|
bool isFaciesBorder,
|
|
|
std::function<void(int completed, int total)> progressCallback = nullptr);
|
|
|
|
|
|
private:
|
|
|
// 新增:加载配置文件并初始化颜色表
|
|
|
std::vector<FaciesConfig> LoadFaciesSettings(const CString& settingsFile,
|
|
|
std::map<std::string, int>& labelMap);
|
|
|
|
|
|
std::vector<Sample> ReadSamplesCSV(const CString& csvFile,
|
|
|
std::map<std::string, int>& labelMap);
|
|
|
|
|
|
double KdeLogDensityBrute(const std::vector<FaciesConfig>& samples,
|
|
|
int label, double qx, double qy,
|
|
|
double bandwidth) const;
|
|
|
|
|
|
bool WriteDSAAFromGrid(const std::string& output_grd,
|
|
|
const std::vector<float>& grid_data,
|
|
|
int nx, int ny,
|
|
|
double minx, double maxx,
|
|
|
double miny, double maxy);
|
|
|
|
|
|
bool GrdToKEVFile(const CString &gridFile, const CString &outputFile, std::vector<CCurve*> pCurves, CColorBase &base);
|
|
|
|
|
|
//添加相界线
|
|
|
bool CreateFaciesLines(std::shared_ptr<CXy> pXy, std::vector<CCurve*> pCurves);
|
|
|
//添加相界线
|
|
|
void AddFaciesCurves(std::shared_ptr<CXy> pXy, std::vector<CCurve*> pCurves, CString layerName);
|
|
|
|
|
|
void PostProcessFaciesBoundaries(
|
|
|
std::vector<CCurve*>& pCurves,
|
|
|
double sigma_smooth,
|
|
|
int min_seg_cells,
|
|
|
double drop_closed_thresh,
|
|
|
double dx, double dy);
|
|
|
|
|
|
// 获取边界线/边框
|
|
|
std::vector<CCurveEx*> GetDFDBorder(const CString& path);
|
|
|
|
|
|
bool IsPointInPolygon(double qx, double qy, const std::vector<CCurveEx*>& polygons);
|
|
|
|
|
|
//带边界极值处理
|
|
|
bool WriteDSAAFromGridKeepZRange(
|
|
|
const std::string& output_grd,
|
|
|
const std::vector<float>& grid_data,
|
|
|
int nx, int ny,
|
|
|
double minx, double maxx,
|
|
|
double miny, double maxy,
|
|
|
float zmin, float zmax);
|
|
|
|
|
|
private:
|
|
|
std::unordered_map<std::string, int> m_DepositionalMap; //沉积相 对应z值关系
|
|
|
std::map<int, COLORREF> m_ColorList;
|
|
|
std::atomic<bool> m_cancelRequested{ false };
|
|
|
};
|