233 char cardinal_direction;
234 char decimal_separator;
236 int degrees = (int) decimal_degrees;
237 double minutes = fabs((decimal_degrees-degrees)*60);
238 double seconds = fabs((minutes-(
int)minutes) *60);
240 int has_cardinal_direction = 0;
241 int num_decimals = 0;
242 char*
res = palloc(
sizeof(
char)*strlen(format)+2);
254 POSTGIS_DEBUGF(2,
"corner_to_subfield_sb called with coordinates: %f and format: %s",decimal_degrees,format);
256 if((
int)(seconds + 0.5)>=60) {
258 seconds = seconds-60;
259 minutes = minutes +1;
264 if(strchr(format,
'.')) {
265 num_decimals = strlen(strchr(format,
'.'))-1;
266 decimal_separator =
'.';
269 if(strchr(format,
',')) {
270 num_decimals = strlen(strchr(format,
','))-1;
271 decimal_separator =
',';
276 has_cardinal_direction = 1;
278 if(subfield==
'd'||subfield==
'e'){
280 if(decimal_degrees>0){
282 cardinal_direction=
'E';
286 cardinal_direction=
'W';
287 degrees=abs(degrees);
288 decimal_degrees= fabs(decimal_degrees);
293 if(subfield==
'f'||subfield==
'g'){
295 if(decimal_degrees>0){
297 cardinal_direction=
'N';
301 cardinal_direction=
'S';
302 degrees=abs(degrees);
303 decimal_degrees= fabs(decimal_degrees);
311 if(format[3+has_cardinal_direction]==
'.' || format[3+has_cardinal_direction]==
',' ) {
317 int pad_degrees = (int)strlen(format);
319 if(decimal_degrees <0 && decimal_degrees>-100) pad_degrees=strlen(format)+1;
321 if(has_cardinal_direction) pad_degrees=pad_degrees-1;
323 snprintf(
res,
buffer_size,
"%0*.*f",pad_degrees,num_decimals,decimal_degrees);
326 }
else if(format[5+has_cardinal_direction]==
'.' || format[5+has_cardinal_direction]==
',' ) {
333 if(minutes<10) pad_minutes = (int)strlen(format)-has_cardinal_direction-3;
335 snprintf(
res,
buffer_size,
"%.3d%0*.*f",degrees,pad_minutes,num_decimals,fabs(minutes));
339 else if(format[7+has_cardinal_direction]==
'.' || format[7+has_cardinal_direction]==
',') {
347 if(seconds<10) pad_seconds = (int) strlen(format)-has_cardinal_direction-5;
349 snprintf(
res,
buffer_size,
"%.3d%.2d%0*.*f",degrees,(
int)minutes,pad_seconds,num_decimals,fabs(seconds));
357 snprintf(
res,
buffer_size,
"%.3d%.2d%.2d",degrees,(
int)minutes,(
int)(seconds + 0.5));
362 if(decimal_separator==
','){
364 res[strlen(
res)-num_decimals-1] =
',';
368 if(has_cardinal_direction){
int stringbuffer_aprintf(stringbuffer_t *s, const char *fmt,...)
Appends a formatted string to the current string buffer, using the format and argument list provided.