diff --git a/Cargo.lock b/Cargo.lock index bb0ca8248..3871abf25 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -80,7 +80,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -198,7 +198,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -267,9 +267,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "android-tzdata" @@ -411,7 +411,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -422,7 +422,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -442,9 +442,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-lc-rs" -version = "1.11.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f47bb8cc16b669d267eeccf585aea077d0882f4777b1c1f740217885d6e6e5a3" +checksum = "f409eb70b561706bf8abba8ca9c112729c481595893fd06a2dd9af8ed8441148" dependencies = [ "aws-lc-sys", "paste", @@ -453,9 +453,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.23.1" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2101df3813227bbaaaa0b04cd61c534c7954b22bd68d399b440be937dc63ff7" +checksum = "8478a5c29ead3f3be14aff8a202ad965cf7da6856860041bfca271becf8ba48b" dependencies = [ "bindgen", "cc", @@ -524,7 +524,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.89", + "syn 2.0.91", "which", ] @@ -592,9 +592,9 @@ dependencies = [ "futures-util", "hex", "home", - "http 1.1.0", + "http 1.2.0", "http-body-util", - "hyper 1.5.1", + "hyper 1.5.2", "hyper-named-pipe", "hyper-rustls", "hyper-util", @@ -696,9 +696,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.20.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" +checksum = "ef657dfab802224e671f5818e9a4935f9b1957ed18e58292690cc39e7a4092a3" [[package]] name = "byteorder" @@ -735,9 +735,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.1" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" +checksum = "c31a0499c1dc64f458ad13872de75c0eb7e3fdb0e67964610c914b034fc5956e" dependencies = [ "jobserver", "libc", @@ -777,9 +777,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", @@ -857,7 +857,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -866,16 +866,6 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" -[[package]] -name = "clap_mangen" -version = "0.2.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbae9cbfdc5d4fa8711c09bd7b83f644cb48281ac35bf97af3e47b0675864bdf" -dependencies = [ - "clap", - "roff", -] - [[package]] name = "cmake" version = "0.1.52" @@ -908,14 +898,14 @@ dependencies = [ [[package]] name = "console" -version = "0.15.8" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" dependencies = [ "encode_unicode", - "lazy_static", "libc", - "windows-sys 0.52.0", + "once_cell", + "windows-sys 0.59.0", ] [[package]] @@ -1058,18 +1048,18 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.13" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -1086,18 +1076,18 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunch" @@ -1128,7 +1118,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -1152,7 +1142,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -1163,7 +1153,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -1236,7 +1226,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -1259,7 +1249,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -1288,7 +1278,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -1325,9 +1315,9 @@ dependencies = [ [[package]] name = "encode_unicode" -version = "0.3.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" @@ -1367,14 +1357,14 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] name = "env_filter" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" dependencies = [ "log", "regex", @@ -1406,7 +1396,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1439,9 +1429,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" dependencies = [ "event-listener 5.3.1", "pin-project-lite", @@ -1467,15 +1457,15 @@ checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" [[package]] name = "fastrand" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fdeflate" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07c6f4c64c1d33a3111c4466f7365ebdcc37c5bd1ea0d62aae2e3d722aacbedb" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" dependencies = [ "simd-adler32", ] @@ -1706,7 +1696,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -1811,7 +1801,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.6.0", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", @@ -1918,11 +1908,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1938,9 +1928,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -1965,7 +1955,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http 1.2.0", ] [[package]] @@ -1976,7 +1966,7 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "pin-project-lite", ] @@ -2001,9 +1991,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.31" +version = "0.14.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" dependencies = [ "bytes", "futures-channel", @@ -2024,14 +2014,14 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "httparse", "httpdate", @@ -2049,7 +2039,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73b7d8abf35697b81a825e386fc151e0d503e8cb5fcb93cc8669c376dfd6f278" dependencies = [ "hex", - "hyper 1.5.1", + "hyper 1.5.2", "hyper-util", "pin-project-lite", "tokio", @@ -2059,13 +2049,13 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.3" +version = "0.27.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" dependencies = [ "futures-util", - "http 1.1.0", - "hyper 1.5.1", + "http 1.2.0", + "hyper 1.5.2", "hyper-util", "rustls", "rustls-native-certs 0.8.1", @@ -2084,9 +2074,9 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", - "hyper 1.5.1", + "hyper 1.5.2", "pin-project-lite", "socket2", "tokio", @@ -2102,7 +2092,7 @@ checksum = "986c5ce3b994526b3cd75578e62554abd09f0899d6206de48b3e96ab34ccc8c7" dependencies = [ "hex", "http-body-util", - "hyper 1.5.1", + "hyper 1.5.2", "hyper-util", "pin-project-lite", "tokio", @@ -2247,7 +2237,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -2302,9 +2292,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -2325,7 +2315,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "232929e1d75fe899576a3d5c7416ad0d88dbfbb3c3d6aa00873a7408a50ddb88" dependencies = [ "ahash", - "indexmap 2.6.0", + "indexmap 2.7.0", "is-terminal", "itoa", "log", @@ -2423,10 +2413,11 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -2488,7 +2479,7 @@ dependencies = [ "bytes", "futures", "http 0.2.12", - "hyper 0.14.31", + "hyper 0.14.32", "lambda_runtime_api_client", "serde", "serde_json", @@ -2505,7 +2496,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7210012be904051520f0dc502140ba599bae3042b65b3737b87727f1aa88a7d6" dependencies = [ "http 0.2.12", - "hyper 0.14.31", + "hyper 0.14.32", "tokio", "tower-service", ] @@ -2533,36 +2524,36 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.166" +version = "0.2.169" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ccc108bbc0b1331bd061864e7cd823c0cab660bbe6970e66e2c0614decde36" +checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" [[package]] name = "libdeflate-sys" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f4ae7b48098016dc3bc64a35605668f0af4425ec1a4a175ce2d0c1129067932" +checksum = "413b667c8a795fcbe6287a75a8ce92b1dae928172c716fe95044cb2ec7877941" dependencies = [ "cc", ] [[package]] name = "libdeflater" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567ff5eb948d34d3f93d8da568e72db0f5a12c89efb6c3913e4d6b142cc7ec34" +checksum = "d78376c917eec0550b9c56c858de50e1b7ebf303116487562e624e63ce51453a" dependencies = [ "libdeflate-sys", ] [[package]] name = "libloading" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -2579,7 +2570,7 @@ checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ "bitflags 2.6.0", "libc", - "redox_syscall 0.5.7", + "redox_syscall 0.5.8", ] [[package]] @@ -2683,6 +2674,7 @@ dependencies = [ "num_cpus", "pbf_font_tools", "pmtiles", + "png", "postgis", "postgres", "postgres-protocol", @@ -2702,6 +2694,7 @@ dependencies = [ "subst", "testcontainers-modules", "thiserror 2.0.9", + "tiff", "tilejson", "tokio", "tokio-postgres-rustls", @@ -2825,9 +2818,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" dependencies = [ "adler2", "simd-adler32", @@ -2835,11 +2828,10 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi 0.3.9", "libc", "log", "wasi", @@ -3018,9 +3010,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.5" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] @@ -3045,22 +3037,19 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "oxipng" -version = "9.1.2" +version = "9.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec25597808aff9f632f018f0fe8985c6f670598ac5241d220a9f2d32ff46812e" +checksum = "aa3202b10a7ffac89508bb091fe420048c47926b37c5ff84d78dc8af7044fa86" dependencies = [ "bitvec", - "clap", - "clap_mangen", "crossbeam-channel", "filetime", - "indexmap 2.6.0", + "indexmap 2.7.0", "libdeflater", "log", "rayon", "rgb", - "rustc-hash 1.1.0", - "rustc_version", + "rustc-hash 2.1.0", "zopfli", ] @@ -3088,7 +3077,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.7", + "redox_syscall 0.5.8", "smallvec", "windows-targets 0.52.6", ] @@ -3127,7 +3116,7 @@ dependencies = [ "regex", "regex-syntax 0.7.5", "structmeta 0.2.0", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -3141,7 +3130,7 @@ dependencies = [ "regex", "regex-syntax 0.8.5", "structmeta 0.3.0", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -3237,7 +3226,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -3328,9 +3317,9 @@ dependencies = [ [[package]] name = "png" -version = "0.17.14" +version = "0.17.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f9d46a34a05a6a57566bc2bfae066ef07585a6e3fa30fbbdff5936380623f0" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -3451,7 +3440,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -3505,7 +3494,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "322330e133eab455718444b4e033ebfac7c6528972c784fcde28d2cc783c6257" dependencies = [ "anyhow", - "indexmap 2.6.0", + "indexmap 2.7.0", "log", "protobuf", "protobuf-support", @@ -3582,9 +3571,9 @@ checksum = "7dc55d7dec32ecaf61e0bd90b3d2392d721a28b95cfd23c3e176eccefbeab2f2" [[package]] name = "quanta" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" +checksum = "773ce68d0bb9bc7ef20be3536ffe94e223e1f365bd374108b2659fac0c65cfe6" dependencies = [ "crossbeam-utils", "libc", @@ -3614,7 +3603,7 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "rustls", "socket2", "thiserror 2.0.9", @@ -3632,7 +3621,7 @@ dependencies = [ "getrandom", "rand", "ring", - "rustc-hash 2.0.0", + "rustc-hash 2.1.0", "rustls", "rustls-pki-types", "slab", @@ -3644,16 +3633,16 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.7" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" +checksum = "1c40286217b4ba3a71d644d752e6a0b71f13f1b6a2c5311acfcbe0c2418ed904" dependencies = [ "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3747,9 +3736,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "03a862b389f93e68874fbf580b9de08dd02facb9a788ebadaf4a3fd33cf58834" dependencies = [ "bitflags 2.6.0", ] @@ -3811,10 +3800,10 @@ dependencies = [ "bytes", "futures-core", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.1", + "hyper 1.5.2", "hyper-rustls", "hyper-util", "ipnet", @@ -3884,12 +3873,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "roff" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88f8660c1ff60292143c98d08fc6e2f654d722db50410e3f3797d40baaf9d8f3" - [[package]] name = "roxmltree" version = "0.18.1" @@ -3951,7 +3934,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.89", + "syn 2.0.91", "unicode-ident", ] @@ -3983,9 +3966,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[package]] name = "rustc_version" @@ -3998,15 +3981,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.41" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags 2.6.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4047,7 +4030,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.0.1", + "security-framework 3.1.0", ] [[package]] @@ -4061,9 +4044,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" dependencies = [ "web-time", ] @@ -4151,9 +4134,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.0.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1415a607e92bec364ea2cf9264646dcce0f91e6d65281bd6f2819cca3bf39c8" +checksum = "81d3f8c9bfcc3cbb6b0179eb57042d75b1582bdc65c3cb95f3fa999509c03cbc" dependencies = [ "bitflags 2.6.0", "core-foundation 0.10.0", @@ -4164,9 +4147,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.1" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +checksum = "1863fd3768cd83c56a7f60faa4dc0d403f1b6df0a38c3c25f44b7894e45370d5" dependencies = [ "core-foundation-sys", "libc", @@ -4195,7 +4178,7 @@ checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -4218,7 +4201,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -4264,7 +4247,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.6.0", + "indexmap 2.7.0", "serde", "serde_derive", "serde_json", @@ -4281,7 +4264,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -4290,7 +4273,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "itoa", "ryu", "serde", @@ -4518,7 +4501,7 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap 2.6.0", + "indexmap 2.7.0", "log", "memchr", "once_cell", @@ -4735,7 +4718,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive 0.2.0", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -4747,7 +4730,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive 0.3.0", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -4758,7 +4741,7 @@ checksum = "a60bcaff7397072dca0017d1db428e30d5002e00b6847703e2e42005c95fbe00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -4769,7 +4752,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -4802,9 +4785,9 @@ dependencies = [ [[package]] name = "symbolic-common" -version = "12.12.3" +version = "12.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ba5365997a4e375660bed52f5b42766475d5bc8ceb1bb13fea09c469ea0f49" +checksum = "cd33e73f154e36ec223c18013f7064a2c120f1162fc086ac9933542def186b00" dependencies = [ "debugid", "memmap2 0.9.5", @@ -4814,9 +4797,9 @@ dependencies = [ [[package]] name = "symbolic-demangle" -version = "12.12.3" +version = "12.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beff338b2788519120f38c59ff4bb15174f52a183e547bac3d6072c2c0aa48aa" +checksum = "89e51191290147f071777e37fe111800bb82a9059f9c95b19d2dd41bfeddf477" dependencies = [ "cpp_demangle", "rustc-demangle", @@ -4836,9 +4819,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.89" +version = "2.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" +checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" dependencies = [ "proc-macro2", "quote", @@ -4862,7 +4845,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -4887,7 +4870,7 @@ dependencies = [ "fastrand", "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4954,7 +4937,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -4965,7 +4948,18 @@ checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", +] + +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", ] [[package]] @@ -4982,9 +4976,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -5003,9 +4997,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", @@ -5059,9 +5053,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +checksum = "022db8904dfa342efe721985167e9fcd16c29b226db4397ed752a761cfce81e8" dependencies = [ "tinyvec_macros", ] @@ -5090,7 +5084,7 @@ checksum = "8d9ef545650e79f30233c0003bcc2504d7efac6dad25fca40744de773fe2049c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -5119,7 +5113,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -5165,20 +5159,19 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +checksum = "5f6d0975eaace0cf0fcadee4e4aaa5da15b5c079146f2cffb67c113be122bf37" dependencies = [ "rustls", - "rustls-pki-types", "tokio", ] [[package]] name = "tokio-stream" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -5202,9 +5195,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -5234,7 +5227,7 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.7.0", "toml_datetime", "winnow", ] @@ -5286,7 +5279,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -5330,9 +5323,9 @@ checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" [[package]] name = "unicode-bidi" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-bidi-mirroring" @@ -5566,9 +5559,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", "once_cell", @@ -5577,36 +5570,36 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5614,28 +5607,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" dependencies = [ "js-sys", "wasm-bindgen", @@ -5675,7 +5668,7 @@ version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ - "redox_syscall 0.5.7", + "redox_syscall 0.5.8", "wasite", "web-sys", ] @@ -5702,7 +5695,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.59.0", ] [[package]] @@ -5995,7 +5988,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", "synstructure", ] @@ -6017,7 +6010,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -6037,7 +6030,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", "synstructure", ] @@ -6058,7 +6051,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] @@ -6080,7 +6073,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.91", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 7ebad416a..1d5da5fb3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -59,6 +59,7 @@ moka = { version = "0.12", features = ["future"] } num_cpus = "1" pbf_font_tools = { version = "2.5.1", features = ["freetype"] } pmtiles = { version = "0.11", features = ["http-async", "mmap-async-tokio", "tilejson", "reqwest-rustls-tls-native-roots"] } +png = "0.17.14" postgis = "0.9" postgres = { version = "0.19", features = ["with-time-0_3", "with-uuid-1", "with-serde_json-1"] } postgres-protocol = "0.6" @@ -85,6 +86,7 @@ static-files = "0.2" subst = { version = "0.3", features = ["yaml"] } testcontainers-modules = { version = "0.11.4", features = ["postgres"] } thiserror = "2" +tiff = "0.9.1" tile-grid = "0.6" tilejson = "0.4" tokio = { version = "1", features = ["macros"] } diff --git a/docs/src/SUMMARY.md b/docs/src/SUMMARY.md index d7e9e525f..f644ffb93 100644 --- a/docs/src/SUMMARY.md +++ b/docs/src/SUMMARY.md @@ -20,6 +20,7 @@ - [PostgreSQL Table Sources](sources-pg-tables.md) - [PostgreSQL Function Sources](sources-pg-functions.md) - [MBTiles and PMTiles File Sources](sources-files.md) + - [Cloud Optimized GeoTIFF File Sources](sources-cog-files.md) - [Composite Sources](sources-composite.md) - [Sprite Sources](sources-sprites.md) - [Font Sources](sources-fonts.md) diff --git a/docs/src/config-file.md b/docs/src/config-file.md index 11d7a5402..0749063e3 100644 --- a/docs/src/config-file.md +++ b/docs/src/config-file.md @@ -199,6 +199,18 @@ mbtiles: # named source matching source name to a single file mb-src1: /path/to/mbtiles1.mbtiles +# Cloud Optimized GeoTIFF File Sources +cog: + paths: + # scan this whole dir, matching all *.tif files + - /dir-path + # specific TIFF file will be published as a cog source + - /path/to/cogfile.tif + sources: + # named source matching source name to a single file + cog-src1: /path/to/cog1.tif + cog-src2: /path/to/cog2.tif + # Sprite configuration sprites: paths: diff --git a/docs/src/sources-cog-files.md b/docs/src/sources-cog-files.md new file mode 100644 index 000000000..70ee4b9f7 --- /dev/null +++ b/docs/src/sources-cog-files.md @@ -0,0 +1,104 @@ +# Cloud Optimized GeoTIFF File Sources + +Martin can also serve raster sources like local [COG(Cloud Optimized GeoTIFF)](https://cogeo.org/) files. For cog on remote like S3 and other improvements, you could track them on [issue 875](https://github.com/maplibre/martin/issues/875), we are working on and welcome any assistance. + +## Supported colortype and bits per sample + +| colory type | bits per sample | supported | status | +| ----------- | --------------- | --------- | ---------- | +| rgb/rgba | 8 | ✅ | | +| rgb/rgba | 16/32... | 🛠️ | working on | +| gray | 8/16/32... | 🛠️ | working on | + +## Supported compression + +* None +* LZW +* Deflate +* PackBits + +## Run Martin with CLI to serve cog files + +```bash +# Configured with a directory containing TIFF files. +martin /with/tiff/dir1 /with/tiff/dir2 +# Configured with dedicated TIFF file. +martin /path/to/target1.tif /path/to/target1.tif +# Configured with a combination of directories and dedicated TIFF files. +martin /with/tiff/files /path/to/target.tif +``` + +## Run Martin with configuration file + +```yml +keep_alive: 75 + +# The socket address to bind [default: 0.0.0.0:3000] +listen_addresses: '0.0.0.0:3000' + +# Number of web server workers +worker_processes: 8 + +# Amount of memory (in MB) to use for caching tiles [default: 512, 0 to disable] +cache_size_mb: 8 + +# Database configuration. This can also be a list of PG configs. + +cog: + paths: + # scan this whole dir, matching all *.tif files + - /dir-path + # specific TIFF file will be published as a cog source + - /path/to/target1.tif + - /path/to/target2.tif + sources: + # named source matching source name to a single file + cog-src1: /path/to/cog1.tif + cog-src2: /path/to/cog2.tif +``` + +## About COG + +[COG](https://cogeo.org/) is just Cloud Optimized GeoTIFF file. + +TIFF is an image file format. TIFF tags are something like key-value pairs inside to describe the metadata about a TIFF file, ike `ImageWidth`, `ImageLength`, etc. + +GeoTIFF is a valid TIFF file with a set of TIFF tags to describe the 'Cartographic' information associated with it. + +COG is a valid GeoTIFF file with some requirements for efficient reading. That is, all COG files are valid GeoTIFF files, but not all GeoTIFF files are valid COG files. For quick access to tiles in TIFF files, Martin relies on the requirements/recommendations(like the [requirement about Reduced-Resolution Subfiles](https://docs.ogc.org/is/21-026/21-026.html#_requirement_reduced_resolution_subfiles) and [the content dividing strategy](https://docs.ogc.org/is/21-026/21-026.html#_tiles)) so we use the term `COG` over `GeoTIFF` in our documentation and configuration files. + +You may want to visit these specs: + +* [TIFF 6.0](https://www.itu.int/itudoc/itu-t/com16/tiff-fx/docs/tiff6.pdf) +* [GeoTIFF](https://docs.ogc.org/is/19-008r4/19-008r4.html) +* [Cloud Optimized GeoTIFF](https://docs.ogc.org/is/21-026/21-026.html) + +### COG generation with GDAL + +You could generate cog with `gdal_translate` or `gdalwarp`. See more details in [gdal doc](https://gdal.org/en/latest/drivers/raster/cog.html). + +```bash +# gdal-bin installation +# sudo apt update +# sudo apt install gdal-bin + +# gdalwarp +gdalwarp src1.tif src2.tif out.tif -of COG + +# or gdal_translate +gdal_translate input.tif output_cog.tif -of COG +``` + +### The mapping from ZXY to tiff chunk + +* A single TIFF file could contains many sub-file about same spatial area, each has different resolution +* A sub file is organized with many tiles + +So basically there's a mapping from zxy to tile of sub-file of TIFF. + +| zxy | mapping to | +| ---------- | --------------------------- | +| Zoom level | which sub-file in TIFF file | +| X and Y | which tile in subfile | + +Clients could read only the header part of COG to figure out the mapping from zxy to the chunk number and the subfile number. Martin get tile to frontend by this mapping. diff --git a/martin/Cargo.toml b/martin/Cargo.toml index 28dc1c4d8..d756837e8 100644 --- a/martin/Cargo.toml +++ b/martin/Cargo.toml @@ -59,12 +59,13 @@ name = "bench" harness = false [features] -default = ["webui", "fonts", "lambda", "mbtiles", "pmtiles", "postgres", "sprites"] +default = ["webui", "fonts", "lambda", "mbtiles", "pmtiles", "cog", "postgres", "sprites"] webui = ["dep:actix-web-static-files", "dep:static-files"] fonts = ["dep:bit-set", "dep:pbf_font_tools"] lambda = ["dep:lambda-web"] mbtiles = ["dep:mbtiles"] pmtiles = ["dep:pmtiles"] +cog = ["dep:tiff", "dep:png"] postgres = ["dep:deadpool-postgres", "dep:json-patch", "dep:postgis", "dep:postgres", "dep:postgres-protocol", "dep:semver", "dep:tokio-postgres-rustls"] sprites = ["dep:spreet", "tokio/fs"] bless-tests = [] @@ -93,6 +94,7 @@ moka.workspace = true num_cpus.workspace = true pbf_font_tools = { workspace = true, optional = true } pmtiles = { workspace = true, optional = true } +png= { workspace = true, optional = true } postgis = { workspace = true, optional = true } postgres = { workspace = true, optional = true } postgres-protocol = { workspace = true, optional = true } @@ -101,14 +103,15 @@ rustls-native-certs.workspace = true rustls-pemfile.workspace = true rustls.workspace = true semver = { workspace = true, optional = true } -serde.workspace = true serde_json.workspace = true serde_with.workspace = true serde_yaml.workspace = true +serde.workspace = true spreet = { workspace = true, optional = true } static-files = { workspace = true, optional = true } subst.workspace = true thiserror.workspace = true +tiff= { workspace = true, optional = true } tilejson.workspace = true tokio = { workspace = true, features = ["io-std"] } tokio-postgres-rustls = { workspace = true, optional = true } diff --git a/martin/src/args/root.rs b/martin/src/args/root.rs index 7bcda8103..040d1e05f 100644 --- a/martin/src/args/root.rs +++ b/martin/src/args/root.rs @@ -107,6 +107,11 @@ impl Args { config.mbtiles = parse_file_args(&mut cli_strings, "mbtiles", false); } + #[cfg(feature = "cog")] + if !cli_strings.is_empty() { + config.cog = parse_file_args(&mut cli_strings, "tif", false); + } + #[cfg(feature = "sprites")] if !self.extras.sprite.is_empty() { config.sprites = FileConfigEnum::new(self.extras.sprite); diff --git a/martin/src/cog/errors.rs b/martin/src/cog/errors.rs new file mode 100644 index 000000000..c78529b78 --- /dev/null +++ b/martin/src/cog/errors.rs @@ -0,0 +1,51 @@ +use std::path::PathBuf; + +use png::EncodingError; +use tiff::TiffError; + +#[derive(thiserror::Error, Debug)] +pub enum CogError { + #[error("Couldn't decode {1} as tiff file: {0}")] + InvalidTiffFile(TiffError, PathBuf), + + #[error("Requested zoom level {0} from file {1} is out of range. Possible zoom levels are {2} to {3}")] + ZoomOutOfRange(u8, PathBuf, u8, u8), + + #[error("Couldn't find any image in the tiff file: {0}")] + NoImagesFound(PathBuf), + + #[error("Couldn't seek to ifd number {1} (0 based indexing) in tiff file {2}: {0}")] + IfdSeekFailed(TiffError, usize, PathBuf), + + #[error("Too many images in the tiff file: {0}")] + TooManyImages(PathBuf), + + #[error("Couldn't find tags {1:?} at ifd {2} of tiff file {3}: {0}")] + TagsNotFound(TiffError, Vec, usize, PathBuf), + + #[error( + "Unsupported planar configuration {2} at IFD {1} in TIFF file {0}. Only planar configuration 1 is supported." + )] + PlanarConfigurationNotSupported(PathBuf, usize, u16), + + #[error("Failed to read {1}th chunk(0 based index) at ifd {2} from tiff file {3}: {0}")] + ReadChunkFailed(TiffError, u32, usize, PathBuf), + + #[error("Failed to write header of png file at {0}: {1}")] + WritePngHeaderFailed(PathBuf, EncodingError), + + #[error("Failed to write pixel bytes to png file at {0}: {1}")] + WriteToPngFailed(PathBuf, EncodingError), + + #[error("The color type {0:?} and its bit depth of the tiff file {1} is not supported yet")] + NotSupportedColorTypeAndBitDepth(tiff::ColorType, PathBuf), + + #[error("Couldn't parse the {0} value in gdal metadata(tiff tag 42112) from {1}")] + ParseSTATISTICSValueFailed(String, PathBuf), + + #[error("The gdal metadata(tiff tag 42112) from {1} is not valid: {0}")] + InvalidGdalMetaData(String, PathBuf), + + #[error("Striped tiff file is not supported, the tiff file is {0}")] + NotSupportedChunkType(PathBuf), +} diff --git a/martin/src/cog/mod.rs b/martin/src/cog/mod.rs new file mode 100644 index 000000000..b3794303b --- /dev/null +++ b/martin/src/cog/mod.rs @@ -0,0 +1,377 @@ +mod errors; + +pub use errors::CogError; + +use std::collections::HashMap; +use std::fs::File; +use std::path::Path; +use std::vec; +use std::{fmt::Debug, path::PathBuf}; + +use std::io::BufWriter; +use tiff::decoder::{ChunkType, Decoder, DecodingResult}; +use tiff::tags::Tag::{self, GdalNodata}; + +use async_trait::async_trait; +use martin_tile_utils::{Format, TileCoord, TileInfo}; +use serde::{Deserialize, Serialize}; +use tilejson::{tilejson, TileJSON}; +use url::Url; + +use crate::file_config::FileError; +use crate::{ + config::UnrecognizedValues, + file_config::{ConfigExtras, FileResult, SourceConfigExtras}, + MartinResult, Source, TileData, UrlQuery, +}; + +#[derive(Clone, Debug)] +pub struct CogSource { + id: String, + path: PathBuf, + meta: Meta, + tilejson: TileJSON, + tileinfo: TileInfo, +} + +#[derive(Clone, Debug)] +struct Meta { + min_zoom: u8, + max_zoom: u8, + zoom_and_ifd: HashMap, + zoom_and_tile_across_down: HashMap, + nodata: Option, +} + +#[async_trait] +impl Source for CogSource { + fn get_id(&self) -> &str { + &self.id + } + + fn get_tilejson(&self) -> &TileJSON { + &self.tilejson + } + + fn get_tile_info(&self) -> TileInfo { + self.tileinfo + } + + fn clone_source(&self) -> Box { + Box::new(self.clone()) + } + + #[allow(clippy::cast_sign_loss)] + #[allow(clippy::cast_possible_truncation)] + #[allow(clippy::too_many_lines)] + async fn get_tile( + &self, + xyz: TileCoord, + _url_query: Option<&UrlQuery>, + ) -> MartinResult { + let tif_file = + File::open(&self.path).map_err(|e| FileError::IoError(e, self.path.clone()))?; + let mut decoder = + Decoder::new(tif_file).map_err(|e| CogError::InvalidTiffFile(e, self.path.clone()))?; + decoder = decoder.with_limits(tiff::decoder::Limits::unlimited()); + + let ifd = self.meta.zoom_and_ifd.get(&(xyz.z)).ok_or_else(|| { + CogError::ZoomOutOfRange( + xyz.z, + self.path.clone(), + self.meta.min_zoom, + self.meta.max_zoom, + ) + })?; + + decoder + .seek_to_image(*ifd) + .map_err(|e| CogError::IfdSeekFailed(e, *ifd, self.path.clone()))?; + + let tiles_across = self + .meta + .zoom_and_tile_across_down + .get(&(xyz.z)) + .ok_or_else(|| { + CogError::ZoomOutOfRange( + xyz.z, + self.path.clone(), + self.meta.min_zoom, + self.meta.max_zoom, + ) + })? + .0; + let tile_idx = xyz.y * tiles_across + xyz.x; + let decode_result = decoder + .read_chunk(tile_idx) + .map_err(|e| CogError::ReadChunkFailed(e, tile_idx, *ifd, self.path.clone()))?; + let color_type = decoder + .colortype() + .map_err(|e| CogError::InvalidTiffFile(e, self.path.clone()))?; + + let tile_width = decoder.chunk_dimensions().0; + let tile_height = decoder.chunk_dimensions().1; + let (data_width, data_height) = decoder.chunk_data_dimensions(tile_idx); + + //do more research on the not u8 case, is this the right way to do it? + let png_file_bytes = match (decode_result, color_type) { + (DecodingResult::U8(vec), tiff::ColorType::RGB(_)) => rgb_to_png( + vec, + (tile_width, tile_height), + (data_width, data_height), + 3, + self.meta.nodata.map(|v| v as u8), + &self.path, + ), + (DecodingResult::U8(vec), tiff::ColorType::RGBA(_)) => rgb_to_png( + vec, + (tile_width, tile_height), + (data_width, data_height), + 4, + self.meta.nodata.map(|v| v as u8), + &self.path, + ), + (_, _) => Err(CogError::NotSupportedColorTypeAndBitDepth( + color_type, + self.path.clone(), + )), + // do others in next PRs, a lot of disscussion would be needed + }?; + Ok(png_file_bytes) + } +} + +fn rgb_to_png( + vec: Vec, + (tile_width, tile_height): (u32, u32), + (data_width, data_height): (u32, u32), + chunk_components_count: u32, + nodata: Option, + path: &Path, +) -> Result, CogError> { + let is_padded = data_width != tile_width; + let need_add_alpha = chunk_components_count != 4; + + let pixels = if nodata.is_some() || need_add_alpha || is_padded { + let mut result_vec = vec![0; (tile_width * tile_height * 4) as usize]; + for row in 0..data_height { + 'outer: for col in 0..data_width { + let idx_chunk = + row * data_width * chunk_components_count + col * chunk_components_count; + let idx_result = row * tile_width * 4 + col * 4; + for component_idx in 0..chunk_components_count { + if nodata.eq(&Some(vec[(idx_chunk + component_idx) as usize])) { + //This pixel is nodata, just make it transparent and skip it then + let alpha_idx = (idx_result + 3) as usize; + result_vec[alpha_idx] = 0; + continue 'outer; + } + result_vec[(idx_result + component_idx) as usize] = + vec[(idx_chunk + component_idx) as usize]; + } + if need_add_alpha { + let alpha_idx = (idx_result + 3) as usize; + result_vec[alpha_idx] = 255; + } + } + } + result_vec + } else { + vec + }; + let mut result_file_buffer = Vec::new(); + { + let mut encoder = png::Encoder::new( + BufWriter::new(&mut result_file_buffer), + tile_width, + tile_height, + ); + encoder.set_color(png::ColorType::Rgba); + encoder.set_depth(png::BitDepth::Eight); + let mut writer = encoder + .write_header() + .map_err(|e| CogError::WritePngHeaderFailed(path.to_path_buf(), e))?; + writer + .write_image_data(&pixels) + .map_err(|e| CogError::WriteToPngFailed(path.to_path_buf(), e))?; + } + Ok(result_file_buffer) +} + +#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)] +pub struct CogConfig { + #[serde(flatten)] + pub unrecognized: UnrecognizedValues, +} + +impl ConfigExtras for CogConfig { + fn get_unrecognized(&self) -> &UnrecognizedValues { + &self.unrecognized + } +} + +impl SourceConfigExtras for CogConfig { + async fn new_sources(&self, id: String, path: PathBuf) -> FileResult> { + let tileinfo = TileInfo::new(Format::Png, martin_tile_utils::Encoding::Uncompressed); + let meta = get_meta(&path)?; + let tilejson = tilejson! { + tiles: vec![], + minzoom: meta.min_zoom, + maxzoom: meta.max_zoom + }; + Ok(Box::new(CogSource { + id, + path, + meta, + tilejson, + tileinfo, + })) + } + + #[allow(clippy::no_effect_underscore_binding)] + async fn new_sources_url(&self, _id: String, _url: Url) -> FileResult> { + unreachable!() + } + + fn parse_urls() -> bool { + false + } +} + +fn get_meta(path: &PathBuf) -> Result { + let tif_file = File::open(path).map_err(|e| FileError::IoError(e, path.clone()))?; + let mut decoder = Decoder::new(tif_file) + .map_err(|e| CogError::InvalidTiffFile(e, path.clone()))? + .with_limits(tiff::decoder::Limits::unlimited()); + + let chunk_type = decoder.get_chunk_type(); + + if chunk_type != ChunkType::Tile { + Err(CogError::NotSupportedChunkType(path.clone()))?; + } + + let color_type = decoder + .colortype() + .map_err(|e| CogError::InvalidTiffFile(e, path.clone()))?; + + if !matches!( + color_type, + tiff::ColorType::RGB(8) | tiff::ColorType::RGBA(8) + ) { + Err(CogError::NotSupportedColorTypeAndBitDepth( + color_type, + path.clone(), + ))?; + } + + decoder + .get_tag_unsigned(Tag::PlanarConfiguration) + .map_err(|e| { + CogError::TagsNotFound(e, vec![Tag::PlanarConfiguration.to_u16()], 0, path.clone()) + }) + .and_then(|config| { + if config == 1 { + Ok(()) + } else { + Err(CogError::PlanarConfigurationNotSupported( + path.clone(), + 0, + config, + )) + } + })?; + + let tag = decoder.get_tag_ascii_string(GdalNodata); + let nodata: Option = if let Ok(nodata_tag) = tag { + nodata_tag.parse().ok() + } else { + None + }; + let images_ifd = get_images_ifd(&mut decoder); + + let mut zoom_and_ifd: HashMap = HashMap::new(); + let mut zoom_and_tile_across_down: HashMap = HashMap::new(); + + for image_ifd in &images_ifd { + decoder + .seek_to_image(*image_ifd) + .map_err(|e| CogError::IfdSeekFailed(e, *image_ifd, path.clone()))?; + + let zoom = u8::try_from(images_ifd.len() - (image_ifd + 1)) + .map_err(|_| CogError::TooManyImages(path.clone()))?; + + let (tiles_across, tiles_down) = get_grid_dims(&mut decoder, path, *image_ifd)?; + + zoom_and_ifd.insert(zoom, *image_ifd); + zoom_and_tile_across_down.insert(zoom, (tiles_across, tiles_down)); + } + + let min_zoom = zoom_and_ifd + .keys() + .min() + .ok_or_else(|| CogError::NoImagesFound(path.clone()))?; + + let max_zoom = zoom_and_ifd + .keys() + .max() + .ok_or_else(|| CogError::NoImagesFound(path.clone()))?; + Ok(Meta { + min_zoom: *min_zoom, + max_zoom: *max_zoom, + zoom_and_ifd, + zoom_and_tile_across_down, + nodata, + }) +} + +fn get_grid_dims( + decoder: &mut Decoder, + path: &Path, + image_ifd: usize, +) -> Result<(u32, u32), FileError> { + let (tile_width, tile_height) = (decoder.chunk_dimensions().0, decoder.chunk_dimensions().1); + let (image_width, image_length) = get_image_dims(decoder, path, image_ifd)?; + let tiles_across = image_width.div_ceil(tile_width); + let tiles_down = image_length.div_ceil(tile_height); + + Ok((tiles_across, tiles_down)) +} + +fn get_image_dims( + decoder: &mut Decoder, + path: &Path, + image_ifd: usize, +) -> Result<(u32, u32), FileError> { + let (image_width, image_length) = decoder.dimensions().map_err(|e| { + CogError::TagsNotFound( + e, + vec![Tag::ImageWidth.to_u16(), Tag::ImageLength.to_u16()], + image_ifd, + path.to_path_buf(), + ) + })?; + + Ok((image_width, image_length)) +} + +fn get_images_ifd(decoder: &mut Decoder) -> Vec { + let mut res = vec![]; + let mut ifd_idx = 0; + loop { + let is_image = decoder + .get_tag_u32(Tag::NewSubfileType) + .map_or_else(|_| true, |v| v & 4 != 4); + if is_image { + //todo We should not ignore mask in the next PRs + res.push(ifd_idx); + } + + ifd_idx += 1; + + let next_res = decoder.seek_to_image(ifd_idx); + if next_res.is_err() { + break; + } + } + res +} diff --git a/martin/src/config.rs b/martin/src/config.rs index eff279dc8..4e9ca02f8 100644 --- a/martin/src/config.rs +++ b/martin/src/config.rs @@ -54,6 +54,10 @@ pub struct Config { #[serde(default, skip_serializing_if = "FileConfigEnum::is_none")] pub mbtiles: FileConfigEnum, + #[cfg(feature = "cog")] + #[serde(default, skip_serializing_if = "FileConfigEnum::is_none")] + pub cog: FileConfigEnum, + #[cfg(feature = "sprites")] #[serde(default, skip_serializing_if = "FileConfigEnum::is_none")] pub sprites: FileConfigEnum, @@ -86,6 +90,9 @@ impl Config { #[cfg(feature = "mbtiles")] res.extend(self.mbtiles.finalize("mbtiles.")?); + #[cfg(feature = "cog")] + res.extend(self.cog.finalize("cog.")?); + #[cfg(feature = "sprites")] res.extend(self.sprites.finalize("sprites.")?); @@ -103,6 +110,9 @@ impl Config { #[cfg(feature = "mbtiles")] let is_empty = is_empty && self.mbtiles.is_empty(); + #[cfg(feature = "cog")] + let is_empty = is_empty && self.cog.is_empty(); + #[cfg(feature = "sprites")] let is_empty = is_empty && self.sprites.is_empty(); @@ -179,6 +189,13 @@ impl Config { sources.push(Box::pin(val)); } + #[cfg(feature = "cog")] + if !self.cog.is_empty() { + let cfg = &mut self.cog; + let val = crate::file_config::resolve_files(cfg, idr, cache.clone(), "tif"); + sources.push(Box::pin(val)); + } + Ok(TileSources::new(try_join_all(sources).await?)) } diff --git a/martin/src/file_config.rs b/martin/src/file_config.rs index c9d9f052b..1196c84fe 100644 --- a/martin/src/file_config.rs +++ b/martin/src/file_config.rs @@ -45,6 +45,10 @@ pub enum FileError { #[cfg(feature = "pmtiles")] #[error(r#"PMTiles error {0} processing {1}"#)] PmtError(pmtiles::PmtError, String), + + #[cfg(feature = "cog")] + #[error(transparent)] + CogError(#[from] crate::cog::CogError), } pub trait ConfigExtras: Clone + Debug + Default + PartialEq + Send { diff --git a/martin/src/lib.rs b/martin/src/lib.rs index 59548426a..bddd5fab1 100644 --- a/martin/src/lib.rs +++ b/martin/src/lib.rs @@ -14,6 +14,8 @@ pub use utils::{ }; pub mod args; +#[cfg(feature = "cog")] +pub mod cog; pub mod file_config; #[cfg(feature = "fonts")] pub mod fonts; diff --git a/martin/src/utils/error.rs b/martin/src/utils/error.rs index b061daaa1..155f3e628 100644 --- a/martin/src/utils/error.rs +++ b/martin/src/utils/error.rs @@ -64,6 +64,10 @@ pub enum MartinError { #[error(transparent)] MbtilesError(#[from] mbtiles::MbtError), + #[cfg(feature = "cog")] + #[error(transparent)] + CogError(#[from] crate::cog::CogError), + #[error(transparent)] FileError(#[from] crate::file_config::FileError), diff --git a/tests/config.yaml b/tests/config.yaml index 70b08a05c..d963453da 100644 --- a/tests/config.yaml +++ b/tests/config.yaml @@ -180,6 +180,13 @@ sprites: sources: mysrc: tests/fixtures/sprites/src2 +cog: + paths: + - tests/fixtures/cog/rgba_u8_nodata.tif + sources: + cog-src1: tests/fixtures/cog/rgba_u8.tif + cog-src2: tests/fixtures/cog/rgb_u8.tif + fonts: - tests/fixtures/fonts/overpass-mono-regular.ttf - tests/fixtures/fonts diff --git a/tests/expected/auto/catalog_auto.json b/tests/expected/auto/catalog_auto.json index 45a230f73..a4efa942b 100644 --- a/tests/expected/auto/catalog_auto.json +++ b/tests/expected/auto/catalog_auto.json @@ -150,6 +150,15 @@ "content_type": "application/x-protobuf", "description": "public.points_empty_srid.geom" }, + "rgb_u8": { + "content_type": "image/png" + }, + "rgba_u8": { + "content_type": "image/png" + }, + "rgba_u8_nodata": { + "content_type": "image/png" + }, "stamen_toner__raster_CC-BY-ODbL_z3": { "content_type": "image/png" }, diff --git a/tests/expected/auto/rgb_u8.json b/tests/expected/auto/rgb_u8.json new file mode 100644 index 000000000..a159d60c5 --- /dev/null +++ b/tests/expected/auto/rgb_u8.json @@ -0,0 +1,8 @@ +{ + "maxzoom": 3, + "minzoom": 0, + "tilejson": "3.0.0", + "tiles": [ + "http://localhost:3111/rgb_u8/{z}/{x}/{y}" + ] +} diff --git a/tests/expected/auto/rgb_u8_0_0_0.png b/tests/expected/auto/rgb_u8_0_0_0.png new file mode 100644 index 000000000..5955c79d7 Binary files /dev/null and b/tests/expected/auto/rgb_u8_0_0_0.png differ diff --git a/tests/expected/auto/rgb_u8_0_0_0.png.txt b/tests/expected/auto/rgb_u8_0_0_0.png.txt new file mode 100644 index 000000000..6afcdcb84 --- /dev/null +++ b/tests/expected/auto/rgb_u8_0_0_0.png.txt @@ -0,0 +1 @@ +tests/output/auto/rgb_u8_0_0_0.png: PNG image data, 256 x 256, 8-bit/color RGBA, non-interlaced diff --git a/tests/expected/auto/rgb_u8_3_0_0.png b/tests/expected/auto/rgb_u8_3_0_0.png new file mode 100644 index 000000000..e2d2016c6 Binary files /dev/null and b/tests/expected/auto/rgb_u8_3_0_0.png differ diff --git a/tests/expected/auto/rgb_u8_3_0_0.png.txt b/tests/expected/auto/rgb_u8_3_0_0.png.txt new file mode 100644 index 000000000..c45d2efc0 --- /dev/null +++ b/tests/expected/auto/rgb_u8_3_0_0.png.txt @@ -0,0 +1 @@ +tests/output/auto/rgb_u8_3_0_0.png: PNG image data, 256 x 256, 8-bit/color RGBA, non-interlaced diff --git a/tests/expected/auto/rgb_u8_3_1_1.png b/tests/expected/auto/rgb_u8_3_1_1.png new file mode 100644 index 000000000..d423a6695 Binary files /dev/null and b/tests/expected/auto/rgb_u8_3_1_1.png differ diff --git a/tests/expected/auto/rgb_u8_3_1_1.png.txt b/tests/expected/auto/rgb_u8_3_1_1.png.txt new file mode 100644 index 000000000..8eae12770 --- /dev/null +++ b/tests/expected/auto/rgb_u8_3_1_1.png.txt @@ -0,0 +1 @@ +tests/output/auto/rgb_u8_3_1_1.png: PNG image data, 256 x 256, 8-bit/color RGBA, non-interlaced diff --git a/tests/expected/auto/rgba_u8.json b/tests/expected/auto/rgba_u8.json new file mode 100644 index 000000000..75815ef3e --- /dev/null +++ b/tests/expected/auto/rgba_u8.json @@ -0,0 +1,8 @@ +{ + "maxzoom": 3, + "minzoom": 0, + "tilejson": "3.0.0", + "tiles": [ + "http://localhost:3111/rgba_u8/{z}/{x}/{y}" + ] +} diff --git a/tests/expected/auto/rgba_u8_0_0_0.png b/tests/expected/auto/rgba_u8_0_0_0.png new file mode 100644 index 000000000..5955c79d7 Binary files /dev/null and b/tests/expected/auto/rgba_u8_0_0_0.png differ diff --git a/tests/expected/auto/rgba_u8_0_0_0.png.txt b/tests/expected/auto/rgba_u8_0_0_0.png.txt new file mode 100644 index 000000000..4e6e2586e --- /dev/null +++ b/tests/expected/auto/rgba_u8_0_0_0.png.txt @@ -0,0 +1 @@ +tests/output/auto/rgba_u8_0_0_0.png: PNG image data, 256 x 256, 8-bit/color RGBA, non-interlaced diff --git a/tests/expected/auto/rgba_u8_3_0_0.png b/tests/expected/auto/rgba_u8_3_0_0.png new file mode 100644 index 000000000..e2d2016c6 Binary files /dev/null and b/tests/expected/auto/rgba_u8_3_0_0.png differ diff --git a/tests/expected/auto/rgba_u8_3_0_0.png.txt b/tests/expected/auto/rgba_u8_3_0_0.png.txt new file mode 100644 index 000000000..11598f0b5 --- /dev/null +++ b/tests/expected/auto/rgba_u8_3_0_0.png.txt @@ -0,0 +1 @@ +tests/output/auto/rgba_u8_3_0_0.png: PNG image data, 256 x 256, 8-bit/color RGBA, non-interlaced diff --git a/tests/expected/auto/rgba_u8_3_1_1.png b/tests/expected/auto/rgba_u8_3_1_1.png new file mode 100644 index 000000000..d423a6695 Binary files /dev/null and b/tests/expected/auto/rgba_u8_3_1_1.png differ diff --git a/tests/expected/auto/rgba_u8_3_1_1.png.txt b/tests/expected/auto/rgba_u8_3_1_1.png.txt new file mode 100644 index 000000000..46ea068fe --- /dev/null +++ b/tests/expected/auto/rgba_u8_3_1_1.png.txt @@ -0,0 +1 @@ +tests/output/auto/rgba_u8_3_1_1.png: PNG image data, 256 x 256, 8-bit/color RGBA, non-interlaced diff --git a/tests/expected/auto/rgba_u8_nodata.json b/tests/expected/auto/rgba_u8_nodata.json new file mode 100644 index 000000000..47d2f9bc1 --- /dev/null +++ b/tests/expected/auto/rgba_u8_nodata.json @@ -0,0 +1,8 @@ +{ + "maxzoom": 2, + "minzoom": 0, + "tilejson": "3.0.0", + "tiles": [ + "http://localhost:3111/rgba_u8_nodata/{z}/{x}/{y}" + ] +} diff --git a/tests/expected/auto/rgba_u8_nodata_0_0_0.png b/tests/expected/auto/rgba_u8_nodata_0_0_0.png new file mode 100644 index 000000000..3d3b1792a Binary files /dev/null and b/tests/expected/auto/rgba_u8_nodata_0_0_0.png differ diff --git a/tests/expected/auto/rgba_u8_nodata_0_0_0.png.txt b/tests/expected/auto/rgba_u8_nodata_0_0_0.png.txt new file mode 100644 index 000000000..59fb8ac9c --- /dev/null +++ b/tests/expected/auto/rgba_u8_nodata_0_0_0.png.txt @@ -0,0 +1 @@ +tests/output/auto/rgba_u8_nodata_0_0_0.png: PNG image data, 512 x 512, 8-bit/color RGBA, non-interlaced diff --git a/tests/expected/auto/rgba_u8_nodata_1_0_0.png b/tests/expected/auto/rgba_u8_nodata_1_0_0.png new file mode 100644 index 000000000..ce49adb24 Binary files /dev/null and b/tests/expected/auto/rgba_u8_nodata_1_0_0.png differ diff --git a/tests/expected/auto/rgba_u8_nodata_1_0_0.png.txt b/tests/expected/auto/rgba_u8_nodata_1_0_0.png.txt new file mode 100644 index 000000000..974c65bfd --- /dev/null +++ b/tests/expected/auto/rgba_u8_nodata_1_0_0.png.txt @@ -0,0 +1 @@ +tests/output/auto/rgba_u8_nodata_1_0_0.png: PNG image data, 512 x 512, 8-bit/color RGBA, non-interlaced diff --git a/tests/expected/auto/save_config.yaml b/tests/expected/auto/save_config.yaml index f578a9aab..9878a45c9 100644 --- a/tests/expected/auto/save_config.yaml +++ b/tests/expected/auto/save_config.yaml @@ -229,6 +229,7 @@ pmtiles: paths: - tests/fixtures/mbtiles - tests/fixtures/pmtiles + - tests/fixtures/cog sources: png: tests/fixtures/pmtiles/png.pmtiles stamen_toner__raster_CC-BY-ODbL_z3: tests/fixtures/pmtiles/stamen_toner__raster_CC-BY+ODbL_z3.pmtiles @@ -237,6 +238,7 @@ mbtiles: paths: - tests/fixtures/mbtiles - tests/fixtures/pmtiles + - tests/fixtures/cog sources: geography-class-jpg: tests/fixtures/mbtiles/geography-class-jpg.mbtiles geography-class-jpg-diff: tests/fixtures/mbtiles/geography-class-jpg-diff.mbtiles @@ -250,6 +252,15 @@ mbtiles: world_cities_diff: tests/fixtures/mbtiles/world_cities_diff.mbtiles world_cities_modified: tests/fixtures/mbtiles/world_cities_modified.mbtiles zoomed_world_cities: tests/fixtures/mbtiles/zoomed_world_cities.mbtiles +cog: + paths: + - tests/fixtures/mbtiles + - tests/fixtures/pmtiles + - tests/fixtures/cog + sources: + rgb_u8: tests/fixtures/cog/rgb_u8.tif + rgba_u8: tests/fixtures/cog/rgba_u8.tif + rgba_u8_nodata: tests/fixtures/cog/rgba_u8_nodata.tif sprites: tests/fixtures/sprites/src1 fonts: - tests/fixtures/fonts/overpass-mono-regular.ttf diff --git a/tests/expected/auto_mini/save_config.yaml b/tests/expected/auto_mini/save_config.yaml index 1dcb15929..3596660a2 100644 --- a/tests/expected/auto_mini/save_config.yaml +++ b/tests/expected/auto_mini/save_config.yaml @@ -4,3 +4,4 @@ pmtiles: sources: webp2: tests/fixtures/pmtiles2/webp2.pmtiles mbtiles: tests/fixtures/pmtiles2 +cog: tests/fixtures/pmtiles2 diff --git a/tests/expected/configured/catalog_cfg.json b/tests/expected/configured/catalog_cfg.json index 6c271d96e..b10815433 100644 --- a/tests/expected/configured/catalog_cfg.json +++ b/tests/expected/configured/catalog_cfg.json @@ -42,6 +42,12 @@ "content_type": "application/x-protobuf", "description": "autodetect.bigint_table.geom" }, + "cog-src1": { + "content_type": "image/png" + }, + "cog-src2": { + "content_type": "image/png" + }, "fnc_Mixed_Name": { "content_type": "application/x-protobuf", "description": "a function source with MixedCase name" @@ -72,6 +78,9 @@ "content_type": "application/x-protobuf", "description": "public.points3857.geom" }, + "rgba_u8_nodata": { + "content_type": "image/png" + }, "table_source": { "content_type": "application/x-protobuf" }, diff --git a/tests/expected/configured/save_config.yaml b/tests/expected/configured/save_config.yaml index 308490c10..e3d665f0e 100644 --- a/tests/expected/configured/save_config.yaml +++ b/tests/expected/configured/save_config.yaml @@ -166,6 +166,11 @@ pmtiles: pmt: tests/fixtures/pmtiles/stamen_toner__raster_CC-BY+ODbL_z3.pmtiles pmt2: http://localhost:5412/webp2.pmtiles webp2: http://localhost:5412/webp2.pmtiles +cog: + sources: + cog-src1: tests/fixtures/cog/rgba_u8.tif + cog-src2: tests/fixtures/cog/rgb_u8.tif + rgba_u8_nodata: tests/fixtures/cog/rgba_u8_nodata.tif sprites: paths: tests/fixtures/sprites/src1 sources: diff --git a/tests/expected/martin-cp/flat-with-hash_save_config.yaml b/tests/expected/martin-cp/flat-with-hash_save_config.yaml index ea1fb2bf0..7621eae72 100644 --- a/tests/expected/martin-cp/flat-with-hash_save_config.yaml +++ b/tests/expected/martin-cp/flat-with-hash_save_config.yaml @@ -251,3 +251,7 @@ mbtiles: world_cities_diff: tests/fixtures/mbtiles/world_cities_diff.mbtiles world_cities_modified: tests/fixtures/mbtiles/world_cities_modified.mbtiles zoomed_world_cities: tests/fixtures/mbtiles/zoomed_world_cities.mbtiles +cog: +- tests/fixtures/mbtiles +- tests/fixtures/pmtiles +- tests/fixtures/pmtiles2 diff --git a/tests/expected/martin-cp/flat_save_config.yaml b/tests/expected/martin-cp/flat_save_config.yaml index ea1fb2bf0..7621eae72 100644 --- a/tests/expected/martin-cp/flat_save_config.yaml +++ b/tests/expected/martin-cp/flat_save_config.yaml @@ -251,3 +251,7 @@ mbtiles: world_cities_diff: tests/fixtures/mbtiles/world_cities_diff.mbtiles world_cities_modified: tests/fixtures/mbtiles/world_cities_modified.mbtiles zoomed_world_cities: tests/fixtures/mbtiles/zoomed_world_cities.mbtiles +cog: +- tests/fixtures/mbtiles +- tests/fixtures/pmtiles +- tests/fixtures/pmtiles2 diff --git a/tests/expected/martin-cp/normalized_save_config.yaml b/tests/expected/martin-cp/normalized_save_config.yaml index ea1fb2bf0..7621eae72 100644 --- a/tests/expected/martin-cp/normalized_save_config.yaml +++ b/tests/expected/martin-cp/normalized_save_config.yaml @@ -251,3 +251,7 @@ mbtiles: world_cities_diff: tests/fixtures/mbtiles/world_cities_diff.mbtiles world_cities_modified: tests/fixtures/mbtiles/world_cities_modified.mbtiles zoomed_world_cities: tests/fixtures/mbtiles/zoomed_world_cities.mbtiles +cog: +- tests/fixtures/mbtiles +- tests/fixtures/pmtiles +- tests/fixtures/pmtiles2 diff --git a/tests/fixtures/cog/rgb_u8.tif b/tests/fixtures/cog/rgb_u8.tif new file mode 100644 index 000000000..b325dbfab Binary files /dev/null and b/tests/fixtures/cog/rgb_u8.tif differ diff --git a/tests/fixtures/cog/rgba_u8.tif b/tests/fixtures/cog/rgba_u8.tif new file mode 100644 index 000000000..0ec52ccdf Binary files /dev/null and b/tests/fixtures/cog/rgba_u8.tif differ diff --git a/tests/fixtures/cog/rgba_u8_nodata.tif b/tests/fixtures/cog/rgba_u8_nodata.tif new file mode 100644 index 000000000..f5a5aaf41 Binary files /dev/null and b/tests/fixtures/cog/rgba_u8_nodata.tif differ diff --git a/tests/test.sh b/tests/test.sh index ca94d434f..8cf70f35d 100755 --- a/tests/test.sh +++ b/tests/test.sh @@ -205,7 +205,7 @@ LOG_FILE="${LOG_DIR}/${TEST_NAME}.txt" TEST_OUT_DIR="${TEST_OUT_BASE_DIR}/${TEST_NAME}" mkdir -p "$TEST_OUT_DIR" -ARG=(--default-srid 900913 --auto-bounds calc --save-config "${TEST_OUT_DIR}/save_config.yaml" tests/fixtures/mbtiles tests/fixtures/pmtiles "$STATICS_URL/webp2.pmtiles" --sprite tests/fixtures/sprites/src1 --font tests/fixtures/fonts/overpass-mono-regular.ttf --font tests/fixtures/fonts) +ARG=(--default-srid 900913 --auto-bounds calc --save-config "${TEST_OUT_DIR}/save_config.yaml" tests/fixtures/mbtiles tests/fixtures/pmtiles tests/fixtures/cog "$STATICS_URL/webp2.pmtiles" --sprite tests/fixtures/sprites/src1 --font tests/fixtures/fonts/overpass-mono-regular.ttf --font tests/fixtures/fonts) export DATABASE_URL="$MARTIN_DATABASE_URL" set -x @@ -281,6 +281,21 @@ test_png mb_png_0_0_0 geography-class-png/0/0/0 test_jsn mb_mvt world_cities test_pbf mb_mvt_2_3_1 world_cities/2/3/1 +>&2 echo "***** Test server response for COG(Cloud Optimized GeoTiff) source *****" +test_jsn rgb_u8 rgb_u8 +test_png rgb_u8_0_0_0 rgb_u8/0/0/0 +test_png rgb_u8_3_0_0 rgb_u8/3/0/0 +test_png rgb_u8_3_1_1 rgb_u8/3/1/1 + +test_jsn rgba_u8 rgba_u8 +test_png rgba_u8_0_0_0 rgba_u8/0/0/0 +test_png rgba_u8_3_0_0 rgba_u8/3/0/0 +test_png rgba_u8_3_1_1 rgba_u8/3/1/1 + +test_jsn rgba_u8_nodata rgba_u8_nodata +test_png rgba_u8_nodata_0_0_0 rgba_u8_nodata/0/0/0 +test_png rgba_u8_nodata_1_0_0 rgba_u8_nodata/1/0/0 + >&2 echo "***** Test server response for table source with empty SRID *****" test_pbf points_empty_srid_0_0_0 points_empty_srid/0/0/0