Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Project: FlatGeobuf driver 4 : * Purpose: GeometryReader class declarations. 5 : * Author: Björn Harrtell <bjorn at wololo dot org> 6 : * 7 : ****************************************************************************** 8 : * Copyright (c) 2018-2019, Björn Harrtell <bjorn at wololo dot org> 9 : * 10 : * SPDX-License-Identifier: MIT 11 : ****************************************************************************/ 12 : 13 : #ifndef FLATGEOBUF_GEOMETRYREADER_H_INCLUDED 14 : #define FLATGEOBUF_GEOMETRYREADER_H_INCLUDED 15 : 16 : #include "feature_generated.h" 17 : #include "ogr_p.h" 18 : 19 : namespace ogr_flatgeobuf 20 : { 21 : 22 : class GeometryReader 23 : { 24 : private: 25 : const FlatGeobuf::Geometry *m_geometry; 26 : const FlatGeobuf::GeometryType m_geometryType; 27 : const bool m_hasZ; 28 : const bool m_hasM; 29 : 30 : const double *m_xy = nullptr; 31 : uint32_t m_xylength = 0; 32 : uint32_t m_length = 0; 33 : uint32_t m_offset = 0; 34 : 35 : OGRPoint *readPoint(); 36 : OGRMultiPoint *readMultiPoint(); 37 : OGRErr readSimpleCurve(OGRSimpleCurve *c); 38 : OGRMultiLineString *readMultiLineString(); 39 : OGRPolygon *readPolygon(); 40 : OGRMultiPolygon *readMultiPolygon(); 41 : OGRGeometryCollection *readGeometryCollection(); 42 : OGRCompoundCurve *readCompoundCurve(); 43 : OGRCurvePolygon *readCurvePolygon(); 44 : OGRMultiCurve *readMultiCurve(); 45 : OGRMultiSurface *readMultiSurface(); 46 : OGRPolyhedralSurface *readPolyhedralSurface(); 47 : OGRTriangulatedSurface *readTIN(); 48 : OGRTriangle *readTriangle(); 49 : 50 76 : OGRGeometry *readPart(const FlatGeobuf::Geometry *part) 51 : { 52 76 : return GeometryReader(part, m_hasZ, m_hasM).read(); 53 : } 54 : 55 44 : OGRGeometry *readPart(const FlatGeobuf::Geometry *part, 56 : const FlatGeobuf::GeometryType geometryType) 57 : { 58 44 : return GeometryReader(part, geometryType, m_hasZ, m_hasM).read(); 59 : } 60 : 61 551 : template <class T> T *readSimpleCurve(const bool halfLength = false) 62 : { 63 551 : if (halfLength) 64 58 : m_length = m_length / 2; 65 551 : const auto csc = new T(); 66 551 : if (readSimpleCurve(csc) != OGRERR_NONE) 67 : { 68 0 : delete csc; 69 0 : return nullptr; 70 : } 71 551 : return csc; 72 : } 73 : 74 : public: 75 733 : GeometryReader(const FlatGeobuf::Geometry *geometry, 76 : const FlatGeobuf::GeometryType geometryType, const bool hasZ, 77 : const bool hasM) 78 733 : : m_geometry(geometry), m_geometryType(geometryType), m_hasZ(hasZ), 79 733 : m_hasM(hasM) 80 : { 81 733 : } 82 : 83 76 : GeometryReader(const FlatGeobuf::Geometry *geometry, const bool hasZ, 84 : const bool hasM) 85 152 : : m_geometry(geometry), m_geometryType(geometry->type()), m_hasZ(hasZ), 86 76 : m_hasM(hasM) 87 : { 88 76 : } 89 : 90 : OGRGeometry *read(); 91 : }; 92 : 93 : } // namespace ogr_flatgeobuf 94 : 95 : #endif /* ndef FLATGEOBUF_GEOMETRYREADER_H_INCLUDED */