use super::PointReductionStrategy;
#[derive(Clone, Debug, Default)]
pub struct FeatureImportArgs {
pub layer_name: Option<String>,
pub min_zoom: Option<u8>,
pub max_zoom: Option<u8>,
pub polygon_simplify_px: Option<f32>,
pub line_simplify_px: Option<f32>,
pub polygon_min_area_px: Option<f32>,
pub line_min_length_px: Option<f32>,
pub point_reduction: Option<PointReductionStrategy>,
pub point_reduction_value: Option<f32>,
}
#[derive(Clone, Debug)]
pub struct FeatureImportConfig {
pub layer_name: String,
pub min_zoom: u8,
pub max_zoom: Option<u8>,
pub polygon_simplify_px: f32,
pub line_simplify_px: f32,
pub polygon_min_area_px: f32,
pub line_min_length_px: f32,
pub point_reduction: PointReductionStrategy,
pub min_distance_px: f32,
pub drop_rate_keep_ratio: f32,
}
impl Default for FeatureImportConfig {
fn default() -> Self {
Self {
layer_name: "features".to_string(),
min_zoom: 0,
max_zoom: None, polygon_simplify_px: 4.0,
line_simplify_px: 4.0,
polygon_min_area_px: 4.0,
line_min_length_px: 4.0,
point_reduction: PointReductionStrategy::MinDistance,
min_distance_px: 16.0,
drop_rate_keep_ratio: 0.5,
}
}
}
impl From<FeatureImportArgs> for FeatureImportConfig {
fn from(args: FeatureImportArgs) -> Self {
let d = Self::default();
let strategy = args.point_reduction.unwrap_or(d.point_reduction);
let (min_distance_px, drop_rate_keep_ratio) = match (strategy, args.point_reduction_value) {
(PointReductionStrategy::MinDistance, Some(v)) => (v, d.drop_rate_keep_ratio),
(PointReductionStrategy::DropRate, Some(v)) => (d.min_distance_px, v),
_ => (d.min_distance_px, d.drop_rate_keep_ratio),
};
Self {
layer_name: args.layer_name.unwrap_or(d.layer_name),
min_zoom: args.min_zoom.unwrap_or(d.min_zoom),
max_zoom: args.max_zoom.or(d.max_zoom),
polygon_simplify_px: args.polygon_simplify_px.unwrap_or(d.polygon_simplify_px),
line_simplify_px: args.line_simplify_px.unwrap_or(d.line_simplify_px),
polygon_min_area_px: args.polygon_min_area_px.unwrap_or(d.polygon_min_area_px),
line_min_length_px: args.line_min_length_px.unwrap_or(d.line_min_length_px),
point_reduction: strategy,
min_distance_px,
drop_rate_keep_ratio,
}
}
}