boat
C++23 geospatial library
Loading...
Searching...
No Matches
slippy.hpp
Go to the documentation of this file.
1// Andrew Naplavkov
2
3#ifndef BOAT_SLIPPY_HPP
4#define BOAT_SLIPPY_HPP
5
6#include <boat/db/catalog.hpp>
7#include <boat/detail/curl.hpp>
8#include <boat/detail/numbers.hpp>
9
10namespace boat::slippy {
11
12class catalog : public db::catalog {
13 inline static auto err = std::logic_error{"slippy"};
14
15public:
16 std::string url;
17 std::string agent;
18 int epsg = 3857;
19 int ssl = 1;
20 int zmax = 19;
21
22 std::vector<db::source> sources() override { return {}; }
23
24 std::vector<db::layer> layers() override
25 {
26 return {{"", "_layer", "raster", true}};
27 }
28
29 db::table get_table(std::string_view, std::string_view) override
30 {
31 throw err;
32 }
33
34 db::rowset select(db::table const&, db::page const&) override { throw err; }
35
36 db::rowset select(db::table const&, db::bbox const&) override { throw err; }
37
38 void insert( //
39 db::table const&,
40 db::rowset const&,
41 std::stop_token = {}) override
42 {
43 throw err;
44 }
45
46 db::table create(db::table const&) override { throw err; }
47
48 void drop(std::string_view, std::string_view) override {}
49
51 {
52 auto lim =
53 std::nexttoward(numbers::pi * numbers::earth::equatorial_radius, 0);
54 auto sz = tile::size * pow2(zmax);
55 return {
56 .table_name{"_layer"},
57 .column_name{"raster"},
58 .bands{{"red", "byte"},
59 {"green", "byte"},
60 {"blue", "byte"},
61 {"alpha", "byte"}},
62 .width = sz,
63 .height = sz,
64 .xorig = -lim,
65 .yorig = lim,
66 .xscale = 2 * lim / sz,
67 .yscale = -2 * lim / sz,
68 .srid = epsg,
69 .epsg = epsg,
70 };
71 }
72
73 std::generator<std::pair<tile, gil::any_image>> read(
75 std::vector<tile> ts) override
76 {
77 auto q = curl{};
78 auto m = std::map<std::string, tile>{};
79 for (auto& t : ts) {
80 auto u = url;
81 replace(u, "{z}", to_chars(t.z));
82 replace(u, "{y}", to_chars(t.y));
83 replace(u, "{x}", to_chars(t.x));
84 q.push(u.data(), agent.data(), ssl);
85 m.insert({u, t});
86 }
87 while (q.size()) {
88 auto [u, img] = q.pop();
89 co_yield {m.at(u), gil::read<boost::gil::rgba8_image_t>(img)};
90 }
91 }
92
93 void write(db::raster const&, db::rect const&, gil::any_image_view) override
94 {
95 throw err;
96 }
97
98 void set_autocommit(bool) override { throw err; }
99
100 void commit() override { throw err; }
101};
102
103} // namespace boat::slippy
104
105#endif // BOAT_SLIPPY_HPP
Definition slippy.hpp:12
void insert(db::table const &, db::rowset const &, std::stop_token={}) override
Cancellation may leave a partially inserted range.
Definition slippy.hpp:38
db::table create(db::table const &) override
Returns metadata reported by the backend after creation.
Definition slippy.hpp:46
int epsg
Tiled Mercator projection: 3857 or 3395.
Definition slippy.hpp:18
void write(db::raster const &, db::rect const &, gil::any_image_view) override
rect coordinates are pixels.
Definition slippy.hpp:93
db::rowset select(db::table const &, db::page const &) override
Definition slippy.hpp:34
db::table get_table(std::string_view, std::string_view) override
Definition slippy.hpp:29
db::rowset select(db::table const &, db::bbox const &) override
Definition slippy.hpp:36
int zmax
Maximum server zoom.
Definition slippy.hpp:20
std::string url
URL template with {z}, {x}, and {y}.
Definition slippy.hpp:16
void drop(std::string_view, std::string_view) override
Definition slippy.hpp:48
std::generator< std::pair< tile, gil::any_image > > read(db::raster, std::vector< tile > ts) override
Definition slippy.hpp:73
std::string agent
HTTP User-Agent.
Definition slippy.hpp:17
db::raster get_raster(db::layer const &) override
Definition slippy.hpp:50
std::vector< db::layer > layers() override
Definition slippy.hpp:24
void commit() override
Definition slippy.hpp:100
void set_autocommit(bool) override
Definition slippy.hpp:98
int ssl
Verify peer certificate.
Definition slippy.hpp:19
std::vector< db::source > sources() override
May include nested data sources.
Definition slippy.hpp:22
T read(blob_view img)
Decodes PNG or JPEG by signature.
Definition gil.hpp:65
typename any_image::const_view_t any_image_view
Definition gil.hpp:51
Definition slippy.hpp:10
Spatial filter for row selection.
Definition meta.hpp:70
Uniform access to vector and raster data.
Definition catalog.hpp:16
Definition meta.hpp:18
Pagination filter for row selection.
Definition meta.hpp:86
Definition meta.hpp:98
Definition meta.hpp:117
Definition rowset.hpp:12
Definition meta.hpp:54
static constexpr int size
Maximum tile side in pixels.
Definition tile.hpp:18