mirror of
https://github.com/maplibre/martin.git
synced 2024-12-18 12:21:56 +03:00
chore: migrate to TileJSON v0.3 (#330) (h/t @nyurik)
* use `tilejson!` to generate json object * use `Bounds` everywhere when appropriate
This commit is contained in:
parent
d0655fd2b3
commit
66876d5254
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,6 +1,7 @@
|
||||
.DS_Store
|
||||
/target/
|
||||
**/*.rs.bk
|
||||
.idea/
|
||||
|
||||
pg_data/
|
||||
config.yml
|
||||
config.yml
|
||||
|
148
Cargo.lock
generated
148
Cargo.lock
generated
@ -612,7 +612,7 @@ dependencies = [
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
"tinytemplate",
|
||||
"tokio 1.18.1",
|
||||
"tokio 1.18.2",
|
||||
"walkdir",
|
||||
]
|
||||
|
||||
@ -1085,7 +1085,7 @@ checksum = "ff8670570af52249509a86f5e3e18a08c60b177071826898fde8997cf5f6bfbb"
|
||||
dependencies = [
|
||||
"bytes 1.1.0",
|
||||
"fnv",
|
||||
"itoa 1.0.1",
|
||||
"itoa 1.0.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1168,9 +1168,9 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
|
||||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "1.0.1"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35"
|
||||
checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d"
|
||||
|
||||
[[package]]
|
||||
name = "js-sys"
|
||||
@ -1205,9 +1205,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.125"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b"
|
||||
checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836"
|
||||
|
||||
[[package]]
|
||||
name = "linked-hash-map"
|
||||
@ -1343,7 +1343,7 @@ dependencies = [
|
||||
"kernel32-sys",
|
||||
"libc",
|
||||
"log",
|
||||
"miow 0.2.2",
|
||||
"miow",
|
||||
"net2",
|
||||
"slab",
|
||||
"winapi 0.2.8",
|
||||
@ -1351,16 +1351,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "mio"
|
||||
version = "0.8.2"
|
||||
version = "0.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "52da4364ffb0e4fe33a9841a98a3f3014fb964045ce4f7a45a398243c8d6b0c9"
|
||||
checksum = "713d550d9b44d89174e066b7a6217ae06234c10cb47819a88290d2b353c31799"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"log",
|
||||
"miow 0.3.7",
|
||||
"ntapi",
|
||||
"wasi 0.11.0+wasi-snapshot-preview1",
|
||||
"winapi 0.3.9",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1386,15 +1384,6 @@ dependencies = [
|
||||
"ws2_32-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "miow"
|
||||
version = "0.3.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21"
|
||||
dependencies = [
|
||||
"winapi 0.3.9",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "net2"
|
||||
version = "0.2.37"
|
||||
@ -1406,15 +1395,6 @@ dependencies = [
|
||||
"winapi 0.3.9",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ntapi"
|
||||
version = "0.3.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f"
|
||||
dependencies = [
|
||||
"winapi 0.3.9",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-traits"
|
||||
version = "0.2.15"
|
||||
@ -1436,9 +1416,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.10.0"
|
||||
version = "1.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9"
|
||||
checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225"
|
||||
|
||||
[[package]]
|
||||
name = "oorandom"
|
||||
@ -1676,7 +1656,7 @@ dependencies = [
|
||||
"fallible-iterator",
|
||||
"futures",
|
||||
"log",
|
||||
"tokio 1.18.1",
|
||||
"tokio 1.18.2",
|
||||
"tokio-postgres",
|
||||
]
|
||||
|
||||
@ -1688,7 +1668,7 @@ checksum = "1de0ea6504e07ca78355a6fb88ad0f36cafe9e696cbc6717f16a207f3a60be72"
|
||||
dependencies = [
|
||||
"futures",
|
||||
"openssl",
|
||||
"tokio 1.18.1",
|
||||
"tokio 1.18.2",
|
||||
"tokio-openssl",
|
||||
"tokio-postgres",
|
||||
]
|
||||
@ -1740,11 +1720,11 @@ checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.37"
|
||||
version = "1.0.39"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1"
|
||||
checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f"
|
||||
dependencies = [
|
||||
"unicode-xid",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1856,9 +1836,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rayon"
|
||||
version = "1.5.2"
|
||||
version = "1.5.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fd249e82c21598a9a426a4e00dd7adc1d640b22445ec8545feef801d1a74c221"
|
||||
checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"crossbeam-deque",
|
||||
@ -1868,9 +1848,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rayon-core"
|
||||
version = "1.9.2"
|
||||
version = "1.9.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9f51245e1e62e1f1629cbfec37b5793bbabcaeb90f30e94d2ba03564687353e4"
|
||||
checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f"
|
||||
dependencies = [
|
||||
"crossbeam-channel 0.5.4",
|
||||
"crossbeam-deque",
|
||||
@ -1889,9 +1869,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.5.5"
|
||||
version = "1.5.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286"
|
||||
checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@ -1906,9 +1886,9 @@ checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.6.25"
|
||||
version = "0.6.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
|
||||
checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64"
|
||||
|
||||
[[package]]
|
||||
name = "resolv-conf"
|
||||
@ -1940,9 +1920,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.9"
|
||||
version = "1.0.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f"
|
||||
checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695"
|
||||
|
||||
[[package]]
|
||||
name = "same-file"
|
||||
@ -2021,15 +2001,36 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.80"
|
||||
version = "1.0.81"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f972498cf015f7c0746cac89ebe1d6ef10c293b94175a243a2d9442c163d9944"
|
||||
checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c"
|
||||
dependencies = [
|
||||
"itoa 1.0.1",
|
||||
"itoa 1.0.2",
|
||||
"ryu",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_tuple"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f4f025b91216f15a2a32aa39669329a475733590a015835d1783549a56d09427"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_tuple_macros",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_tuple_macros"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4076151d1a2b688e25aaf236997933c66e18b870d0369f8b248b8ab2be630d7e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_urlencoded"
|
||||
version = "0.7.1"
|
||||
@ -2037,16 +2038,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
|
||||
dependencies = [
|
||||
"form_urlencoded",
|
||||
"itoa 1.0.1",
|
||||
"itoa 1.0.2",
|
||||
"ryu",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_yaml"
|
||||
version = "0.8.23"
|
||||
version = "0.8.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a4a521f2940385c165a24ee286aa8599633d162077a54bdcae2a6fd5a7bfa7a0"
|
||||
checksum = "707d15895415db6628332b737c838b88c598522e4dc70647e59b72312924aebc"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"ryu",
|
||||
@ -2223,13 +2224,13 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.92"
|
||||
version = "1.0.95"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7ff7c592601f11445996a06f8ad0c27f094a58857c2f89e97974ab9235b92c52"
|
||||
checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-xid",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -2281,12 +2282,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tilejson"
|
||||
version = "0.2.4"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a1b13f37202f3dfa3d0a775b20ccbff170b702b60603480b4fb2b05851cf4e97"
|
||||
checksum = "1eeb0af84b43a1056a3c4768c91174f2daa12aa152853fc70719cd2a4832cb4e"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_tuple",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -2375,14 +2377,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tokio"
|
||||
version = "1.18.1"
|
||||
version = "1.18.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dce653fb475565de9f6fb0614b28bca8df2c430c0cf84bcd9c843f15de5414cc"
|
||||
checksum = "4903bf0427cf68dddd5aa6a93220756f8be0c34fcfa9f5e6191e103e15a31395"
|
||||
dependencies = [
|
||||
"bytes 1.1.0",
|
||||
"libc",
|
||||
"memchr",
|
||||
"mio 0.8.2",
|
||||
"mio 0.8.3",
|
||||
"once_cell",
|
||||
"pin-project-lite 0.2.9",
|
||||
"socket2 0.4.4",
|
||||
@ -2398,7 +2400,7 @@ dependencies = [
|
||||
"futures-util",
|
||||
"openssl",
|
||||
"openssl-sys",
|
||||
"tokio 1.18.1",
|
||||
"tokio 1.18.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -2420,8 +2422,8 @@ dependencies = [
|
||||
"postgres-protocol",
|
||||
"postgres-types",
|
||||
"socket2 0.4.4",
|
||||
"tokio 1.18.1",
|
||||
"tokio-util 0.7.1",
|
||||
"tokio 1.18.2",
|
||||
"tokio-util 0.7.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -2441,15 +2443,15 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tokio-util"
|
||||
version = "0.7.1"
|
||||
version = "0.7.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764"
|
||||
checksum = "f988a1a1adc2fb21f9c12aa96441da33a1728193ae0b95d2be22dbd17fcb4e5c"
|
||||
dependencies = [
|
||||
"bytes 1.1.0",
|
||||
"futures-core",
|
||||
"futures-sink",
|
||||
"pin-project-lite 0.2.9",
|
||||
"tokio 1.18.1",
|
||||
"tokio 1.18.2",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
@ -2547,6 +2549,12 @@ version = "0.3.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-normalization"
|
||||
version = "0.1.19"
|
||||
@ -2562,12 +2570,6 @@ version = "0.1.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04"
|
||||
|
||||
[[package]]
|
||||
name = "url"
|
||||
version = "2.2.2"
|
||||
|
@ -37,7 +37,7 @@ serde = "1.0"
|
||||
serde_derive = "1.0"
|
||||
serde_json = "1.0"
|
||||
serde_yaml = "0.8"
|
||||
tilejson = "0.2"
|
||||
tilejson = "0.3"
|
||||
|
||||
[dev-dependencies.criterion]
|
||||
version = "0.3.4"
|
||||
|
@ -1,7 +1,7 @@
|
||||
use itertools::Itertools;
|
||||
use std::io;
|
||||
|
||||
use tilejson::{TileJSON, TileJSONBuilder};
|
||||
use tilejson::{tilejson, Bounds, TileJSON};
|
||||
|
||||
use crate::db::Connection;
|
||||
use crate::source::{Query, Source, Tile, Xyz};
|
||||
@ -62,18 +62,21 @@ impl CompositeSource {
|
||||
.max()
|
||||
}
|
||||
|
||||
pub fn get_bounds(&self) -> Option<Vec<f32>> {
|
||||
pub fn get_bounds(&self) -> Option<Bounds> {
|
||||
self.table_sources
|
||||
.iter()
|
||||
.filter_map(|table_source| table_source.bounds.as_ref())
|
||||
.map(|bounds| bounds.to_vec())
|
||||
.reduce(|a, b| {
|
||||
vec![
|
||||
if a[0] < b[0] { a[0] } else { b[0] },
|
||||
if a[1] < b[1] { a[1] } else { b[1] },
|
||||
if a[2] > b[2] { a[2] } else { b[2] },
|
||||
if a[3] > b[3] { a[3] } else { b[3] },
|
||||
]
|
||||
.filter_map(|table_source| table_source.bounds)
|
||||
.reduce(|a: Bounds, b: Bounds| -> Bounds {
|
||||
Bounds::new(
|
||||
if a.left < b.left { a.left } else { b.left },
|
||||
if a.bottom < b.bottom {
|
||||
a.bottom
|
||||
} else {
|
||||
b.bottom
|
||||
},
|
||||
if a.right > b.right { a.right } else { b.right },
|
||||
if a.top > b.top { a.top } else { b.top },
|
||||
)
|
||||
})
|
||||
}
|
||||
}
|
||||
@ -84,24 +87,27 @@ impl Source for CompositeSource {
|
||||
}
|
||||
|
||||
fn get_tilejson(&self) -> Result<TileJSON, io::Error> {
|
||||
let mut tilejson_builder = TileJSONBuilder::new();
|
||||
|
||||
tilejson_builder.scheme("xyz");
|
||||
tilejson_builder.name(&self.id);
|
||||
let mut tilejson = tilejson! {
|
||||
tilejson: "2.2.0".to_string(),
|
||||
tiles: vec![], // tile source is required, but not yet known
|
||||
name: self.id.to_string(),
|
||||
};
|
||||
|
||||
if let Some(minzoom) = self.get_minzoom() {
|
||||
tilejson_builder.minzoom(minzoom);
|
||||
tilejson.minzoom = Some(minzoom);
|
||||
};
|
||||
|
||||
if let Some(maxzoom) = self.get_maxzoom() {
|
||||
tilejson_builder.maxzoom(maxzoom);
|
||||
tilejson.maxzoom = Some(maxzoom);
|
||||
};
|
||||
|
||||
if let Some(bounds) = self.get_bounds() {
|
||||
tilejson_builder.bounds(bounds);
|
||||
tilejson.bounds = Some(bounds);
|
||||
};
|
||||
|
||||
Ok(tilejson_builder.finalize())
|
||||
// TODO: consider removing - this is not needed per TileJSON spec
|
||||
tilejson.set_missing_defaults();
|
||||
Ok(tilejson)
|
||||
}
|
||||
|
||||
fn get_tile(
|
||||
|
17
src/dev.rs
17
src/dev.rs
@ -11,6 +11,7 @@ use crate::db_actor::DbActor;
|
||||
use crate::function_source::{FunctionSource, FunctionSources};
|
||||
use crate::server::AppState;
|
||||
use crate::table_source::{TableSource, TableSources};
|
||||
use crate::utils::max_bounds;
|
||||
|
||||
pub fn mock_table_sources(sources: Vec<TableSource>) -> TableSources {
|
||||
let mut table_sources: TableSources = HashMap::new();
|
||||
@ -30,7 +31,7 @@ pub fn mock_default_table_sources() -> TableSources {
|
||||
geometry_column: "geom".to_owned(),
|
||||
minzoom: Some(0),
|
||||
maxzoom: Some(30),
|
||||
bounds: Some(vec![-180.0, -90.0, 180.0, 90.0]),
|
||||
bounds: Some(max_bounds()),
|
||||
srid: 4326,
|
||||
extent: Some(4096),
|
||||
buffer: Some(64),
|
||||
@ -47,7 +48,7 @@ pub fn mock_default_table_sources() -> TableSources {
|
||||
geometry_column: "geom1".to_owned(),
|
||||
minzoom: Some(0),
|
||||
maxzoom: Some(30),
|
||||
bounds: Some(vec![-180.0, -90.0, 180.0, 90.0]),
|
||||
bounds: Some(max_bounds()),
|
||||
srid: 4326,
|
||||
extent: Some(4096),
|
||||
buffer: Some(64),
|
||||
@ -64,7 +65,7 @@ pub fn mock_default_table_sources() -> TableSources {
|
||||
geometry_column: "geom2".to_owned(),
|
||||
minzoom: Some(0),
|
||||
maxzoom: Some(30),
|
||||
bounds: Some(vec![-180.0, -90.0, 180.0, 90.0]),
|
||||
bounds: Some(max_bounds()),
|
||||
srid: 4326,
|
||||
extent: Some(4096),
|
||||
buffer: Some(64),
|
||||
@ -81,7 +82,7 @@ pub fn mock_default_table_sources() -> TableSources {
|
||||
geometry_column: "geom".to_owned(),
|
||||
minzoom: Some(0),
|
||||
maxzoom: Some(30),
|
||||
bounds: Some(vec![-180.0, -90.0, 180.0, 90.0]),
|
||||
bounds: Some(max_bounds()),
|
||||
srid: 4326,
|
||||
extent: Some(4096),
|
||||
buffer: Some(64),
|
||||
@ -98,7 +99,7 @@ pub fn mock_default_table_sources() -> TableSources {
|
||||
geometry_column: "geom".to_owned(),
|
||||
minzoom: Some(0),
|
||||
maxzoom: Some(30),
|
||||
bounds: Some(vec![-180.0, -90.0, 180.0, 90.0]),
|
||||
bounds: Some(max_bounds()),
|
||||
srid: 4326,
|
||||
extent: Some(4096),
|
||||
buffer: Some(64),
|
||||
@ -115,7 +116,7 @@ pub fn mock_default_table_sources() -> TableSources {
|
||||
geometry_column: "geom".to_owned(),
|
||||
minzoom: Some(0),
|
||||
maxzoom: Some(30),
|
||||
bounds: Some(vec![-180.0, -90.0, 180.0, 90.0]),
|
||||
bounds: Some(max_bounds()),
|
||||
srid: 3857,
|
||||
extent: Some(4096),
|
||||
buffer: Some(64),
|
||||
@ -150,7 +151,7 @@ pub fn mock_default_function_sources() -> FunctionSources {
|
||||
function: "function_source".to_owned(),
|
||||
minzoom: Some(0),
|
||||
maxzoom: Some(30),
|
||||
bounds: Some(vec![-180.0, -90.0, 180.0, 90.0]),
|
||||
bounds: Some(max_bounds()),
|
||||
};
|
||||
|
||||
let function_source_query_params = FunctionSource {
|
||||
@ -159,7 +160,7 @@ pub fn mock_default_function_sources() -> FunctionSources {
|
||||
function: "function_source_query_params".to_owned(),
|
||||
minzoom: Some(0),
|
||||
maxzoom: Some(30),
|
||||
bounds: Some(vec![-180.0, -90.0, 180.0, 90.0]),
|
||||
bounds: Some(max_bounds()),
|
||||
};
|
||||
|
||||
mock_function_sources(vec![function_source, function_source_query_params])
|
||||
|
@ -3,7 +3,7 @@ use postgres_protocol::escape::escape_identifier;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::collections::HashMap;
|
||||
use std::io;
|
||||
use tilejson::{TileJSON, TileJSONBuilder};
|
||||
use tilejson::{tilejson, Bounds, TileJSON};
|
||||
|
||||
use crate::db::Connection;
|
||||
use crate::source::{Query, Source, Tile, Xyz};
|
||||
@ -32,7 +32,7 @@ pub struct FunctionSource {
|
||||
// latitude and longitude values, in the order left, bottom, right, top.
|
||||
// Values may be integers or floating point numbers.
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub bounds: Option<Vec<f32>>,
|
||||
pub bounds: Option<Bounds>,
|
||||
}
|
||||
|
||||
pub type FunctionSources = HashMap<String, Box<FunctionSource>>;
|
||||
@ -43,25 +43,27 @@ impl Source for FunctionSource {
|
||||
}
|
||||
|
||||
fn get_tilejson(&self) -> Result<TileJSON, io::Error> {
|
||||
let mut tilejson_builder = TileJSONBuilder::new();
|
||||
|
||||
tilejson_builder.scheme("xyz");
|
||||
tilejson_builder.name(&self.id);
|
||||
tilejson_builder.tiles(vec![]);
|
||||
let mut tilejson = tilejson! {
|
||||
tilejson: "2.2.0".to_string(),
|
||||
tiles: vec![], // tile source is required, but not yet known
|
||||
name: self.id.to_string(),
|
||||
};
|
||||
|
||||
if let Some(minzoom) = &self.minzoom {
|
||||
tilejson_builder.minzoom(*minzoom);
|
||||
tilejson.minzoom = Some(*minzoom);
|
||||
};
|
||||
|
||||
if let Some(maxzoom) = &self.maxzoom {
|
||||
tilejson_builder.maxzoom(*maxzoom);
|
||||
tilejson.maxzoom = Some(*maxzoom);
|
||||
};
|
||||
|
||||
if let Some(bounds) = &self.bounds {
|
||||
tilejson_builder.bounds(bounds.to_vec());
|
||||
tilejson.bounds = Some(*bounds);
|
||||
};
|
||||
|
||||
Ok(tilejson_builder.finalize())
|
||||
// TODO: consider removing - this is not needed per TileJSON spec
|
||||
tilejson.set_missing_defaults();
|
||||
Ok(tilejson)
|
||||
}
|
||||
|
||||
fn get_tile(
|
||||
|
@ -2,7 +2,7 @@ use serde::{Deserialize, Serialize};
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::io;
|
||||
|
||||
use tilejson::{TileJSON, TileJSONBuilder};
|
||||
use tilejson::{tilejson, Bounds, TileJSON};
|
||||
|
||||
use crate::db::Connection;
|
||||
use crate::source::{Query, Source, Tile, Xyz};
|
||||
@ -42,7 +42,7 @@ pub struct TableSource {
|
||||
// latitude and longitude values, in the order left, bottom, right, top.
|
||||
// Values may be integers or floating point numbers.
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub bounds: Option<Vec<f32>>,
|
||||
pub bounds: Option<Bounds>,
|
||||
|
||||
// Tile extent in tile coordinate space
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
@ -129,24 +129,27 @@ impl Source for TableSource {
|
||||
}
|
||||
|
||||
fn get_tilejson(&self) -> Result<TileJSON, io::Error> {
|
||||
let mut tilejson_builder = TileJSONBuilder::new();
|
||||
|
||||
tilejson_builder.scheme("xyz");
|
||||
tilejson_builder.name(&self.id);
|
||||
let mut tilejson = tilejson! {
|
||||
tilejson: "2.2.0".to_string(),
|
||||
tiles: vec![], // tile source is required, but not yet known
|
||||
name: self.id.to_string(),
|
||||
};
|
||||
|
||||
if let Some(minzoom) = &self.minzoom {
|
||||
tilejson_builder.minzoom(*minzoom);
|
||||
tilejson.minzoom = Some(*minzoom);
|
||||
};
|
||||
|
||||
if let Some(maxzoom) = &self.maxzoom {
|
||||
tilejson_builder.maxzoom(*maxzoom);
|
||||
tilejson.maxzoom = Some(*maxzoom);
|
||||
};
|
||||
|
||||
if let Some(bounds) = &self.bounds {
|
||||
tilejson_builder.bounds(bounds.to_vec());
|
||||
tilejson.bounds = Some(*bounds);
|
||||
};
|
||||
|
||||
Ok(tilejson_builder.finalize())
|
||||
// TODO: consider removing - this is not needed per TileJSON spec
|
||||
tilejson.set_missing_defaults();
|
||||
Ok(tilejson)
|
||||
}
|
||||
|
||||
fn get_tile(
|
||||
@ -219,7 +222,7 @@ pub fn get_table_sources(
|
||||
|
||||
let bounds_query = utils::get_source_bounds(&id, srid as u32, &geometry_column);
|
||||
|
||||
let bounds: Option<Vec<f32>> = conn
|
||||
let bounds: Option<Bounds> = conn
|
||||
.query_one(bounds_query.as_str(), &[])
|
||||
.map(|row| row.get("bounds"))
|
||||
.ok()
|
||||
|
19
src/utils.rs
19
src/utils.rs
@ -5,6 +5,7 @@ use actix_web::http;
|
||||
use postgis::{ewkb, LineString, Point, Polygon};
|
||||
use postgres::types::Json;
|
||||
use serde_json::Value;
|
||||
use tilejson::Bounds;
|
||||
|
||||
pub fn prettify_error<E: std::fmt::Display>(message: String) -> impl Fn(E) -> std::io::Error {
|
||||
move |error| std::io::Error::new(std::io::ErrorKind::Other, format!("{message}: {error}"))
|
||||
@ -78,16 +79,16 @@ pub fn get_source_bounds(id: &str, srid: u32, geometry_column: &str) -> String {
|
||||
)
|
||||
}
|
||||
|
||||
pub fn polygon_to_bbox(polygon: ewkb::Polygon) -> Option<Vec<f32>> {
|
||||
pub fn polygon_to_bbox(polygon: ewkb::Polygon) -> Option<Bounds> {
|
||||
polygon.rings().next().and_then(|linestring| {
|
||||
let mut points = linestring.points();
|
||||
if let (Some(bottom_left), Some(top_right)) = (points.next(), points.nth(1)) {
|
||||
Some(vec![
|
||||
bottom_left.x() as f32,
|
||||
bottom_left.y() as f32,
|
||||
top_right.x() as f32,
|
||||
top_right.y() as f32,
|
||||
])
|
||||
Some(Bounds::new(
|
||||
bottom_left.x(),
|
||||
bottom_left.y(),
|
||||
top_right.x(),
|
||||
top_right.y(),
|
||||
))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
@ -101,3 +102,7 @@ pub fn parse_x_rewrite_url(header: &http::HeaderValue) -> Option<String> {
|
||||
.and_then(|header| header.parse::<http::Uri>().ok())
|
||||
.map(|uri| uri.path().trim_end_matches(".json").to_owned())
|
||||
}
|
||||
|
||||
pub fn max_bounds() -> Bounds {
|
||||
Bounds::new(-180.0, -90.0, 180.0, 90.0)
|
||||
}
|
||||
|
@ -9,6 +9,7 @@ use martin::dev;
|
||||
use martin::function_source::{FunctionSource, FunctionSources};
|
||||
use martin::server::router;
|
||||
use martin::table_source::{TableSource, TableSources};
|
||||
use martin::utils::max_bounds;
|
||||
|
||||
fn init() {
|
||||
let _ = env_logger::builder().is_test(true).try_init();
|
||||
@ -56,7 +57,7 @@ async fn test_get_table_source_ok() {
|
||||
table: "table_source".to_owned(),
|
||||
id_column: None,
|
||||
geometry_column: "geom".to_owned(),
|
||||
bounds: Some(vec![-180.0, -90.0, 180.0, 90.0]),
|
||||
bounds: Some(max_bounds()),
|
||||
minzoom: Some(0),
|
||||
maxzoom: Some(30),
|
||||
srid: 4326,
|
||||
@ -99,7 +100,7 @@ async fn test_get_table_source_ok() {
|
||||
);
|
||||
assert_eq!(result.minzoom, Some(0));
|
||||
assert_eq!(result.maxzoom, Some(30));
|
||||
assert_eq!(result.bounds, Some(vec![-180.0, -90.0, 180.0, 90.0]));
|
||||
assert_eq!(result.bounds, Some(max_bounds()));
|
||||
}
|
||||
|
||||
#[actix_rt::test]
|
||||
@ -156,7 +157,7 @@ async fn test_get_table_source_tile_minmax_zoom_ok() {
|
||||
table: "points1".to_owned(),
|
||||
id_column: None,
|
||||
geometry_column: "geom".to_owned(),
|
||||
bounds: Some(vec![-180.0, -90.0, 180.0, 90.0]),
|
||||
bounds: Some(max_bounds()),
|
||||
minzoom: Some(6),
|
||||
maxzoom: Some(12),
|
||||
srid: 4326,
|
||||
@ -173,7 +174,7 @@ async fn test_get_table_source_tile_minmax_zoom_ok() {
|
||||
table: "points2".to_owned(),
|
||||
id_column: None,
|
||||
geometry_column: "geom".to_owned(),
|
||||
bounds: Some(vec![-180.0, -90.0, 180.0, 90.0]),
|
||||
bounds: Some(max_bounds()),
|
||||
minzoom: None,
|
||||
maxzoom: None,
|
||||
srid: 4326,
|
||||
@ -190,7 +191,7 @@ async fn test_get_table_source_tile_minmax_zoom_ok() {
|
||||
table: "points3857".to_owned(),
|
||||
id_column: None,
|
||||
geometry_column: "geom".to_owned(),
|
||||
bounds: Some(vec![-180.0, -90.0, 180.0, 90.0]),
|
||||
bounds: Some(max_bounds()),
|
||||
minzoom: Some(6),
|
||||
maxzoom: None,
|
||||
srid: 4326,
|
||||
@ -207,7 +208,7 @@ async fn test_get_table_source_tile_minmax_zoom_ok() {
|
||||
table: "table_source".to_owned(),
|
||||
id_column: None,
|
||||
geometry_column: "geom".to_owned(),
|
||||
bounds: Some(vec![-180.0, -90.0, 180.0, 90.0]),
|
||||
bounds: Some(max_bounds()),
|
||||
minzoom: None,
|
||||
maxzoom: Some(6),
|
||||
srid: 4326,
|
||||
@ -383,7 +384,7 @@ async fn test_get_composite_source_tile_minmax_zoom_ok() {
|
||||
table: "points1".to_owned(),
|
||||
id_column: None,
|
||||
geometry_column: "geom".to_owned(),
|
||||
bounds: Some(vec![-180.0, -90.0, 180.0, 90.0]),
|
||||
bounds: Some(max_bounds()),
|
||||
minzoom: Some(6),
|
||||
maxzoom: Some(13),
|
||||
srid: 4326,
|
||||
@ -400,7 +401,7 @@ async fn test_get_composite_source_tile_minmax_zoom_ok() {
|
||||
table: "points2".to_owned(),
|
||||
id_column: None,
|
||||
geometry_column: "geom".to_owned(),
|
||||
bounds: Some(vec![-180.0, -90.0, 180.0, 90.0]),
|
||||
bounds: Some(max_bounds()),
|
||||
minzoom: Some(13),
|
||||
maxzoom: Some(20),
|
||||
srid: 4326,
|
||||
@ -588,7 +589,7 @@ async fn test_get_function_source_tile_minmax_zoom_ok() {
|
||||
function: "function_source".to_owned(),
|
||||
minzoom: None,
|
||||
maxzoom: None,
|
||||
bounds: Some(vec![-180.0, -90.0, 180.0, 90.0]),
|
||||
bounds: Some(max_bounds()),
|
||||
};
|
||||
|
||||
let function_source2 = FunctionSource {
|
||||
@ -597,7 +598,7 @@ async fn test_get_function_source_tile_minmax_zoom_ok() {
|
||||
function: "function_source".to_owned(),
|
||||
minzoom: Some(6),
|
||||
maxzoom: Some(12),
|
||||
bounds: Some(vec![-180.0, -90.0, 180.0, 90.0]),
|
||||
bounds: Some(max_bounds()),
|
||||
};
|
||||
|
||||
let state = dev::mock_state(
|
||||
|
Loading…
Reference in New Issue
Block a user