diff --git a/filters/OverlayFilter.cpp b/filters/OverlayFilter.cpp index 5246779..590ddcc 100644 --- a/filters/OverlayFilter.cpp +++ b/filters/OverlayFilter.cpp @@ -93,7 +93,7 @@ void OverlayFilter::prepared(PointTableRef table) void OverlayFilter::ready(PointTableRef table) { m_ds = OGRDSPtr(OGROpen(m_datasource.c_str(), 0, 0), - [](void *p){ if (p) ::OGR_DS_Destroy(p); }); + [](OGRDSPtr::element_type *p){ if (p) ::OGR_DS_Destroy(p); }); if (!m_ds) throwError("Unable to open data source '" + m_datasource + "'"); @@ -114,7 +114,7 @@ void OverlayFilter::ready(PointTableRef table) OGR_L_SetSpatialFilter(m_lyr, g.getOGRHandle()); } - auto featureDeleter = [](void *p) + auto featureDeleter = [](OGRFeaturePtr::element_type *p) { if (p) ::OGR_F_Destroy(p); diff --git a/filters/OverlayFilter.hpp b/filters/OverlayFilter.hpp index c9995d7..141bf51 100644 --- a/filters/OverlayFilter.hpp +++ b/filters/OverlayFilter.hpp @@ -41,6 +41,7 @@ #include #include #include +#include // Get GDAL's forward decls if available // otherwise make our own @@ -58,9 +59,13 @@ namespace gdal class ErrorHandler; } +#if __has_include() +typedef std::shared_ptr::type> OGRDSPtr; +typedef std::shared_ptr::type> OGRFeaturePtr; +#else typedef std::shared_ptr OGRDSPtr; typedef std::shared_ptr OGRFeaturePtr; -typedef std::shared_ptr OGRGeometryPtr; +#endif class Arg; @@ -90,8 +95,6 @@ private: OverlayFilter& operator=(const OverlayFilter&) = delete; OverlayFilter(const OverlayFilter&) = delete; - typedef std::shared_ptr OGRDSPtr; - OGRDSPtr m_ds; OGRLayerH m_lyr; std::string m_dimName; diff --git a/io/TIndexReader.cpp b/io/TIndexReader.cpp index 0d9c4ca..551b3ea 100644 --- a/io/TIndexReader.cpp +++ b/io/TIndexReader.cpp @@ -89,7 +89,7 @@ TIndexReader::FieldIndexes TIndexReader::getFields() { FieldIndexes indexes; - void *fDefn = OGR_L_GetLayerDefn(m_layer); + OGRFeatureDefnH fDefn = OGR_L_GetLayerDefn(m_layer); indexes.m_filename = OGR_FD_GetFieldIndex(fDefn, m_args->m_tileIndexColumnName.c_str()); diff --git a/io/TIndexReader.hpp b/io/TIndexReader.hpp index 1188a1c..ccedfb6 100644 --- a/io/TIndexReader.hpp +++ b/io/TIndexReader.hpp @@ -41,6 +41,15 @@ #include +// Get GDAL's forward decls if available +// otherwise make our own +#if __has_include() +#include +#else +using OGRDataSourceH = void *; +using OGRLayerH = void *; +#endif + namespace pdal { @@ -88,8 +97,8 @@ private: std::unique_ptr m_args; std::unique_ptr m_out_ref; - void *m_dataset; - void *m_layer; + OGRDataSourceH m_dataset; + OGRLayerH m_layer; StageFactory m_factory; MergeFilter m_merge; diff --git a/kernels/TIndexKernel.cpp b/kernels/TIndexKernel.cpp index 1f43c75..82d6c81 100644 --- a/kernels/TIndexKernel.cpp +++ b/kernels/TIndexKernel.cpp @@ -723,7 +723,7 @@ TIndexKernel::FieldIndexes TIndexKernel::getFields() { FieldIndexes indexes; - void *fDefn = OGR_L_GetLayerDefn(m_layer); + OGRFeatureDefnH fDefn = OGR_L_GetLayerDefn(m_layer); indexes.m_filename = OGR_FD_GetFieldIndex(fDefn, m_tileIndexColumnName.c_str()); diff --git a/kernels/TIndexKernel.hpp b/kernels/TIndexKernel.hpp index a6d8930..72849f7 100644 --- a/kernels/TIndexKernel.hpp +++ b/kernels/TIndexKernel.hpp @@ -40,6 +40,15 @@ #include #include +// Get GDAL's forward decls if available +// otherwise make our own +#if __has_include() +#include +#else +using OGRDataSourceH = void *; +using OGRLayerH = void *; +#endif + namespace pdal { class Polygon; @@ -118,8 +127,8 @@ private: BOX2D m_bounds; bool m_absPath; - void *m_dataset; - void *m_layer; + OGRDataSourceH m_dataset; + OGRLayerH m_layer; std::string m_tgtSrsString; std::string m_assignSrsString; bool m_fastBoundary; diff --git a/kernels/private/density/OGR.hpp b/kernels/private/density/OGR.hpp index 243a67a..f61ad4e 100644 --- a/kernels/private/density/OGR.hpp +++ b/kernels/private/density/OGR.hpp @@ -35,6 +35,15 @@ #include +// Get GDAL's forward decls if available +// otherwise make our own +#if __has_include() +#include +#else +using OGRDataSourceH = void *; +using OGRLayerH = void *; +#endif + namespace hexer { class HexGrid; @@ -45,9 +54,6 @@ namespace pdal class OGR { - using OGRDataSourceH = void *; - using OGRLayerH = void *; - public: OGR(std::string const& filename, const std::string& srs, std::string driver = "ESRI Shapefile", std::string layerName =""); diff --git a/pdal/Geometry.cpp b/pdal/Geometry.cpp index c598e66..fec6107 100644 --- a/pdal/Geometry.cpp +++ b/pdal/Geometry.cpp @@ -275,11 +275,11 @@ Geometry Geometry::getRing() const { throwNoGeos(); - int count = OGR_G_GetGeometryCount(m_geom.get()); + int count = OGR_G_GetGeometryCount(gdal::toHandle(m_geom.get())); if (count) { - OGRGeometryH ring = OGR_G_Clone(OGR_G_GetGeometryRef(m_geom.get(), 0)); + OGRGeometryH ring = OGR_G_Clone(OGR_G_GetGeometryRef(gdal::toHandle(m_geom.get()), 0)); OGRGeometryH linestring = OGR_G_ForceToLineString(ring); return Geometry(linestring, getSpatialReference()); diff --git a/pdal/SpatialReference.cpp b/pdal/SpatialReference.cpp index cf7abaa..7aec1b6 100644 --- a/pdal/SpatialReference.cpp +++ b/pdal/SpatialReference.cpp @@ -53,22 +53,13 @@ namespace { -struct OGRDeleter -{ - void operator()(OGRSpatialReference* o) - { - OSRDestroySpatialReference(o); - }; -}; - using OGRScopedSpatialReference = - std::unique_ptr; + std::unique_ptr; OGRScopedSpatialReference ogrCreateSrs(std::string s = "", double epoch=0.0) { OGRScopedSpatialReference r( - static_cast( - OSRNewSpatialReference(s.size() ? s.c_str() : nullptr))); + new OGRSpatialReference(s.size() ? s.c_str() : nullptr)); if (!pdal::Utils::compare_approx(epoch, 0.0f, 0.00001f)) { #if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3,4,0) @@ -129,7 +120,7 @@ bool SpatialReference::valid() const { OGRSpatialReference current(m_wkt.data()); - return OSRValidate(¤t) == OGRERR_NONE; + return current.Validate() == OGRERR_NONE; } @@ -367,7 +358,7 @@ bool SpatialReference::equals(const SpatialReference& input) const if (!current || !other) return false; - int output = OSRIsSame(current.get(), other.get()); + int output = current.get()->IsSame(other.get()); return (output == 1); } @@ -398,7 +389,7 @@ bool SpatialReference::isGeographic() const if (!current) return false; - bool output = OSRIsGeographic(current.get()); + bool output = current.get()->IsGeographic(); return output; } @@ -409,7 +400,7 @@ bool SpatialReference::isGeocentric() const if (!current) return false; - bool output = OSRIsGeocentric(current.get()); + bool output = current.get()->IsGeocentric(); return output; } @@ -420,7 +411,7 @@ bool SpatialReference::isProjected() const if (!current) return false; - bool output = OSRIsProjected(current.get()); + bool output = current.get()->IsProjected(); return output; } @@ -573,7 +564,7 @@ int SpatialReference::getUTMZone() const throw pdal_error("Could not fetch current SRS"); int north(0); - int zone = OSRGetUTMZone(current.get(), &north); + int zone = current.get()->GetUTMZone(&north); return (north ? 1 : -1) * zone; } diff --git a/pdal/private/gdal/GDALUtils.cpp b/pdal/private/gdal/GDALUtils.cpp index b9d295c..04b7c17 100644 --- a/pdal/private/gdal/GDALUtils.cpp +++ b/pdal/private/gdal/GDALUtils.cpp @@ -357,7 +357,7 @@ std::vector getPolygons(const OGRSpecOptions& ogr) throw pdal_error("Unable to execute OGR SQL query."); SpatialRef sref; - sref.setFromLayer(poLayer); + sref.setFromLayer(reinterpret_cast(poLayer)); ds->ReleaseResultSet(poLayer); poly.update(options.at("geometry").get()); @@ -380,7 +380,7 @@ std::vector getPolygons(const OGRSpecOptions& ogr) std::vector polys; while ((poFeature = poLayer->GetNextFeature()) != NULL) { - polys.emplace_back(poFeature->GetGeometryRef()); + polys.emplace_back(reinterpret_cast(poFeature->GetGeometryRef())); OGRFeature::DestroyFeature( poFeature ); } diff --git a/pdal/private/gdal/SpatialRef.cpp b/pdal/private/gdal/SpatialRef.cpp index 049867e..63bba9e 100644 --- a/pdal/private/gdal/SpatialRef.cpp +++ b/pdal/private/gdal/SpatialRef.cpp @@ -106,9 +106,9 @@ bool SpatialRef::empty() const return wkt().empty(); } -void SpatialRef::newRef(void *v) +void SpatialRef::newRef(OGRSpatialReferenceH v) { - m_ref = RefPtr(v, [](void* t){ OSRDestroySpatialReference(t); } ); + m_ref = RefPtr(v, [](OGRSpatialReferenceH t){ OSRDestroySpatialReference(t); } ); } } // namespace gdal diff --git a/pdal/private/gdal/SpatialRef.hpp b/pdal/private/gdal/SpatialRef.hpp index 4d2b34d..80a114c 100644 --- a/pdal/private/gdal/SpatialRef.hpp +++ b/pdal/private/gdal/SpatialRef.hpp @@ -35,6 +35,7 @@ #pragma once #include +#include // Get GDAL's forward decls if available // otherwise make our own @@ -42,6 +43,7 @@ #include #else using OGRLayerH = void *; + using OGRSpatialReferenceH = void *; #endif @@ -53,7 +55,7 @@ namespace gdal class SpatialRef { - typedef std::shared_ptr RefPtr; + typedef std::shared_ptr::type> RefPtr; public: SpatialRef(); SpatialRef(const std::string& srs); @@ -65,7 +67,7 @@ public: bool empty() const; private: - void newRef(void *v); + void newRef(OGRSpatialReferenceH v); RefPtr m_ref; };