Skip to main content

dioxus_maplibre/options/
sources.rs

1//! Source option models.
2
3use serde::{Deserialize, Serialize};
4/// Options for adding a GeoJSON source
5#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
6#[serde(rename_all = "camelCase")]
7pub struct GeoJsonSourceOptions {
8    /// GeoJSON data (FeatureCollection, Feature, or Geometry)
9    pub data: serde_json::Value,
10
11    /// Enable clustering
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub cluster: Option<bool>,
14
15    /// Radius of each cluster (in pixels, default 50)
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub cluster_radius: Option<u32>,
18
19    /// Max zoom level to cluster points (default 14)
20    #[serde(skip_serializing_if = "Option::is_none")]
21    pub cluster_max_zoom: Option<u32>,
22
23    /// Custom cluster properties (MapLibre expression format)
24    #[serde(skip_serializing_if = "Option::is_none")]
25    pub cluster_properties: Option<serde_json::Value>,
26
27    /// Automatically assign numeric IDs to features
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub generate_id: Option<bool>,
30
31    /// Property to use as feature ID
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub promote_id: Option<String>,
34}
35
36/// Options for adding a vector tile source
37#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
38#[serde(rename_all = "camelCase")]
39pub struct VectorSourceOptions {
40    /// TileJSON URL
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub url: Option<String>,
43
44    /// Array of tile URL templates
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub tiles: Option<Vec<String>>,
47
48    /// Minimum zoom level (default 0)
49    #[serde(skip_serializing_if = "Option::is_none")]
50    pub min_zoom: Option<u32>,
51
52    /// Maximum zoom level (default 22)
53    #[serde(skip_serializing_if = "Option::is_none")]
54    pub max_zoom: Option<u32>,
55
56    /// Geographic bounds [sw_lng, sw_lat, ne_lng, ne_lat]
57    #[serde(skip_serializing_if = "Option::is_none")]
58    pub bounds: Option<[f64; 4]>,
59
60    /// Attribution HTML string
61    #[serde(skip_serializing_if = "Option::is_none")]
62    pub attribution: Option<String>,
63}
64
65/// Options for adding a raster tile source
66#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
67#[serde(rename_all = "camelCase")]
68pub struct RasterSourceOptions {
69    /// TileJSON URL
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub url: Option<String>,
72
73    /// Array of tile URL templates
74    #[serde(skip_serializing_if = "Option::is_none")]
75    pub tiles: Option<Vec<String>>,
76
77    /// Tile size in pixels (default 512)
78    #[serde(skip_serializing_if = "Option::is_none")]
79    pub tile_size: Option<u32>,
80
81    /// Minimum zoom level
82    #[serde(skip_serializing_if = "Option::is_none")]
83    pub min_zoom: Option<u32>,
84
85    /// Maximum zoom level
86    #[serde(skip_serializing_if = "Option::is_none")]
87    pub max_zoom: Option<u32>,
88}
89
90/// Options for adding a raster DEM source (for terrain)
91#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
92#[serde(rename_all = "camelCase")]
93pub struct RasterDemSourceOptions {
94    /// TileJSON URL
95    #[serde(skip_serializing_if = "Option::is_none")]
96    pub url: Option<String>,
97
98    /// Array of tile URL templates
99    #[serde(skip_serializing_if = "Option::is_none")]
100    pub tiles: Option<Vec<String>>,
101
102    /// Tile size in pixels (default 512)
103    #[serde(skip_serializing_if = "Option::is_none")]
104    pub tile_size: Option<u32>,
105
106    /// Encoding type: "mapbox" or "terrarium"
107    #[serde(skip_serializing_if = "Option::is_none")]
108    pub encoding: Option<String>,
109}
110
111/// Options for adding an image source
112#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
113#[serde(rename_all = "camelCase")]
114pub struct ImageSourceOptions {
115    /// Image URL
116    pub url: String,
117
118    /// Four corner coordinates as `[[lng, lat], [lng, lat], [lng, lat], [lng, lat]]`
119    /// Order: top-left, top-right, bottom-right, bottom-left
120    pub coordinates: [[f64; 2]; 4],
121}