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);
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(), 4096});
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 item : wkb) {
64 if (
auto g2 = inv(g1))
72 co_yield std::move(geoms);
76 std::generator<raster> rasters()
79 return catalog().get_raster(layer);
82 {r.xscale, r.xskew, r.xorig},
83 {r.yskew, r.yscale, r.yorig},
87 auto uncached = std::vector<tile>{};
88 for (
auto& t : tiles(filter, r.width, r.height, affine, crs)) {
90 cache ? cache->get(std::tuple{cache_key, t}) : std::any{};
91 if (!any.has_value()) {
92 uncached.push_back(t);
96 std::any_cast<boost::gil::rgba8_image_t>(std::move(any));
98 std::move(rgba),
affine * t.affine(r.width, r.height), crs};
100 for (
auto [t, img] : catalog().read(r, std::move(uncached))) {
103 cache->put(std::tuple{cache_key, t}, rgba);
105 std::move(rgba),
affine * t.affine(r.width, r.height), crs};
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