@@ -269,6 +269,69 @@ PYBIND11_MODULE(_pybind11_geobuf, m)
269269 auto geojson = m.def_submodule (" geojson" );
270270 cubao::bind_geojson (geojson);
271271
272+ using namespace FlatGeobuf ;
273+ py::class_<NodeItem>(m, " NodeItem" , py::module_local ())
274+ .def_property_readonly (" min_x" ,
275+ [](const NodeItem &self) { return self.minX ; })
276+ .def_property_readonly (" min_y" ,
277+ [](const NodeItem &self) { return self.minY ; })
278+ .def_property_readonly (" max_x" ,
279+ [](const NodeItem &self) { return self.maxX ; })
280+ .def_property_readonly (" max_y" ,
281+ [](const NodeItem &self) { return self.maxY ; })
282+ .def_property_readonly (" offset" ,
283+ [](const NodeItem &self) { return self.offset ; })
284+ .def_property_readonly (
285+ " width" , [](const NodeItem &self) { return self.width (); })
286+ .def_property_readonly (
287+ " height" , [](const NodeItem &self) { return self.height (); })
288+ //
289+ .def (" expand" , &NodeItem::expand, " other" _a)
290+ .def (" intersects" , &NodeItem::intersects, " other" _a)
291+ .def (py::self == py::self)
292+ .def (py::self != py::self)
293+ .def (" to_numpy" ,
294+ [](const NodeItem &self) -> Eigen::Vector4d {
295+ return {self.minX , self.minY , self.maxX , self.maxY };
296+ })
297+ //
298+ ;
299+
300+ using PackedRTree = FlatGeobuf::PackedRTree;
301+ py::class_<PackedRTree>(m, " PackedRTree" , py::module_local ())
302+ .def (
303+ " search" ,
304+ [](const PackedRTree &self, double minX, double minY, double maxX,
305+ double maxY) {
306+ auto hits = self.search (minX, minY, maxX, maxY);
307+ std::vector<size_t > ret;
308+ ret.reserve (hits.size ());
309+ for (auto &h : hits) {
310+ ret.push_back (h.offset );
311+ }
312+ return ret;
313+ },
314+ " min_x" _a, " min_y" _a, " max_x" _a, " max_y" _a)
315+ .def_property_readonly (
316+ " size" , [](const PackedRTree &self) { return self.size (); })
317+ .def_property_readonly (" extent" ,
318+ [](const PackedRTree &self) {
319+ auto bbox = self.getExtent ();
320+ return Eigen::Vector4d (bbox.minX , bbox.minY ,
321+ bbox.maxX , bbox.maxY );
322+ })
323+ .def_property_readonly (
324+ " num_items" ,
325+ [](const PackedRTree &self) { return self.getNumItems (); })
326+ .def_property_readonly (
327+ " num_nodes" ,
328+ [](const PackedRTree &self) { return self.getNumNodes (); })
329+ .def_property_readonly (
330+ " node_size" ,
331+ [](const PackedRTree &self) { return self.getNodeSize (); })
332+ //
333+ ;
334+
272335 using Planet = cubao::Planet;
273336 py::class_<Planet>(m, " Planet" , py::module_local ())
274337 .def (py::init<>())
@@ -281,6 +344,7 @@ PYBIND11_MODULE(_pybind11_geobuf, m)
281344 .def (" build" , &Planet::build, py::kw_only (),
282345 " per_line_segment" _a = false , " force" _a = false )
283346 .def (" query" , &Planet::query, " min" _a, " max" _a)
347+ .def (" packed_rtree" , &Planet::packed_rtree, rvp::reference_internal)
284348 .def (" copy" , &Planet::copy)
285349 .def (" crop" , &Planet::crop, " polygon" _a, py::kw_only (),
286350 " clipping_mode" _a = " longest" , //
@@ -303,6 +367,15 @@ PYBIND11_MODULE(_pybind11_geobuf, m)
303367 " offsets" , [](const GeobufIndex &self) { return self.offsets ; })
304368 .def_property_readonly (" ids" ,
305369 [](const GeobufIndex &self) { return self.ids ; })
370+ .def_property_readonly (
371+ " packed_rtree" ,
372+ [](const GeobufIndex &self) -> const FlatGeobuf::PackedRTree * {
373+ if (!self.packed_rtree ) {
374+ return nullptr ;
375+ }
376+ return &*self.packed_rtree ;
377+ },
378+ rvp::reference_internal)
306379 //
307380 .def (" init" , py::overload_cast<const std::string &>(&GeobufIndex::init),
308381 " index_bytes" _a)
0 commit comments