2#include <gdal/ogr_geometry.h>
7namespace fishnet::geometry::__impl{
12enum class OGROwnership {
27struct OGRGeometryDeleter {
28 OGROwnership ownership = OGROwnership::geometry;
30 void operator()(OGRGeometry* geom)
const {
31 if(not geom || ownership == OGROwnership::none)
33 if(ownership == OGROwnership::shellOnly){
36 auto * shell = geom->toPolygon();
37 for(
int i = shell->getNumInteriorRings(); i >= 0; --i)
38 shell->removeRing(i,
false);
40 OGRGeometryFactory::destroyGeometry(geom);
48using OGRUniquePtr = std::unique_ptr<T, __impl::OGRGeometryDeleter>;
59 return OGRUniquePtr<T>(geometry, OGRGeometryDeleter{OGROwnership::none});
71 auto * shell =
static_cast<OGRPolygon*
>(OGRGeometryFactory::createGeometry(wkbPolygon));
72 shell->addRingDirectly(ring);
82template<
typename T>
requires std::is_base_of_v<OGRGeometry, T>
90 assert(this->geomPtr !=
nullptr);
105 geomPtr = std::move(other.geomPtr);
111 if(this->geomPtr == other.geomPtr)
return true;
112 return geomPtr->Equals(other.geomPtr.get());
120 size_t nSize =
geomPtr->WkbSize();
121 std::vector<unsigned char> pabyData(nSize);
122 geomPtr->exportToWkb(pabyData.data());
123 std::string_view bytes(
reinterpret_cast<const char*
>(pabyData.data()), nSize);
124 return std::hash<std::string_view>{}(bytes);
140 case geometry::GeometryType::POINT:
return wkbPoint;
141 case geometry::GeometryType::POLYGON:
return wkbPolygon;
142 case geometry::GeometryType::RING:
return wkbLinearRing;
143 case geometry::GeometryType::MULTIPOLYGON:
return wkbMultiPolygon;
145 throw std::invalid_argument(
"Geometry type: "+
std::to_string(type)+
" could not be converted into wkb format");
150 case wkbPoint:
return geometry::GeometryType::POINT;
153 case wkbLineString:
return geometry::GeometryType::RING;
154 case wkbPolygon:
return geometry::GeometryType::POLYGON;
155 case wkbMultiPolygon:
return geometry::GeometryType::MULTIPOLYGON;
156 default:
throw std::invalid_argument(
"wkbGeometryType could not be converted into a Fishnet geometry type");
Convert fishnet::geometry::GeometryType <-> OGRwkbGeometryType.
Definition OGRAdapterBase.hpp:135
static OGRwkbGeometryType toWKB(GeometryType type)
Definition OGRAdapterBase.hpp:137
static geometry::GeometryType fromWKB(OGRwkbGeometryType type)
Definition OGRAdapterBase.hpp:148
Base class for OGR geometry adapters, which owns an OGR geometry.
Definition OGRAdapterBase.hpp:83
OGRAdapterBase(OGRAdapterBase &&other) noexcept
Definition OGRAdapterBase.hpp:93
std::string toString() const
Definition OGRAdapterBase.hpp:127
OGRAdapterBase(const OGRAdapterBase &other)
Definition OGRAdapterBase.hpp:95
T * raw() const noexcept
Definition OGRAdapterBase.hpp:115
size_t hash() const noexcept
Definition OGRAdapterBase.hpp:119
double numeric_type
Definition OGRAdapterBase.hpp:87
OGRAdapterBase & operator=(const OGRAdapterBase &other)
Definition OGRAdapterBase.hpp:97
bool operator==(const OGRAdapterBase &other) const noexcept
Definition OGRAdapterBase.hpp:110
OGRAdapterBase(OGRUniquePtr< T > &&geomPtr)
Definition OGRAdapterBase.hpp:89
OGRUniquePtr< T > geomPtr
Definition OGRAdapterBase.hpp:85
OGRAdapterBase & operator=(OGRAdapterBase &&other) noexcept
Definition OGRAdapterBase.hpp:103
Definition BoundingBoxWrapper.hpp:5
std::unique_ptr< T, __impl::OGRGeometryDeleter > OGRUniquePtr
Definition OGRAdapterBase.hpp:48
GeometryType
Definition GeometryBase.hpp:6
static string to_string(fishnet::geometry::GeometryType type) noexcept
Definition GeometryBase.hpp:22