use serde::{Deserialize, Serialize};
use ts_rs::TS;
#[derive(Clone, Debug, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct PolygonizerOptions {
pub node_input: bool,
pub snap_grid_size: f64,
#[serde(default)]
pub pre_snap_tolerance: f64,
pub extract_only_polygonal: bool,
pub snap_strategy: SnapStrategy,
pub noding: NodingOptions,
pub containment: ContainmentOptions,
pub determinism: DeterminismOptions,
pub diagnostics: DiagnosticsOptions,
pub provenance: ProvenanceOptions,
#[ts(optional)]
pub input_profile_id: Option<String>,
}
impl Default for PolygonizerOptions {
fn default() -> Self {
Self {
node_input: false,
snap_grid_size: 1e-10,
pre_snap_tolerance: 0.0,
extract_only_polygonal: false,
snap_strategy: SnapStrategy::Grid,
noding: NodingOptions::default(),
containment: ContainmentOptions::default(),
determinism: DeterminismOptions::default(),
diagnostics: DiagnosticsOptions::default(),
provenance: ProvenanceOptions::default(),
input_profile_id: None,
}
}
}
impl PolygonizerOptions {
pub fn cfb_robust_v1() -> Self {
Self {
node_input: true,
snap_grid_size: 0.1,
pre_snap_tolerance: 0.5,
extract_only_polygonal: false,
snap_strategy: SnapStrategy::GeosCompat,
noding: NodingOptions {
backend: NodingBackend::Snap,
},
containment: ContainmentOptions {
touch_policy: TouchPolicy::AllowPointTouchDisallowEdgeShare,
},
determinism: DeterminismOptions {
canonical_sort: true,
canonical_ring_rotation: true,
stable_tie_breaks: true,
},
diagnostics: DiagnosticsOptions {
enabled: true,
report_mode: true,
},
provenance: ProvenanceOptions {
enabled: true,
include_boundary_line_ids: true,
},
input_profile_id: Some("cfb_robust_v1".to_string()),
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize, TS)]
#[ts(export)]
pub enum SnapStrategy {
Grid,
GeosCompat,
}
#[derive(Clone, Debug, Serialize, Deserialize, TS)]
#[ts(export)]
pub enum TouchPolicy {
AllowPointTouchDisallowEdgeShare,
TreatAnyTouchAsDisjoint,
AllowEdgeShare,
}
#[derive(Clone, Debug, Serialize, Deserialize, TS)]
#[ts(export)]
pub enum TileOwnershipPolicy {
Centroid,
RepresentativePointInsidePolygon,
LexicographicMinVertex,
CanonicalBoundaryHash,
}
#[derive(Clone, Debug, Serialize, Deserialize, TS)]
#[ts(export)]
pub enum NodingBackend {
Snap,
Advanced,
}
#[derive(Clone, Debug, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct NodingOptions {
pub backend: NodingBackend,
}
impl Default for NodingOptions {
fn default() -> Self {
Self {
backend: NodingBackend::Snap,
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct ContainmentOptions {
pub touch_policy: TouchPolicy,
}
impl Default for ContainmentOptions {
fn default() -> Self {
Self {
touch_policy: TouchPolicy::AllowPointTouchDisallowEdgeShare,
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct DeterminismOptions {
pub canonical_sort: bool,
pub canonical_ring_rotation: bool,
pub stable_tie_breaks: bool,
}
impl Default for DeterminismOptions {
fn default() -> Self {
Self {
canonical_sort: true,
canonical_ring_rotation: true,
stable_tie_breaks: true,
}
}
}
#[derive(Clone, Debug, Default, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct DiagnosticsOptions {
pub enabled: bool,
pub report_mode: bool,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize, TS)]
#[ts(export)]
pub struct ProvenanceOptions {
pub enabled: bool,
pub include_boundary_line_ids: bool,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize, TS)]
#[ts(export)]
pub enum DedupPolicy {
#[default]
KeepAll,
CanonicalRingHash,
}