boat
C++23 geospatial library
Loading...
Searching...
No Matches
catalog.hpp
Go to the documentation of this file.
1// Andrew Naplavkov
2
3#ifndef BOAT_GDAL_CATALOG_HPP
4#define BOAT_GDAL_CATALOG_HPP
5
6#include <boat/db/catalog.hpp>
7#include <boat/db/query.hpp>
9#include <boat/gdal/detail/raster.hpp>
10#include <boat/gdal/detail/vector.hpp>
11
12namespace boat::gdal {
13
15 dataset_ptr dataset;
16
17 std::vector<db::source> sources() override
18 {
19 return gdal::subdatasets(dataset.get()) |
20 std::views::transform(
21 [](auto p) { return db::source(p.first, p.second); }) |
22 std::ranges::to<std::vector>();
23 }
24
25 std::vector<db::layer> layers() override
26 {
27 auto ret = std::vector<db::layer>{};
28 if (GDALGetRasterCount(dataset.get()))
29 ret.push_back({"", "_layer", "raster", true});
30 ret.append_range(vectors(dataset.get()));
31 return ret;
32 }
33
34 db::table get_table(std::string_view, std::string_view table_name) override
35 {
36 return gdal::get_table(GDALDatasetGetLayerByName(
37 dataset.get(), std::string{table_name}.data()));
38 }
39
40 db::rowset select(db::table const& tbl, db::page const& rq) override
41 {
42 auto q = db::query{};
43 q << "\n select";
44 if (auto col = OGR_L_GetFIDColumn(GDALDatasetGetLayerByName(
45 dataset.get(), tbl.table_name.data()));
46 col && std::strlen(col))
47 q << " FID as \"" << col << "\",";
48 q << " * from " << db::id{tbl.table_name};
49 for (auto sep{"\n order by "}; auto& key : rq.order_by)
50 q << std::exchange(sep, ", ") << db::id{key.column_name}
51 << (key.descending ? " desc" : "");
52 q << "\n limit " << to_chars(rq.limit) << "\n offset "
53 << to_chars(rq.offset);
54 if (auto lyr = execute(dataset.get(), q.text('"', {}).data(), "OGRSQL"))
55 return gdal::select(
56 lyr.get(), fields::make(lyr.get(), rq.select_list), rq.limit);
57 return {};
58 }
59
60 db::rowset select(db::table const& tbl, db::bbox const& rq) override
61 {
62 auto lyr =
63 GDALDatasetGetLayerByName(dataset.get(), tbl.table_name.data());
64 auto fd = OGR_L_GetLayerDefn(lyr);
65 OGR_L_SetSpatialFilterRectEx(
66 lyr,
67 std::max<>(0, OGR_FD_GetGeomFieldIndex(fd, rq.layer_column.data())),
68 rq.xmin,
69 rq.ymin,
70 rq.xmax,
71 rq.ymax);
72 return gdal::select(lyr, fields::make(lyr, rq.select_list), rq.limit);
73 }
74
75 void insert( //
76 db::table const& tbl,
77 db::rowset const& rs,
78 std::stop_token tok = {}) override
79 {
80 auto lyr =
81 GDALDatasetGetLayerByName(dataset.get(), tbl.table_name.data());
82 gdal::insert(lyr, rs, tok);
83 }
84
85 db::table create(db::table const& tbl) override
86 {
87 return gdal::get_table(add_table(dataset.get(), tbl));
88 }
89
90 void drop(std::string_view, std::string_view table_name) override
91 {
92 delete_table(dataset.get(), table_name);
93 }
94
96 {
97 return gdal::get_raster(dataset.get());
98 }
99
100 std::generator<std::pair<tile, gil::any_image>> read(
101 db::raster rast,
102 std::vector<tile> ts) override
103 {
104 for (auto& t : ts)
105 co_yield {t, gdal::read(dataset.get(), rast, t)};
106 }
107
108 void write( //
109 db::raster const& rast,
110 db::rect const& rect,
111 gil::any_image_view img) override
112 {
113 gdal::write(dataset.get(), rast, rect, img);
114 }
115
116 void set_autocommit(bool on) override
117 {
118 gdal::set_autocommit(dataset.get(), on);
119 }
120
121 void commit() override { gdal::commit(dataset.get()); }
122};
123
124} // namespace boat::gdal
125
126#endif // BOAT_GDAL_CATALOG_HPP
Definition query.hpp:20
Definition catalog.hpp:12
typename any_image::const_view_t any_image_view
Definition gil.hpp:51
Spatial filter for row selection.
Definition meta.hpp:70
double xmin
Definition meta.hpp:73
double ymax
Definition meta.hpp:76
double ymin
Definition meta.hpp:74
int limit
Definition meta.hpp:77
std::string layer_column
Definition meta.hpp:72
std::vector< std::string > select_list
Definition meta.hpp:71
double xmax
Definition meta.hpp:75
Uniform access to vector and raster data.
Definition catalog.hpp:16
Definition query.hpp:15
Definition meta.hpp:18
Pagination filter for row selection.
Definition meta.hpp:86
int limit
Definition meta.hpp:90
std::vector< order_key > order_by
Definition meta.hpp:88
size_t offset
Definition meta.hpp:89
std::vector< std::string > select_list
Definition meta.hpp:87
Definition meta.hpp:98
Definition meta.hpp:117
Definition rowset.hpp:12
Definition meta.hpp:13
Definition meta.hpp:54
std::string table_name
Definition meta.hpp:57
Definition catalog.hpp:14
db::table get_table(std::string_view, std::string_view table_name) override
Definition catalog.hpp:34
std::vector< db::source > sources() override
May include nested data sources.
Definition catalog.hpp:17
std::generator< std::pair< tile, gil::any_image > > read(db::raster rast, std::vector< tile > ts) override
Definition catalog.hpp:100
void drop(std::string_view, std::string_view table_name) override
Definition catalog.hpp:90
std::vector< db::layer > layers() override
Definition catalog.hpp:25
db::rowset select(db::table const &tbl, db::bbox const &rq) override
Definition catalog.hpp:60
void commit() override
Definition catalog.hpp:121
dataset_ptr dataset
Definition catalog.hpp:15
db::table create(db::table const &tbl) override
Returns metadata reported by the backend after creation.
Definition catalog.hpp:85
void set_autocommit(bool on) override
Definition catalog.hpp:116
void write(db::raster const &rast, db::rect const &rect, gil::any_image_view img) override
rect coordinates are pixels.
Definition catalog.hpp:108
db::raster get_raster(db::layer const &) override
Definition catalog.hpp:95
void insert(db::table const &tbl, db::rowset const &rs, std::stop_token tok={}) override
Cancellation may leave a partially inserted range.
Definition catalog.hpp:75
db::rowset select(db::table const &tbl, db::page const &rq) override
Definition catalog.hpp:40