diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2021-12-02 23:08:35 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-12-02 23:08:35 +0100 |
| commit | d9d55ed203de5e37d8a901beeea9cad37a74f1d4 (patch) | |
| tree | 6d80fbe8d854bd8ced2f4700fbcd2b1ecaa0d7e2 | |
| parent | 30f059a018a6ae862c18ec128e0ace14193ad5ee (diff) | |
| parent | 8a156921b9483d82693c7a9e426c629a941fcce1 (diff) | |
| download | PROJ-d9d55ed203de5e37d8a901beeea9cad37a74f1d4.tar.gz PROJ-d9d55ed203de5e37d8a901beeea9cad37a74f1d4.zip | |
Merge pull request #2967 from OSGeo/backport-2966-to-8.2
[Backport 8.2] Cache result of proj_get_type() to help for performance of proj_factors() (fixes #2965)
| -rw-r--r-- | src/iso19111/c_api.cpp | 170 | ||||
| -rw-r--r-- | src/proj_internal.h | 3 |
2 files changed, 92 insertions, 81 deletions
diff --git a/src/iso19111/c_api.cpp b/src/iso19111/c_api.cpp index 70f589b3..eab23319 100644 --- a/src/iso19111/c_api.cpp +++ b/src/iso19111/c_api.cpp @@ -1150,98 +1150,106 @@ PJ_TYPE proj_get_type(const PJ *obj) { if (!obj || !obj->iso_obj) { return PJ_TYPE_UNKNOWN; } - auto ptr = obj->iso_obj.get(); - if (dynamic_cast<Ellipsoid *>(ptr)) { - return PJ_TYPE_ELLIPSOID; - } + if (obj->type != PJ_TYPE_UNKNOWN) + return obj->type; - if (dynamic_cast<PrimeMeridian *>(ptr)) { - return PJ_TYPE_PRIME_MERIDIAN; - } + const auto getType = [&obj]() { + auto ptr = obj->iso_obj.get(); + if (dynamic_cast<Ellipsoid *>(ptr)) { + return PJ_TYPE_ELLIPSOID; + } - if (dynamic_cast<DynamicGeodeticReferenceFrame *>(ptr)) { - return PJ_TYPE_DYNAMIC_GEODETIC_REFERENCE_FRAME; - } - if (dynamic_cast<GeodeticReferenceFrame *>(ptr)) { - return PJ_TYPE_GEODETIC_REFERENCE_FRAME; - } - if (dynamic_cast<DynamicVerticalReferenceFrame *>(ptr)) { - return PJ_TYPE_DYNAMIC_VERTICAL_REFERENCE_FRAME; - } - if (dynamic_cast<VerticalReferenceFrame *>(ptr)) { - return PJ_TYPE_VERTICAL_REFERENCE_FRAME; - } - if (dynamic_cast<DatumEnsemble *>(ptr)) { - return PJ_TYPE_DATUM_ENSEMBLE; - } - if (dynamic_cast<TemporalDatum *>(ptr)) { - return PJ_TYPE_TEMPORAL_DATUM; - } - if (dynamic_cast<EngineeringDatum *>(ptr)) { - return PJ_TYPE_ENGINEERING_DATUM; - } - if (dynamic_cast<ParametricDatum *>(ptr)) { - return PJ_TYPE_PARAMETRIC_DATUM; - } + if (dynamic_cast<PrimeMeridian *>(ptr)) { + return PJ_TYPE_PRIME_MERIDIAN; + } - { - auto crs = dynamic_cast<GeographicCRS *>(ptr); - if (crs) { - if (crs->coordinateSystem()->axisList().size() == 2) { - return PJ_TYPE_GEOGRAPHIC_2D_CRS; - } else { - return PJ_TYPE_GEOGRAPHIC_3D_CRS; + if (dynamic_cast<DynamicGeodeticReferenceFrame *>(ptr)) { + return PJ_TYPE_DYNAMIC_GEODETIC_REFERENCE_FRAME; + } + if (dynamic_cast<GeodeticReferenceFrame *>(ptr)) { + return PJ_TYPE_GEODETIC_REFERENCE_FRAME; + } + if (dynamic_cast<DynamicVerticalReferenceFrame *>(ptr)) { + return PJ_TYPE_DYNAMIC_VERTICAL_REFERENCE_FRAME; + } + if (dynamic_cast<VerticalReferenceFrame *>(ptr)) { + return PJ_TYPE_VERTICAL_REFERENCE_FRAME; + } + if (dynamic_cast<DatumEnsemble *>(ptr)) { + return PJ_TYPE_DATUM_ENSEMBLE; + } + if (dynamic_cast<TemporalDatum *>(ptr)) { + return PJ_TYPE_TEMPORAL_DATUM; + } + if (dynamic_cast<EngineeringDatum *>(ptr)) { + return PJ_TYPE_ENGINEERING_DATUM; + } + if (dynamic_cast<ParametricDatum *>(ptr)) { + return PJ_TYPE_PARAMETRIC_DATUM; + } + + { + auto crs = dynamic_cast<GeographicCRS *>(ptr); + if (crs) { + if (crs->coordinateSystem()->axisList().size() == 2) { + return PJ_TYPE_GEOGRAPHIC_2D_CRS; + } else { + return PJ_TYPE_GEOGRAPHIC_3D_CRS; + } } } - } - { - auto crs = dynamic_cast<GeodeticCRS *>(ptr); - if (crs) { - if (crs->isGeocentric()) { - return PJ_TYPE_GEOCENTRIC_CRS; - } else { - return PJ_TYPE_GEODETIC_CRS; + { + auto crs = dynamic_cast<GeodeticCRS *>(ptr); + if (crs) { + if (crs->isGeocentric()) { + return PJ_TYPE_GEOCENTRIC_CRS; + } else { + return PJ_TYPE_GEODETIC_CRS; + } } } - } - if (dynamic_cast<VerticalCRS *>(ptr)) { - return PJ_TYPE_VERTICAL_CRS; - } - if (dynamic_cast<ProjectedCRS *>(ptr)) { - return PJ_TYPE_PROJECTED_CRS; - } - if (dynamic_cast<CompoundCRS *>(ptr)) { - return PJ_TYPE_COMPOUND_CRS; - } - if (dynamic_cast<TemporalCRS *>(ptr)) { - return PJ_TYPE_TEMPORAL_CRS; - } - if (dynamic_cast<EngineeringCRS *>(ptr)) { - return PJ_TYPE_ENGINEERING_CRS; - } - if (dynamic_cast<BoundCRS *>(ptr)) { - return PJ_TYPE_BOUND_CRS; - } - if (dynamic_cast<CRS *>(ptr)) { - return PJ_TYPE_OTHER_CRS; - } + if (dynamic_cast<VerticalCRS *>(ptr)) { + return PJ_TYPE_VERTICAL_CRS; + } + if (dynamic_cast<ProjectedCRS *>(ptr)) { + return PJ_TYPE_PROJECTED_CRS; + } + if (dynamic_cast<CompoundCRS *>(ptr)) { + return PJ_TYPE_COMPOUND_CRS; + } + if (dynamic_cast<TemporalCRS *>(ptr)) { + return PJ_TYPE_TEMPORAL_CRS; + } + if (dynamic_cast<EngineeringCRS *>(ptr)) { + return PJ_TYPE_ENGINEERING_CRS; + } + if (dynamic_cast<BoundCRS *>(ptr)) { + return PJ_TYPE_BOUND_CRS; + } + if (dynamic_cast<CRS *>(ptr)) { + return PJ_TYPE_OTHER_CRS; + } - if (dynamic_cast<Conversion *>(ptr)) { - return PJ_TYPE_CONVERSION; - } - if (dynamic_cast<Transformation *>(ptr)) { - return PJ_TYPE_TRANSFORMATION; - } - if (dynamic_cast<ConcatenatedOperation *>(ptr)) { - return PJ_TYPE_CONCATENATED_OPERATION; - } - if (dynamic_cast<CoordinateOperation *>(ptr)) { - return PJ_TYPE_OTHER_COORDINATE_OPERATION; - } + if (dynamic_cast<Conversion *>(ptr)) { + return PJ_TYPE_CONVERSION; + } + if (dynamic_cast<Transformation *>(ptr)) { + return PJ_TYPE_TRANSFORMATION; + } + if (dynamic_cast<ConcatenatedOperation *>(ptr)) { + return PJ_TYPE_CONCATENATED_OPERATION; + } + if (dynamic_cast<CoordinateOperation *>(ptr)) { + return PJ_TYPE_OTHER_COORDINATE_OPERATION; + } + + return PJ_TYPE_UNKNOWN; + }; - return PJ_TYPE_UNKNOWN; + obj->type = getType(); + return obj->type; } // --------------------------------------------------------------------------- diff --git a/src/proj_internal.h b/src/proj_internal.h index 6edb6aec..2b2fb959 100644 --- a/src/proj_internal.h +++ b/src/proj_internal.h @@ -573,6 +573,9 @@ struct PJconsts { mutable bool gridsNeededAsked = false; mutable std::vector<NS_PROJ::operation::GridDescription> gridsNeeded{}; + // cache pj_get_type() result to help for repeated calls to proj_factors() + mutable PJ_TYPE type = PJ_TYPE_UNKNOWN; + /************************************************************************************* proj_create_crs_to_crs() alternative coordinate operations **************************************************************************************/ |
