1 // Boost.Geometry
2 // This file is manually converted from PROJ4
3
4 // This file was modified by Oracle on 2017, 2018.
5 // Modifications copyright (c) 2017-2018, Oracle and/or its affiliates.
6 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
7
8 // Use, modification and distribution is subject to the Boost Software License,
9 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
10 // http://www.boost.org/LICENSE_1_0.txt)
11
12 // This file is converted from PROJ4, http://trac.osgeo.org/proj
13 // PROJ4 is originally written by Gerald Evenden (then of the USGS)
14 // PROJ4 is maintained by Frank Warmerdam
15 // This file was converted to Geometry Library by Adam Wulkiewicz
16
17 // Original copyright notice:
18
19 // None
20
21 /* list of projection system pj_errno values */
22
23 #ifndef BOOST_GEOMETRY_PROJECTIONS_IMPL_PJ_STRERRNO_HPP
24 #define BOOST_GEOMETRY_PROJECTIONS_IMPL_PJ_STRERRNO_HPP
25
26 #include <cerrno>
27 #include <cstring>
28 #include <sstream>
29 #include <string>
30
31 namespace boost { namespace geometry { namespace projections
32 {
33
34 namespace detail
35 {
36
37 // Originally defined in projects.hpp
38 /* library errors */
39 enum error_type
40 {
41 error_no_args = -1,
42 error_no_option_in_init_file = -2,
43 error_no_colon_in_init_string = -3,
44 error_proj_not_named = -4,
45 error_unknown_projection_id = -5,
46 error_eccentricity_is_one = -6,
47 error_unknow_unit_id = -7,
48 error_invalid_boolean_param = -8,
49 error_unknown_ellp_param = -9,
50 error_rev_flattening_is_zero = -10,
51 error_ref_rad_larger_than_90 = -11,
52 error_es_less_than_zero = -12,
53 error_major_axis_not_given = -13,
54 error_lat_or_lon_exceed_limit = -14,
55 error_invalid_x_or_y = -15,
56 error_wrong_format_dms_value = -16,
57 error_non_conv_inv_meri_dist = -17,
58 error_non_con_inv_phi2 = -18,
59 error_acos_asin_arg_too_large = -19,
60 error_tolerance_condition = -20,
61 error_conic_lat_equal = -21,
62 error_lat_larger_than_90 = -22,
63 error_lat1_is_zero = -23,
64 error_lat_ts_larger_than_90 = -24,
65 error_control_point_no_dist = -25,
66 error_no_rotation_proj = -26,
67 error_w_or_m_zero_or_less = -27,
68 error_lsat_not_in_range = -28,
69 error_path_not_in_range = -29,
70 error_h_less_than_zero = -30,
71 error_k_less_than_zero = -31,
72 error_lat_1_or_2_zero_or_90 = -32,
73 error_lat_0_or_alpha_eq_90 = -33,
74 error_ellipsoid_use_required = -34,
75 error_invalid_utm_zone = -35,
76 error_tcheby_val_out_of_range = -36,
77 error_failed_to_find_proj = -37,
78 error_failed_to_load_grid = -38,
79 error_invalid_m_or_n = -39,
80 error_n_out_of_range = -40,
81 error_lat_1_2_unspecified = -41,
82 error_abs_lat1_eq_abs_lat2 = -42,
83 error_lat_0_half_pi_from_mean = -43,
84 error_unparseable_cs_def = -44,
85 error_geocentric = -45,
86 error_unknown_prime_meridian = -46,
87 error_axis = -47,
88 error_grid_area = -48,
89 error_invalid_sweep_axis = -49,
90 error_malformed_pipeline = -50,
91 error_unit_factor_less_than_0 = -51,
92 error_invalid_scale = -52,
93 error_non_convergent = -53,
94 error_missing_args = -54,
95 error_lat_0_is_zero = -55,
96 error_ellipsoidal_unsupported = -56,
97 error_too_many_inits = -57,
98 error_invalid_arg = -58
99 };
100
101 static const char *
102 pj_err_list[] = {
103 "no arguments in initialization list", /* -1 */
104 "no options found in 'init' file", /* -2 */
105 "no colon in init= string", /* -3 */
106 "projection not named", /* -4 */
107 "unknown projection id", /* -5 */
108 "effective eccentricity = 1.", /* -6 */
109 "unknown unit conversion id", /* -7 */
110 "invalid boolean param argument", /* -8 */
111 "unknown elliptical parameter name", /* -9 */
112 "reciprocal flattening (1/f) = 0", /* -10 */
113 "|radius reference latitude| > 90", /* -11 */
114 "squared eccentricity < 0", /* -12 */
115 "major axis or radius = 0 or not given", /* -13 */
116 "latitude or longitude exceeded limits", /* -14 */
117 "invalid x or y", /* -15 */
118 "improperly formed DMS value", /* -16 */
119 "non-convergent inverse meridional dist", /* -17 */
120 "non-convergent inverse phi2", /* -18 */
121 "acos/asin: |arg| >1.+1e-14", /* -19 */
122 "tolerance condition error", /* -20 */
123 "conic lat_1 = -lat_2", /* -21 */
124 "lat_1 >= 90", /* -22 */
125 "lat_1 = 0", /* -23 */
126 "lat_ts >= 90", /* -24 */
127 "no distance between control points", /* -25 */
128 "projection not selected to be rotated", /* -26 */
129 "W <= 0 or M <= 0", /* -27 */
130 "lsat not in 1-5 range", /* -28 */
131 "path not in range", /* -29 */
132 "h <= 0", /* -30 */
133 "k <= 0", /* -31 */
134 "lat_0 = 0 or 90 or alpha = 90", /* -32 */
135 "lat_1=lat_2 or lat_1=0 or lat_2=90", /* -33 */
136 "elliptical usage required", /* -34 */
137 "invalid UTM zone number", /* -35 */
138 "arg(s) out of range for Tcheby eval", /* -36 */
139 "failed to find projection to be rotated", /* -37 */
140 "failed to load datum shift file", /* -38 */
141 "both n & m must be spec'd and > 0", /* -39 */
142 "n <= 0, n > 1 or not specified", /* -40 */
143 "lat_1 or lat_2 not specified", /* -41 */
144 "|lat_1| == |lat_2|", /* -42 */
145 "lat_0 is pi/2 from mean lat", /* -43 */
146 "unparseable coordinate system definition", /* -44 */
147 "geocentric transformation missing z or ellps", /* -45 */
148 "unknown prime meridian conversion id", /* -46 */
149 "illegal axis orientation combination", /* -47 */
150 "point not within available datum shift grids", /* -48 */
151 "invalid sweep axis, choose x or y", /* -49 */
152 "malformed pipeline", /* -50 */
153 "unit conversion factor must be > 0", /* -51 */
154 "invalid scale", /* -52 */
155 "non-convergent computation", /* -53 */
156 "missing required arguments", /* -54 */
157 "lat_0 = 0", /* -55 */
158 "ellipsoidal usage unsupported", /* -56 */
159 "only one +init allowed for non-pipeline operations", /* -57 */
160 "argument not numerical or out of range", /* -58 */
161
162 /* When adding error messages, remember to update ID defines in
163 projects.h, and transient_error array in pj_transform */
164 };
165
pj_generic_strerrno(std::string const & msg,int err)166 inline std::string pj_generic_strerrno(std::string const& msg, int err)
167 {
168 std::stringstream ss;
169 ss << msg << " (" << err << ")";
170 return ss.str();
171 }
172
pj_strerrno(int err)173 inline std::string pj_strerrno(int err) {
174 if (0==err)
175 {
176 return "";
177 }
178 else if (err > 0)
179 {
180 // std::strerror function may be not thread-safe
181 //return std::strerror(err);
182
183 switch(err)
184 {
185 #ifdef EINVAL
186 case EINVAL:
187 return "Invalid argument";
188 #endif
189 #ifdef EDOM
190 case EDOM:
191 return "Math argument out of domain of func";
192 #endif
193 #ifdef ERANGE
194 case ERANGE:
195 return "Math result not representable";
196 #endif
197 default:
198 return pj_generic_strerrno("system error", err);
199 }
200 }
201 else /*if (err < 0)*/
202 {
203 size_t adjusted_err = - err - 1;
204 if (adjusted_err < (sizeof(pj_err_list) / sizeof(char *)))
205 {
206 return(pj_err_list[adjusted_err]);
207 }
208 else
209 {
210 return pj_generic_strerrno("invalid projection system error", err);
211 }
212 }
213 }
214
215 } // namespace detail
216
217 }}} // namespace boost::geometry::projections
218
219 #endif // BOOST_GEOMETRY_PROJECTIONS_IMPL_PJ_STRERRNO_HPP
220