231 {
232
233 char cardinal_direction;
234 char decimal_separator;
235
236 int degrees = (int) decimal_degrees;
237 double minutes = fabs((decimal_degrees-degrees)*60);
238 double seconds = fabs((minutes-(int)minutes) *60);
239
240 int has_cardinal_direction = 0;
241 int num_decimals = 0;
242 char*
res = palloc(
sizeof(
char)*strlen(format)+2);
243
244
245
246
248
249
250
252
253
254 POSTGIS_DEBUGF(2,"corner_to_subfield_sb called with coordinates: %f and format: %s",decimal_degrees,format);
255
256 if((int)(seconds + 0.5)>=60) {
257
258 seconds = seconds-60;
259 minutes = minutes +1;
260
261 }
262
263
264 if(strchr(format, '.')) {
265 num_decimals = strlen(strchr(format, '.'))-1;
266 decimal_separator = '.';
267 }
268
269 if(strchr(format, ',')) {
270 num_decimals = strlen(strchr(format, ','))-1;
271 decimal_separator = ',';
272 }
273
274 if(format[0]=='h'){
275
276 has_cardinal_direction = 1;
277
278 if(subfield=='d'||subfield=='e'){
279
280 if(decimal_degrees>0){
281
282 cardinal_direction='E';
283
284 } else {
285
286 cardinal_direction='W';
287 degrees=abs(degrees);
288 decimal_degrees= fabs(decimal_degrees);
289
290 }
291 }
292
293 if(subfield=='f'||subfield=='g'){
294
295 if(decimal_degrees>0){
296
297 cardinal_direction='N';
298
299 } else {
300
301 cardinal_direction='S';
302 degrees=abs(degrees);
303 decimal_degrees= fabs(decimal_degrees);
304
305 }
306 }
307
308
309 }
310
311 if(format[3+has_cardinal_direction]=='.' || format[3+has_cardinal_direction]==',' ) {
312
317 int pad_degrees = (int)strlen(format);
318
319 if(decimal_degrees <0 && decimal_degrees>-100) pad_degrees=strlen(format)+1;
320
321 if(has_cardinal_direction) pad_degrees=pad_degrees-1;
322
323 snprintf(res,
buffer_size,
"%0*.*f",pad_degrees,num_decimals,decimal_degrees);
324
325
326 } else if(format[5+has_cardinal_direction]=='.' || format[5+has_cardinal_direction]==',' ) {
327
331 int pad_minutes = 0;
332
333 if(minutes<10) pad_minutes = (int)strlen(format)-has_cardinal_direction-3;
334
335 snprintf(res,
buffer_size,
"%.3d%0*.*f",degrees,pad_minutes,num_decimals,fabs(minutes));
336
337 }
338
339 else if(format[7+has_cardinal_direction]=='.' || format[7+has_cardinal_direction]==',') {
340
341
342
343
344
345 int pad_seconds = 0;
346
347 if(seconds<10) pad_seconds = (int) strlen(format)-has_cardinal_direction-5;
348
349 snprintf(res,
buffer_size,
"%.3d%.2d%0*.*f",degrees,(
int)minutes,pad_seconds,num_decimals,fabs(seconds));
350
351 } else {
352
357 snprintf(res,
buffer_size,
"%.3d%.2d%.2d",degrees,(
int)minutes,(
int)(seconds + 0.5));
358
359 }
360
361
362 if(decimal_separator==','){
363
364 res[strlen(res)-num_decimals-1] =
',';
365
366 }
367
368 if(has_cardinal_direction){
369
371
372 } else {
373
375
376 }
377
378
379 pfree(res);
381
382
383
384}
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.