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>
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 mbr = geometry::cartesian::box{{-lim, -lim}, {lim, lim}};
55 auto sz = tile::size * pow2(zmax);
56 auto [a] = geometry::affine(sz, sz, mbr);
57 return {
58 .table_name{"_layer"},
59 .column_name{"raster"},
60 .bands{{"red", "byte"},
61 {"green", "byte"},
62 {"blue", "byte"},
63 {"alpha", "byte"}},
64 .width = sz,
65 .height = sz,
66 .xorig = a[0][2],
67 .yorig = a[1][2],
68 .xscale = a[0][0],
69 .yscale = a[1][1],
70 .xskew = a[0][1],
71 .yskew = a[1][0],
72 .srid = epsg,
73 .epsg = epsg,
74 };
75 }
76
77 std::generator<std::pair<tile, gil::any_image>> read(
79 std::vector<tile> ts) override
80 {
81 auto q = curl{};
82 auto m = std::map<std::string, tile>{};
83 for (auto& t : ts) {
84 auto u = url;
85 replace(u, "{z}", to_chars(t.z));
86 replace(u, "{y}", to_chars(t.y));
87 replace(u, "{x}", to_chars(t.x));
88 q.push(u.data(), agent.data(), ssl);
89 m.insert({u, t});
90 }
91 while (q.size()) {
92 auto [u, img] = q.pop();
93 co_yield {m.at(u), gil::read<boost::gil::rgba8_image_t>(img)};
94 }
95 }
96
97 void write(db::raster const&, db::rect const&, gil::any_image_view) override
98 {
99 throw err;
100 }
101
102 void set_autocommit(bool) override { throw err; }
103
104 void commit() override { throw err; }
105};
106
107} // namespace boat::slippy
108
109#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:97
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:77
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:104
void set_autocommit(bool) override
Definition slippy.hpp:102
int ssl
Verify peer certificate.
Definition slippy.hpp:19
std::vector< db::source > sources() override
May include nested data sources.
Definition slippy.hpp:22
matrix affine(int width, int height, cartesian::segment const &mid_pixel)
Maps pixel coordinates to spatial coordinates.
Definition raster.hpp:55
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
model::box< point > box
Definition vocabulary.hpp:81
static constexpr int size
Maximum tile side in pixels.
Definition tile.hpp:16