248 char cardinal_direction;
249 char decimal_separator;
251 int degrees = (int) decimal_degrees;
252 double minutes = fabs((decimal_degrees-degrees)*60);
253 double seconds = fabs((minutes-(
int)minutes) *60);
255 int has_cardinal_direction = 0;
256 int num_decimals = 0;
257 char*
res = palloc(
sizeof(
char)*strlen(format)+2);
269 POSTGIS_DEBUGF(2,
"corner_to_subfield_sb called with coordinates: %f and format: %s",decimal_degrees,format);
271 if((
int)(seconds + 0.5)>=60) {
273 seconds = seconds-60;
274 minutes = minutes +1;
279 if(strchr(format,
'.')) {
280 num_decimals = strlen(strchr(format,
'.'))-1;
281 decimal_separator =
'.';
284 if(strchr(format,
',')) {
285 num_decimals = strlen(strchr(format,
','))-1;
286 decimal_separator =
',';
291 has_cardinal_direction = 1;
293 if(subfield==
'd'||subfield==
'e'){
295 if(decimal_degrees>0){
297 cardinal_direction=
'E';
301 cardinal_direction=
'W';
302 degrees=abs(degrees);
303 decimal_degrees= fabs(decimal_degrees);
308 if(subfield==
'f'||subfield==
'g'){
310 if(decimal_degrees>0){
312 cardinal_direction=
'N';
316 cardinal_direction=
'S';
317 degrees=abs(degrees);
318 decimal_degrees= fabs(decimal_degrees);
326 if(format[3+has_cardinal_direction]==
'.' || format[3+has_cardinal_direction]==
',' ) {
332 int pad_degrees = (int)strlen(format);
334 if(decimal_degrees <0 && decimal_degrees>-100) pad_degrees=strlen(format)+1;
336 if(has_cardinal_direction) pad_degrees=pad_degrees-1;
338 snprintf(
res,
buffer_size,
"%0*.*f",pad_degrees,num_decimals,decimal_degrees);
341 }
else if(format[5+has_cardinal_direction]==
'.' || format[5+has_cardinal_direction]==
',' ) {
348 if(minutes<10) pad_minutes = (int)strlen(format)-has_cardinal_direction-3;
350 snprintf(
res,
buffer_size,
"%.3d%0*.*f",degrees,pad_minutes,num_decimals,fabs(minutes));
354 else if(format[7+has_cardinal_direction]==
'.' || format[7+has_cardinal_direction]==
',') {
362 if(seconds<10) pad_seconds = (int) strlen(format)-has_cardinal_direction-5;
364 snprintf(
res,
buffer_size,
"%.3d%.2d%0*.*f",degrees,(
int)minutes,pad_seconds,num_decimals,fabs(seconds));
372 snprintf(
res,
buffer_size,
"%.3d%.2d%.2d",degrees,(
int)minutes,(
int)(seconds + 0.5));
377 if(decimal_separator==
','){
379 res[strlen(
res)-num_decimals-1] =
',';
383 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.