39 #include "irplib_wcs.h"
47 static cpl_error_code irplib_wcs_is_iso8601(
int,
int,
int,
int,
int,
double);
63 cpl_error_code irplib_wcs_xytoradec(
const cpl_wcs *wcs,
70 cpl_matrix * radec = NULL;
71 cpl_array * status = NULL;
74 cpl_ensure_code(ra != NULL, CPL_ERROR_NULL_INPUT);
75 cpl_ensure_code(dec != NULL, CPL_ERROR_NULL_INPUT);
78 xy = cpl_matrix_new(1, 2);
79 cpl_matrix_set(xy, 0, 0, x);
80 cpl_matrix_set(xy, 0, 1, y);
83 error = cpl_wcs_convert(wcs, xy, &radec, &status, CPL_WCS_PHYS2WORLD);
85 cpl_matrix_delete(xy);
90 *ra = cpl_matrix_get(radec, 0, 0);
91 *dec = cpl_matrix_get(radec, 0, 1);
96 cpl_matrix_delete(radec);
97 cpl_array_delete(status);
99 return cpl_error_set_where(cpl_func);
114 cpl_error_code irplib_wcs_radectoxy(
const cpl_wcs * wcs,
121 cpl_matrix * xy = NULL;
122 cpl_array * status = NULL;
123 cpl_error_code error;
125 cpl_ensure_code(x != NULL, CPL_ERROR_NULL_INPUT);
126 cpl_ensure_code(y != NULL, CPL_ERROR_NULL_INPUT);
129 radec = cpl_matrix_new(1, 2);
130 cpl_matrix_set(radec, 0, 0, ra);
131 cpl_matrix_set(radec, 0, 1, dec);
133 error = cpl_wcs_convert(wcs, radec, &xy, &status, CPL_WCS_WORLD2PHYS);
135 cpl_matrix_delete(radec);
139 *x = cpl_matrix_get(xy, 0, 0);
140 *y = cpl_matrix_get(xy, 0, 1);
145 cpl_array_delete(status);
146 cpl_matrix_delete(xy);
148 return cpl_error_set_where(cpl_func);
163 double irplib_wcs_great_circle_dist(
double ra1,
170 const double dra = sin( CPL_MATH_RAD_DEG * (ra2 - ra1 )/2.0 );
171 const double ddec = sin( CPL_MATH_RAD_DEG * (dec2 - dec1)/2.0 );
173 dec1 *= CPL_MATH_RAD_DEG;
174 dec2 *= CPL_MATH_RAD_DEG;
176 return 2.0 * asin(sqrt( ddec*ddec + cos(dec1)*cos(dec2)*dra*dra))
196 cpl_error_code irplib_wcs_mjd_from_iso8601(
double * pmjd,
int year,
int month,
197 int day,
int hour,
int minute,
201 cpl_ensure_code(pmjd != NULL, CPL_ERROR_NULL_INPUT);
202 cpl_ensure_code(!irplib_wcs_is_iso8601(year, month, day, hour, minute,
203 second), cpl_error_get_code());
206 *pmjd = (double)((1461*(year - (12-month)/10 + 4712))/4
207 + (306*((month+9)%12) + 5)/10
208 - (3*((year - (12-month)/10 + 4900)/100))/4
210 + (hour + (minute + second/60.0)/60.0)/24.0;
212 return CPL_ERROR_NONE;
234 cpl_error_code irplib_wcs_iso8601_from_string(
int * pyear,
int * pmonth,
235 int * pday,
int * phour,
236 int * pminute,
double * psecond,
237 const char * iso8601)
241 const char * iso8601format =
"%4d-%2d-%2dT%2d:%2d:%lf";
243 cpl_ensure_code(pyear != NULL, CPL_ERROR_NULL_INPUT);
244 cpl_ensure_code(pmonth != NULL, CPL_ERROR_NULL_INPUT);
245 cpl_ensure_code(pday != NULL, CPL_ERROR_NULL_INPUT);
246 cpl_ensure_code(phour != NULL, CPL_ERROR_NULL_INPUT);
247 cpl_ensure_code(pminute != NULL, CPL_ERROR_NULL_INPUT);
248 cpl_ensure_code(psecond != NULL, CPL_ERROR_NULL_INPUT);
249 cpl_ensure_code(iso8601 != NULL, CPL_ERROR_NULL_INPUT);
251 cpl_error_ensure(sscanf(iso8601, iso8601format, pyear, pmonth,
252 pday, phour, pminute, psecond) == 6,
253 CPL_ERROR_ILLEGAL_INPUT,
return cpl_error_get_code(),
254 "%s is not formatted as %s", iso8601, iso8601format);
256 cpl_ensure_code(!irplib_wcs_is_iso8601(*pyear, *pmonth, *pday, *phour,
258 cpl_error_get_code());
260 return CPL_ERROR_NONE;
274 cpl_error_code irplib_wcs_mjd_from_string(
double * pmjd,
const char * iso8601)
278 int year, day, month, hour, minute;
281 return irplib_wcs_iso8601_from_string(&year, &month, &day, &hour,
282 &minute, &second, iso8601)
283 || irplib_wcs_mjd_from_iso8601(pmjd, year, month, day, hour, minute,
285 ? cpl_error_set_where(cpl_func) : CPL_ERROR_NONE;
305 cpl_error_code irplib_wcs_iso8601_from_mjd(
int * pyear,
int * pmonth,
306 int * pday,
int * phour,
307 int * pminute,
double * psecond,
314 cpl_ensure_code(pyear != NULL, CPL_ERROR_NULL_INPUT);
315 cpl_ensure_code(pmonth != NULL, CPL_ERROR_NULL_INPUT);
316 cpl_ensure_code(pday != NULL, CPL_ERROR_NULL_INPUT);
317 cpl_ensure_code(phour != NULL, CPL_ERROR_NULL_INPUT);
318 cpl_ensure_code(pminute != NULL, CPL_ERROR_NULL_INPUT);
319 cpl_ensure_code(psecond != NULL, CPL_ERROR_NULL_INPUT);
323 jd = 2400001 + (int)mjd;
325 n4 = 4*(jd + ((2*((4*jd - 17918)/146097)*3)/4 + 1)/2 - 37);
326 dd = 10*(((n4-237)%1461)/4) + 5;
328 *pyear = n4/1461 - 4712;
329 *pmonth = (2 + dd/306)%12 + 1;
330 *pday = (dd%306)/10 + 1;
336 t = 60.0 * (t - *phour);
338 *psecond = 60.0 * (t - *pminute);
341 cpl_ensure_code(!irplib_wcs_is_iso8601(*pyear, *pmonth, *pday, *phour,
343 CPL_ERROR_UNSPECIFIED);
345 return CPL_ERROR_NONE;
364 static cpl_error_code irplib_wcs_is_iso8601(
int year,
int month,
366 int minute,
double second)
369 const cpl_boolean is_leap = (year % 4) ? CPL_FALSE : CPL_TRUE;
370 const int mlen[] = {0, 31, is_leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30,
373 cpl_ensure_code(month > 0, CPL_ERROR_ILLEGAL_INPUT);
374 cpl_ensure_code(month <= 12, CPL_ERROR_ILLEGAL_INPUT);
376 cpl_ensure_code(day > 0, CPL_ERROR_ILLEGAL_INPUT);
377 cpl_ensure_code(day <= mlen[month], CPL_ERROR_ILLEGAL_INPUT);
379 cpl_ensure_code(minute < 60, CPL_ERROR_ILLEGAL_INPUT);
380 cpl_ensure_code(minute >= 0, CPL_ERROR_ILLEGAL_INPUT);
382 cpl_ensure_code(second < 60.0, CPL_ERROR_ILLEGAL_INPUT);
383 cpl_ensure_code(second >= 0.0, CPL_ERROR_ILLEGAL_INPUT);
385 cpl_ensure_code(hour >= 0, CPL_ERROR_ILLEGAL_INPUT);
387 cpl_ensure_code(hour <= (minute > 0 || second > 0.0 ? 23 : 24),
388 CPL_ERROR_ILLEGAL_INPUT);
390 return CPL_ERROR_NONE;