Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsdatumtransform.h 3 : : ------------------------ 4 : : begin : Dec 2017 5 : : copyright : (C) 2017 Nyall Dawson 6 : : email : nyall dot dawson at gmail dot com 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : #ifndef QGSDATUMTRANSFORM_H 18 : : #define QGSDATUMTRANSFORM_H 19 : : 20 : : #include "qgis_core.h" 21 : : #include "qgis_sip.h" 22 : : #include "qgsrectangle.h" 23 : : #include <QString> 24 : : #include <QList> 25 : : 26 : : class QgsCoordinateReferenceSystem; 27 : : 28 : : #ifndef SIP_RUN 29 : : struct PJconsts; 30 : : typedef struct PJconsts PJ; 31 : : #endif 32 : : 33 : : /** 34 : : * \brief Contains methods and classes relating the datum transformations. 35 : : * \ingroup core 36 : : * 37 : : * \see QgsCoordinateTransformContext 38 : : * \see QgsCoordinateTransform 39 : : * 40 : : * \since QGIS 3.0 41 : : */ 42 : : class CORE_EXPORT QgsDatumTransform 43 : : { 44 : : 45 : : public: 46 : : 47 : : /** 48 : : * Contains datum transform information. 49 : : * \deprecated Not used for builds based on Proj >= 6.0 50 : : * \since QGIS 3.0 51 : : */ 52 : : struct TransformPair 53 : : { 54 : : 55 : : /** 56 : : * Constructor for a TransformPair with the specified \a sourceTransformId 57 : : * and \a destinationTransformId transforms. 58 : : */ 59 : 0 : TransformPair( int sourceTransformId = -1, int destinationTransformId = -1 ) 60 : 0 : : sourceTransformId( sourceTransformId ) 61 : 0 : , destinationTransformId( destinationTransformId ) 62 : 0 : {} 63 : : 64 : : /** 65 : : * ID for the datum transform to use when projecting from the source CRS. 66 : : * \see QgsCoordinateTransform::datumTransformCrsInfo() 67 : : */ 68 : : int sourceTransformId = -1; 69 : : 70 : : /** 71 : : * ID for the datum transform to use when projecting to the destination CRS. 72 : : * \see QgsCoordinateTransform::datumTransformCrsInfo() 73 : : */ 74 : : int destinationTransformId = -1; 75 : : 76 : : bool operator==( QgsDatumTransform::TransformPair other ) const 77 : : { 78 : : return other.sourceTransformId == sourceTransformId && other.destinationTransformId == destinationTransformId; 79 : : } 80 : : 81 : : bool operator!=( QgsDatumTransform::TransformPair other ) const 82 : : { 83 : : return other.sourceTransformId != sourceTransformId || other.destinationTransformId != destinationTransformId; 84 : : } 85 : : 86 : : }; 87 : : 88 : : /** 89 : : * Contains datum transform information. 90 : : * \deprecated Not used on builds based on Proj >= 6.0 91 : : */ 92 : 0 : struct TransformInfo 93 : : { 94 : : //! Datum transform ID 95 : 0 : int datumTransformId = -1; 96 : : 97 : : //! EPSG code for the transform, or 0 if not found in EPSG database 98 : 0 : int epsgCode = 0; 99 : : 100 : : //! Source CRS auth ID 101 : : QString sourceCrsAuthId; 102 : : 103 : : //! Destination CRS auth ID 104 : : QString destinationCrsAuthId; 105 : : 106 : : //! Source CRS description 107 : : QString sourceCrsDescription; 108 : : 109 : : //! Destination CRS description 110 : : QString destinationCrsDescription; 111 : : 112 : : //! Transform remarks 113 : : QString remarks; 114 : : 115 : : //! Scope of transform 116 : : QString scope; 117 : : 118 : : //! True if transform is the preferred transform to use for the source/destination CRS combination 119 : 0 : bool preferred = false; 120 : : 121 : : //! True if transform is deprecated 122 : 0 : bool deprecated = false; 123 : : 124 : : }; 125 : : 126 : : 127 : : /** 128 : : * Contains information about a projection transformation grid file. 129 : : * \since QGIS 3.8 130 : : */ 131 : 0 : struct GridDetails 132 : : { 133 : : //! Short name of transform grid 134 : : QString shortName; 135 : : //! Full name of transform grid 136 : : QString fullName; 137 : : //! Name of package the grid is included within 138 : : QString packageName; 139 : : //! Url to download grid from 140 : : QString url; 141 : : //! TRUE if direct download of grid is possible 142 : 0 : bool directDownload = false; 143 : : //! TRUE if grid is available under an open license 144 : 0 : bool openLicense = false; 145 : : //! TRUE if grid is currently available for use 146 : 0 : bool isAvailable = false; 147 : : }; 148 : : 149 : : /** 150 : : * Contains information about a single coordinate operation. 151 : : * 152 : : * \note Only used in builds based on on Proj >= 6.2 153 : : * \since QGIS 3.10 154 : : */ 155 : 0 : struct SingleOperationDetails 156 : : { 157 : : //! Scope of operation, from EPSG registry database 158 : : QString scope; 159 : : 160 : : //! Remarks for operation, from EPSG registry database 161 : : QString remarks; 162 : : 163 : : //! Area of use, from EPSG registry database 164 : : QString areaOfUse; 165 : : 166 : : //! Authority name, e.g. EPSG. 167 : : QString authority; 168 : : 169 : : //! Authority code, e.g. "8447" (for EPSG:8447). 170 : : QString code; 171 : : }; 172 : : 173 : : /** 174 : : * Contains information about a coordinate transformation operation. 175 : : * 176 : : * \note Only used in builds based on on Proj >= 6.0 177 : : * \since QGIS 3.8 178 : : */ 179 : 4 : struct TransformDetails 180 : : { 181 : : //! Proj representation of transform operation 182 : : QString proj; 183 : : //! Display name of transform operation 184 : : QString name; 185 : : //! Transformation accuracy (in meters) 186 : 1 : double accuracy = 0; 187 : : 188 : : /** 189 : : * Authority name, e.g. EPSG. 190 : : * 191 : : * This is only available for single step coordinate operations. For multi-step operations, check 192 : : * \a operationDetails instead. 193 : : */ 194 : : QString authority; 195 : : 196 : : /** 197 : : * Identification code, e.g. "8447" (For EPSG:8447). 198 : : * 199 : : * This is only available for single step coordinate operations. For multi-step operations, check 200 : : * \a operationDetails instead. 201 : : */ 202 : : QString code; 203 : : 204 : : /** 205 : : * Scope of operation, from EPSG registry database. 206 : : * 207 : : * This is only available for single step coordinate operations. For multi-step operations, check 208 : : * \a operationDetails instead. 209 : : */ 210 : : QString scope; 211 : : 212 : : /** 213 : : * Remarks for operation, from EPSG registry database. 214 : : * 215 : : * This is only available for single step coordinate operations. For multi-step operations, check 216 : : * \a operationDetails instead. 217 : : */ 218 : : QString remarks; 219 : : 220 : : /** 221 : : * TRUE if operation is available. 222 : : * 223 : : * If FALSE, it likely means a transform grid is required which is not 224 : : * available. 225 : : */ 226 : 1 : bool isAvailable = false; 227 : : 228 : : /** 229 : : * Area of use string. 230 : : * 231 : : * This is only available for single step coordinate operations. For multi-step operations, check 232 : : * \a operationDetails instead. 233 : : * 234 : : * \see bounds 235 : : */ 236 : : QString areaOfUse; 237 : : 238 : : /** 239 : : * Valid bounds for the coordinate operation. 240 : : * \see areaOfUse 241 : : */ 242 : : QgsRectangle bounds; 243 : : 244 : : /** 245 : : * Contains a list of transform grids used by the operation. 246 : : */ 247 : : QList< QgsDatumTransform::GridDetails > grids; 248 : : 249 : : /** 250 : : * Contains information about the single operation steps used in the transform operation. 251 : : * 252 : : * \note Only used in builds based on on Proj >= 6.2 253 : : * \since QGIS 3.10 254 : : */ 255 : : QList< QgsDatumTransform::SingleOperationDetails > operationDetails; 256 : : }; 257 : : 258 : : /** 259 : : * Returns a list of coordinate operations available for transforming 260 : : * coordinates from the \a source to \a destination CRS. 261 : : * 262 : : * This list is sorted in order of preference, with the most preferable 263 : : * operation listed first. 264 : : * 265 : : * Not all operations may be available for use. Check QgsDatumTransform::TransformDetails::isAvailable 266 : : * first. Operations may require grid shift files which are not available on the local 267 : : * install. 268 : : * 269 : : * If \a includeSuperseded is TRUE, superseded (but not deprecated) transforms will be included 270 : : * in the results. This requires Proj >= 6.2. 271 : : * 272 : : * \note Requires Proj 6.0 or later. Builds based on earlier Proj versions will always return an empty list, 273 : : * and the deprecated API from QgsDatumTransform must be used instead. 274 : : * 275 : : * \since QGIS 3.8 276 : : */ 277 : : static QList< QgsDatumTransform::TransformDetails > operations( const QgsCoordinateReferenceSystem &source, const QgsCoordinateReferenceSystem &destination, bool includeSuperseded = false ); 278 : : 279 : : /** 280 : : * Returns a list of datum transformations which are available for the given \a source and \a destination CRS. 281 : : * \see datumTransformToProj() 282 : : * \see datumTransformInfo() 283 : : * 284 : : * \deprecated Not used for builds based on Proj >= 6.0 285 : : */ 286 : : Q_DECL_DEPRECATED static QList< QgsDatumTransform::TransformPair > datumTransformations( const QgsCoordinateReferenceSystem &source, const QgsCoordinateReferenceSystem &destination ) SIP_DEPRECATED; 287 : : 288 : : /** 289 : : * Returns a proj string representing the specified \a datumTransformId datum transform ID. 290 : : * \see datumTransformations() 291 : : * \see datumTransformInfo() 292 : : * \see projStringToDatumTransformId() 293 : : * 294 : : * \deprecated Not used for builds based on Proj >= 6.0 295 : : */ 296 : : Q_DECL_DEPRECATED static QString datumTransformToProj( int datumTransformId ) SIP_DEPRECATED; 297 : : 298 : : /** 299 : : * Returns the datum transform ID corresponding to a specified proj \a string. 300 : : * Returns -1 if matching datum ID was not found. 301 : : * \see datumTransformToProj() 302 : : * 303 : : * \deprecated Not used for builds based on Proj >= 6.0 304 : : */ 305 : : Q_DECL_DEPRECATED static int projStringToDatumTransformId( const QString &string ) SIP_DEPRECATED; 306 : : 307 : : /** 308 : : * Returns detailed information about the specified \a datumTransformId. 309 : : * If \a datumTransformId was not a valid transform ID, a TransformInfo with TransformInfo::datumTransformId of 310 : : * -1 will be returned. 311 : : * \see datumTransformations() 312 : : * \see datumTransformToProj() 313 : : * 314 : : * \deprecated Not used for builds based on Proj >= 6.0 315 : : */ 316 : : Q_DECL_DEPRECATED static QgsDatumTransform::TransformInfo datumTransformInfo( int datumTransformId ) SIP_DEPRECATED; 317 : : 318 : : #ifndef SIP_RUN 319 : : 320 : : /** 321 : : * Returns the transform details for a Proj coordinate operation \a op. 322 : : * 323 : : * \note Requires Proj 6.0 or later 324 : : * \since QGIS 3.8 325 : : */ 326 : : static QgsDatumTransform::TransformDetails transformDetailsFromPj( PJ *op ); 327 : : #endif 328 : : 329 : : private: 330 : : 331 : : static void searchDatumTransform( const QString &sql, QList< int > &transforms ); 332 : : 333 : : 334 : : }; 335 : : 336 : : #endif // QGSDATUMTRANSFORM_H