14 #define GEOREF_NO_ERROR 0x0000 15 #define GEOREF_LAT_ERROR 0x0001 16 #define GEOREF_LON_ERROR 0x0002 17 #define GEOREF_STR_ERROR 0x0004 18 #define GEOREF_STR_LAT_ERROR 0x0008 19 #define GEOREF_STR_LON_ERROR 0x0010 20 #define GEOREF_STR_LAT_MIN_ERROR 0x0020 21 #define GEOREF_STR_LON_MIN_ERROR 0x0040 22 #define GEOREF_PRECISION_ERROR 0x0080 51 char resultString[100];
72 #define LATITUDE_LOW -90 73 #define LATITUDE_HIGH 90 74 #define LONGITUDE_LOW -180 75 #define LONGITUDE_HIGH 360 76 #define MIN_PER_DEG 60 77 #define GEOREF_MINIMUM 4 78 #define GEOREF_MAXIMUM 14 79 #define GEOREF_LETTERS 4 80 #define MAX_PRECISION 5 86 #define LETTER_A_OFFSET 65 87 #define ZERO_OFFSET 48 88 #define PI 3.14159265358979323e0 89 #define DEGREE_TO_RADIAN (PI / 180.0) 90 #define RADIAN_TO_DEGREE (180.0 / PI) 92 #define ROUND_ERROR 0.0000005 121 temp_char = toupper(georef[i]);
123 if ((!isalpha(georef[i]))
127 if ((i == 0) || (i == 2))
132 letter_number[i] = temp_char;
137 letter_number[i] -= 2;
138 else if (letter_number[i] >
LETTER_I)
139 letter_number[i] -= 1;
141 if ((letter_number[0] > 23) || (letter_number[2] > 14))
143 if ((letter_number[1] > 11) || (letter_number[3] > 14))
145 *latitude = (double)(letter_number[1]) *
QUAD + (double)(letter_number[3]);
146 *longitude = (double)(letter_number[0]) *
QUAD + (double)(letter_number[2]);
173 for (i=0;i<length;i++)
175 if (isdigit(georef[start+i]))
176 temp_str[i] = georef[start+i];
178 error_code |= ERROR_TYPE;
180 temp_str[length] = 0;
181 *minutes = (double)atof(temp_str);
184 *minutes = *minutes / 10;
188 error_code |= ERROR_TYPE;
198 double fraction = modf (value, &ivalue);
199 ival = (long)(ivalue);
200 if ((fraction > 0.5) || ((fraction == 0.5) && (ival%2 == 1)))
219 divisor = pow ((
double)10.0, (
int)(5 - precision));
222 minutes = minutes * 1000;
224 sprintf (str,
"%*.*ld", (
int)precision, (
int)precision,
min);
258 georef_length = (long)strlen(georef);
260 || ((georef_length % 2) != 0))
268 minutes_length = (georef_length - start) / 2;
277 *latitude = *latitude + origin_lat + lat_minutes / (double)
MIN_PER_DEG;
278 *longitude = *longitude + origin_long + long_minutes / (double)
MIN_PER_DEG;
340 letter_number[0] = (long)((longitude-origin_long) /
QUAD +
ROUND_ERROR);
341 longitude = longitude - ((double)letter_number[0] *
QUAD + origin_long);
342 letter_number[2] = (long)(longitude +
ROUND_ERROR);
343 long_min = (longitude - (double)letter_number[2]) * (double)
MIN_PER_DEG;
344 letter_number[1] = (long)((latitude - origin_lat) /
QUAD +
ROUND_ERROR);
345 latitude = latitude - ((double)letter_number[1] *
QUAD + origin_lat);
347 lat_min = (latitude - (double)letter_number[3]) * (double)
MIN_PER_DEG;
348 for (i = 0;i < 4; i++)
351 letter_number[i] += 1;
353 letter_number[i] += 1;
356 if (letter_number[0] == 26)
362 if (letter_number[1] == 13)
374 strcat(georef,long_min_str);
375 strcat(georef,lat_min_str);
long Extract_Minutes(char *georef, long start, long length, long ERROR_TYPE, double *minutes)
#define GEOREF_PRECISION_ERROR
long Round_GEOREF(double value)
long Convert_Geodetic_To_GEOREF(double Latitude, double Longitude, long Precision, char *georef)
long Extract_Degrees(char *georef, double *latitude, double *longitude)
#define GEOREF_STR_LON_MIN_ERROR
double lonr() const
Returns the longitude in radian measure.
void Convert_Minutes_To_String(double minutes, long precision, char *str)
#define GEOREF_STR_LAT_MIN_ERROR
#define GEOREF_STR_LAT_ERROR
ossimString toString(long precision)
#define GEOREF_STR_LON_ERROR
double latr() const
latr().
const char * c_str() const
Returns a pointer to a null-terminated array of characters representing the string's contents...
long Convert_GEOREF_To_Geodetic(char *georef, double *Latitude, double *Longitude)