boat
C++23 geospatial library
Loading...
Searching...
No Matches
provider.hpp
Go to the documentation of this file.
1// Andrew Naplavkov
2
3#ifndef BOAT_GUI_PROVIDER_HPP
4#define BOAT_GUI_PROVIDER_HPP
5
6#include <boat/db/catalog.hpp>
8#include <boat/gui/detail/geometry.hpp>
9#include <boat/gui/detail/tile.hpp>
10#include <boat/gui/variant.hpp>
11#include <random>
12
13namespace boat::gui {
14
15struct provider {
16 std::move_only_function<db::catalog&()> catalog;
18 std::shared_ptr<caches::cache> cache;
19 size_t cache_key;
21
22 std::generator<variant> renderables()
23 {
24 if (layer.raster)
25 co_yield std::ranges::elements_of(rasters());
26 else
27 co_yield std::ranges::elements_of(vectors());
28 }
29
30private:
31 std::generator<geometry::geographic::geometry_collection> vectors()
32 {
33 namespace bgi = boost::geometry::index;
34 auto tbl = get_or_invoke(cache.get(), cache_key, [&] {
35 return catalog().get_table(layer.schema_name, layer.table_name);
36 });
37 auto& col = layer.column_name;
38 auto it = std::ranges::find(tbl.columns, col, &db::column::column_name);
39 check(it != tbl.columns.end(), col);
40 auto crs = geometry::to_srs_variant(*it);
41 auto voids = bgi::rtree<geometry::cartesian::box, bgi::rstar<4>>{};
42 auto gen = std::mt19937{std::random_device()()};
43 for (auto& box : boxes(filter, crs)) {
44 if (bgi::qbegin(voids, bgi::contains(box)) != bgi::qend(voids))
45 continue;
46 auto a = box.min_corner(), b = box.max_corner();
47 auto geoms = get_or_invoke(
48 cache.get(),
49 std::tuple{cache_key, a.x(), a.y(), b.x(), b.y()},
50 [&] {
51 auto rs = catalog().select(
52 tbl,
53 db::bbox{{col}, col, a.x(), a.y(), b.x(), b.y(), 4096});
54 auto wkb = std::vector<blob>(128);
55 auto end = std::ranges::sample(
56 rs | db::view<blob>, wkb.begin(), wkb.size(), gen);
57 wkb.erase(end, wkb.end());
58 auto inv = geometry::transform(
60 auto ret = geometry::geographic::geometry_collection{};
61 for (blob_view item : wkb) {
63 item >> g1;
64 if (auto g2 = inv(g1))
65 ret.push_back(*g2);
66 }
67 return ret;
68 });
69 if (geoms.empty())
70 voids.insert(box);
71 else
72 co_yield std::move(geoms);
73 }
74 }
75
76 std::generator<raster> rasters()
77 {
78 auto r = get_or_invoke(cache.get(), cache_key, [&] {
79 return catalog().get_raster(layer);
80 });
82 {r.xscale, r.xskew, r.xorig},
83 {r.yskew, r.yscale, r.yorig},
84 {0., 0., 1.},
85 }};
86 auto crs = geometry::to_srs_variant(r);
87 auto uncached = std::vector<tile>{};
88 for (auto& t : tiles(filter, r.width, r.height, affine, crs)) {
89 auto any =
90 cache ? cache->get(std::tuple{cache_key, t}) : std::any{};
91 if (!any.has_value()) {
92 uncached.push_back(t);
93 continue;
94 }
95 auto rgba =
96 std::any_cast<boost::gil::rgba8_image_t>(std::move(any));
97 co_yield {
98 std::move(rgba), affine * t.affine(r.width, r.height), crs};
99 }
100 for (auto [t, img] : catalog().read(r, std::move(uncached))) {
101 auto rgba = gil::to<boost::gil::rgba8_image_t>(const_view(img));
102 if (cache)
103 cache->put(std::tuple{cache_key, t}, rgba);
104 co_yield {
105 std::move(rgba), affine * t.affine(r.width, r.height), crs};
106 }
107 }
108};
109
110} // namespace boat::gui
111
112#endif // BOAT_GUI_PROVIDER_HPP
constexpr auto view
Converts a rowset row to a structure.
Definition rowset.hpp:26
bool transform(T1 const &geom1, T2 &geom2, Strategy const &strategy)
Definition transform.hpp:76
matrix affine(int width, int height, cartesian::segment const &mid_pixel)
Maps pixel coordinates to spatial coordinates.
Definition raster.hpp:55
auto transformation(srs_spec auto const &a, srs_spec auto const &b)
Creates a transformation from source a to target b.
Definition transform.hpp:39
auto srs_inverse(T const &v)
Definition transform.hpp:62
boost::qvm::mat< double, 3, 3 > matrix
Definition vocabulary.hpp:114
srs_variant to_srs_variant(auto const &meta)
Prefers a positive epsg code to proj4; throws if neither is available.
Definition transform.hpp:31
T to(any_image_view img)
Definition gil.hpp:55
auto get_or_invoke(cache *ptr, any_hashable const &key, F &&f, Args &&... args)
Definition cache.hpp:23
Definition cache.hpp:11
Uniform access to vector and raster data.
Definition catalog.hpp:16
std::string column_name
Definition meta.hpp:29
Definition meta.hpp:18
std::string column_name
Definition meta.hpp:21
std::variant< point, linestring, polygon, multi_point, multi_linestring, multi_polygon, geometry_collection > variant
Definition vocabulary.hpp:87
std::map< double, multi_point > grid
Definition vocabulary.hpp:83
Definition provider.hpp:15
std::generator< variant > renderables()
Definition provider.hpp:22
size_t cache_key
Definition provider.hpp:19
std::shared_ptr< caches::cache > cache
Definition provider.hpp:18
std::move_only_function< db::catalog &()> catalog
Definition provider.hpp:16
db::layer layer
Definition provider.hpp:17
geometry::geographic::grid filter
Definition provider.hpp:20