18 std::shared_ptr<caches::cache>
cache;
25 co_yield std::ranges::elements_of(rasters());
27 co_yield std::ranges::elements_of(vectors());
31 std::generator<geometry::geographic::geometry_collection> vectors()
33 namespace bgi = boost::geometry::index;
35 return catalog().get_table(layer.schema_name, layer.table_name);
37 auto& col =
layer.column_name;
39 check(it != tbl.columns.end(), col);
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))
46 auto a = box.min_corner(), b = box.max_corner();
47 auto geoms = get_or_invoke(
49 std::tuple{cache_key, a.x(), a.y(), b.x(), b.y()},
51 auto rs = catalog().select(
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(
57 wkb.erase(end, wkb.end());
60 auto ret = geometry::geographic::geometry_collection{};
61 for (blob_view v : wkb)
63 ret.push_back(std::move(*g));
69 co_yield std::move(geoms);
73 std::generator<raster> rasters()
76 return catalog().get_raster(layer);
79 {r.xscale, r.xskew, r.xorig},
80 {r.yskew, r.yscale, r.yorig},
84 auto uncached = std::vector<tile>{};
85 for (
auto& t : tiles(filter, r.width, r.height, affine, crs)) {
87 cache ? cache->get(std::tuple{cache_key, t}) : std::any{};
88 if (!any.has_value()) {
89 uncached.push_back(t);
93 std::any_cast<boost::gil::rgba8_image_t>(std::move(any));
95 std::move(rgba),
affine * t.affine(r.width, r.height), crs};
99 for (
auto [t, img] : catalog().read(r, std::move(uncached))) {
102 cache->put(std::tuple{cache_key, t}, rgba);
104 std::move(rgba),
affine * t.affine(r.width, r.height), crs};