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(), 1024});
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 v : wkb)
62 if (auto g = inv(get<geometry::geographic::variant>(v)))
63 ret.push_back(std::move(*g));
64 return ret;
65 });
66 if (geoms.empty())
67 voids.insert(box);
68 else
69 co_yield std::move(geoms);
70 }
71 }
72
73 std::generator<raster> rasters()
74 {
75 auto r = get_or_invoke(cache.get(), cache_key, [&] {
76 return catalog().get_raster(layer);
77 });
79 {r.xscale, r.xskew, r.xorig},
80 {r.yskew, r.yscale, r.yorig},
81 {0., 0., 1.},
82 }};
83 auto crs = geometry::to_srs_variant(r);
84 auto uncached = std::vector<tile>{};
85 for (auto& t : tiles(filter, r.width, r.height, affine, crs)) {
86 auto any =
87 cache ? cache->get(std::tuple{cache_key, t}) : std::any{};
88 if (!any.has_value()) {
89 uncached.push_back(t);
90 continue;
91 }
92 auto rgba =
93 std::any_cast<boost::gil::rgba8_image_t>(std::move(any));
94 co_yield {
95 std::move(rgba), affine * t.affine(r.width, r.height), crs};
96 }
97 if (uncached.empty())
98 co_return;
99 for (auto [t, img] : catalog().read(r, std::move(uncached))) {
100 auto rgba = gil::to<boost::gil::rgba8_image_t>(const_view(img));
101 if (cache)
102 cache->put(std::tuple{cache_key, t}, rgba);
103 co_yield {
104 std::move(rgba), affine * t.affine(r.width, r.height), crs};
105 }
106 }
107};
108
109} // namespace boat::gui
110
111#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:95
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)
Definition transform.hpp:58
auto srs_inverse(T const &v)
Definition transform.hpp:81
boost::qvm::mat< double, 3, 3 > matrix
Definition vocabulary.hpp:99
srs_variant to_srs_variant(auto const &meta)
Prefers a positive epsg code to proj4; throws if neither is available.
Definition transform.hpp:51
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
T get(blob_view &in)
Definition blob.hpp:54
Uniform access to vector and raster data.
Definition catalog.hpp:16
std::string column_name
Definition meta.hpp:29
Definition meta.hpp:18
std::map< double, multi_point > grid
Definition vocabulary.hpp:68
Definition scene.hpp:17
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