Coverage Report

Created: 2025-07-23 09:13

/src/gdal/frmts/pcidsk/sdk/pcidsk_gcp.h
Line
Count
Source (jump to first uncovered line)
1
/******************************************************************************
2
 *
3
 * Purpose: Declaration of the PCIDSK::GCP class.
4
 *
5
 ******************************************************************************
6
 * Copyright (c) 2009
7
 * PCI Geomatics, 90 Allstate Parkway, Markham, Ontario, Canada.
8
 *
9
 * SPDX-License-Identifier: MIT
10
 ****************************************************************************/
11
12
#ifndef INCLUDE_PCIDSK_SRC_GCP_H
13
#define INCLUDE_PCIDSK_SRC_GCP_H
14
15
#include "pcidsk_config.h"
16
17
#include <string>
18
#include <cstring>
19
20
namespace PCIDSK {
21
    /**
22
     * \brief PCIDSK Generic GCP Structure
23
     *
24
     * The PCIDSK::GCP class encompases all the possible field
25
     * combinations in the last two revisions of PCI's GCP segment
26
     * type.
27
     *
28
     * If a legacy GCP type is used, the additional information fields
29
     * will return empty values.
30
     */
31
    class PCIDSK_DLL GCP {
32
    public:
33
        GCP(double x, double y, double z,
34
            double line, double pix,
35
            std::string const& gcp_id,
36
            std::string const& map_units,
37
            std::string const& proj_parms = "",
38
            double xerr = 0.0, double yerr = 0.0, double zerr = 0.0,
39
            double line_err = 0.0, double pix_err = 0.0)
40
0
        {
41
0
            ground_point_[0] = x;
42
0
            ground_point_[1] = y;
43
0
            ground_point_[2] = z;
44
45
0
            ground_error_[0] = xerr;
46
0
            ground_error_[1] = yerr;
47
0
            ground_error_[2] = zerr;
48
49
0
            raster_point_[1] = line;
50
0
            raster_point_[0] = pix;
51
52
0
            raster_error_[1] = line_err;
53
0
            raster_error_[0] = pix_err;
54
55
0
            std::memset(gcp_id_, ' ', 64);
56
57
0
            std::strncpy(gcp_id_, gcp_id.c_str(),
58
0
                         gcp_id.size() > 64 ? 64 : gcp_id.size());
59
0
            gcp_id_[gcp_id.size() > 64 ? 64 : gcp_id.size()] = '\0';
60
61
0
            this->map_units_ = map_units;
62
0
            this->proj_parms_ = proj_parms;
63
64
0
            elevation_unit_ = EMetres;
65
0
            elevation_datum_ = EEllipsoidal;
66
0
            iscp_ = false; // default to GCPs
67
0
            isactive_ = true;
68
0
        }
69
70
        GCP(GCP const& gcp)
71
0
        {
72
0
            Copy(gcp);
73
0
        }
74
75
        GCP& operator=(GCP const& gcp)
76
0
        {
77
0
            Copy(gcp);
78
0
            return *this;
79
0
        }
80
81
        enum EElevationDatum
82
        {
83
            EMeanSeaLevel = 0,
84
            EEllipsoidal
85
        };
86
87
        enum EElevationUnit
88
        {
89
            EMetres = 0,
90
            EAmericanFeet,
91
            EInternationalFeet,
92
            EUnknown
93
        };
94
95
        void SetElevationUnit(EElevationUnit unit)
96
0
        {
97
0
            elevation_unit_ = unit;
98
0
        }
99
100
        void SetElevationDatum(EElevationDatum datum)
101
0
        {
102
0
            elevation_datum_ = datum;
103
0
        }
104
105
        void GetElevationInfo(EElevationDatum& datum, EElevationUnit& unit) const
106
0
        {
107
0
            unit = elevation_unit_;
108
0
            datum = elevation_datum_;
109
0
        }
110
111
        void SetCheckpoint(bool is_checkpoint)
112
0
        {
113
0
            if (is_checkpoint)
114
0
                isactive_ = true;  // active doesn't apply to check points
115
0
            iscp_ = is_checkpoint;
116
0
        }
117
118
        bool IsCheckPoint(void) const
119
0
        {
120
0
            return iscp_;
121
0
        }
122
123
        void SetActive(bool is_active)
124
0
        {
125
0
            isactive_ = is_active;
126
0
            iscp_ = false; // active doesn't apply to check points
127
0
        }
128
129
        bool IsActive(void) const
130
0
        {
131
0
            return isactive_;
132
0
        }
133
134
0
        double GetX() const { return ground_point_[0]; }
135
0
        double GetXErr() const { return ground_error_[0]; }
136
0
        double GetY() const { return ground_point_[1]; }
137
0
        double GetYErr() const { return ground_error_[1]; }
138
0
        double GetZ() const { return ground_point_[2]; }
139
0
        double GetZErr() const { return ground_error_[2]; }
140
141
0
        double GetPixel() const { return raster_point_[0]; }
142
0
        double GetPixelErr() const { return raster_error_[0]; }
143
0
        double GetLine() const { return raster_point_[1]; }
144
0
        double GetLineErr() const { return raster_error_[1]; }
145
146
        void GetMapUnits(std::string& map_units, std::string& proj_parms) const
147
0
        { map_units = map_units_; proj_parms = proj_parms_;}
148
        void SetMapUnits(std::string const& map_units,
149
0
            std::string const& proj_parms) { map_units_ = map_units;
150
0
                                             proj_parms_ = proj_parms;}
151
152
0
        const char* GetIDString(void) const { return gcp_id_; }
153
    private:
154
        void Copy(GCP const& gcp)
155
0
        {
156
0
            ground_point_[0] = gcp.ground_point_[0];
157
0
            ground_point_[1] = gcp.ground_point_[1];
158
0
            ground_point_[2] = gcp.ground_point_[2];
159
160
0
            ground_error_[0] = gcp.ground_error_[0];
161
0
            ground_error_[1] = gcp.ground_error_[1];
162
0
            ground_error_[2] = gcp.ground_error_[2];
163
164
0
            raster_point_[0] = gcp.raster_point_[0];
165
0
            raster_point_[1] = gcp.raster_point_[1];
166
167
0
            raster_error_[0] = gcp.raster_error_[0];
168
0
            raster_error_[1] = gcp.raster_error_[1];
169
170
0
            this->map_units_ = gcp.map_units_;
171
0
            this->proj_parms_ = gcp.proj_parms_;
172
0
            this->iscp_ = gcp.iscp_;
173
0
            this->isactive_ = gcp.isactive_;
174
175
0
            std::strncpy(this->gcp_id_, gcp.gcp_id_, 64);
176
177
0
            this->gcp_id_[64] = '\0';
178
179
0
            this->elevation_unit_ = gcp.elevation_unit_;
180
0
            this->elevation_datum_ = gcp.elevation_datum_;
181
0
        }
182
183
        bool iscp_; // true = checkpoint, false = GCP
184
        bool isactive_; // true = active, false = inactive
185
186
        EElevationUnit elevation_unit_;
187
        EElevationDatum elevation_datum_;
188
189
        // Point information
190
        double ground_point_[3];
191
        double ground_error_[3]; // variances
192
193
        double raster_point_[2];
194
        double raster_error_[2];
195
196
        char gcp_id_[65];
197
198
        std::string map_units_; ///< PCI mapunits string
199
        std::string proj_parms_;  ///< PCI projection parameters string
200
    };
201
} // end namespace PCIDSK
202
203
#endif // INCLUDE_PCIDSK_SRC_GCP_H
204