@@ -290,6 +290,9 @@ private void writeGpxFile(String trackName, String tags, String track_descriptio
290
290
String compassOutput = PreferenceManager .getDefaultSharedPreferences (context ).getString (
291
291
OSMTracker .Preferences .KEY_OUTPUT_COMPASS ,
292
292
OSMTracker .Preferences .VAL_OUTPUT_COMPASS );
293
+ boolean gpxFormatShort = PreferenceManager .getDefaultSharedPreferences (context ).getBoolean (
294
+ OSMTracker .Preferences .KEY_GPX_FORMAT_SHORT ,
295
+ OSMTracker .Preferences .VAL_GPX_FORMAT_SHORT );
293
296
294
297
Log .v (TAG , "write preferences: compass:" + compassOutput );
295
298
@@ -315,8 +318,13 @@ private void writeGpxFile(String trackName, String tags, String track_descriptio
315
318
316
319
writer .write ("\t </metadata>\n " );
317
320
318
- writeWayPoints (writer , cWayPoints , accuracyOutput , fillHDOP , compassOutput );
319
- writeTrackPoints (context .getResources ().getString (R .string .gpx_track_name ), writer , cTrackPoints , fillHDOP , compassOutput );
321
+ if (gpxFormatShort ) {
322
+ writeWayPoints_short (writer , cWayPoints , accuracyOutput , fillHDOP , compassOutput );
323
+ writeTrackPoints_short (context .getResources ().getString (R .string .gpx_track_name ), writer , cTrackPoints , fillHDOP , compassOutput );
324
+ } else {
325
+ writeWayPoints_long (writer , cWayPoints , accuracyOutput , fillHDOP , compassOutput );
326
+ writeTrackPoints_long (context .getResources ().getString (R .string .gpx_track_name ), writer , cTrackPoints , fillHDOP , compassOutput );
327
+ }
320
328
writer .write ("</gpx>" );
321
329
322
330
} finally {
@@ -327,15 +335,199 @@ private void writeGpxFile(String trackName, String tags, String track_descriptio
327
335
}
328
336
329
337
/**
330
- * Iterates on track points and write them.
338
+ * Iterates on track points and write them. Long version, multiple lines per point.
339
+ * @param trackName Name of the track (metadata).
340
+ * @param fw Writer to the target file.
341
+ * @param c Cursor to track points.
342
+ * @param fillHDOP Indicates whether fill <hdop> tag with approximation from location accuracy.
343
+ * @param compass Indicates if and how to write compass heading to the GPX ('none', 'comment', 'extension')
344
+ * @throws IOException
345
+ */
346
+ private void writeTrackPoints_long (String trackName , Writer fw , Cursor c , boolean fillHDOP , String compass ) throws IOException {
347
+ // Update dialog every 1%
348
+ int dialogUpdateThreshold = c .getCount () / 100 ;
349
+ if (dialogUpdateThreshold == 0 ) {
350
+ dialogUpdateThreshold ++;
351
+ }
352
+
353
+ fw .write ("\t " + "<trk>" + "\n " );
354
+ fw .write ("\t \t " + "<name>" + CDATA_START + trackName + CDATA_END + "</name>" + "\n " );
355
+ if (fillHDOP ) {
356
+ fw .write ("\t \t " + "<cmt>"
357
+ + CDATA_START
358
+ + context .getResources ().getString (R .string .gpx_hdop_approximation_cmt )
359
+ + CDATA_END
360
+ + "</cmt>" + "\n " );
361
+ }
362
+ fw .write ("\t \t " + "<trkseg>" + "\n " );
363
+
364
+ int i =0 ;
365
+ for (c .moveToFirst (); !c .isAfterLast (); c .moveToNext (),i ++) {
366
+ StringBuffer out = new StringBuffer ();
367
+ out .append ("\t \t \t " + "<trkpt lat=\" "
368
+ + c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_LATITUDE )) + "\" "
369
+ + "lon=\" " + c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_LONGITUDE )) + "\" >" + "\n " );
370
+ if (! c .isNull (c .getColumnIndex (TrackContentProvider .Schema .COL_ELEVATION ))) {
371
+ out .append ("\t \t \t \t " + "<ele>" + c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_ELEVATION )) + "</ele>" + "\n " );
372
+ }
373
+ out .append ("\t \t \t \t " + "<time>" + pointDateFormatter .format (new Date (c .getLong (c .getColumnIndex (TrackContentProvider .Schema .COL_TIMESTAMP )))) + "</time>" + "\n " );
374
+
375
+ if (fillHDOP && ! c .isNull (c .getColumnIndex (TrackContentProvider .Schema .COL_ACCURACY ))) {
376
+ out .append ("\t \t \t \t " + "<hdop>" + (c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_ACCURACY )) / OSMTracker .HDOP_APPROXIMATION_FACTOR ) + "</hdop>" + "\n " );
377
+ }
378
+ if (OSMTracker .Preferences .VAL_OUTPUT_COMPASS_COMMENT .equals (compass ) && !c .isNull (c .getColumnIndex (TrackContentProvider .Schema .COL_COMPASS ))) {
379
+ out .append ("\t \t \t \t " + "<cmt>" +CDATA_START +"compass: " +
380
+ c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_COMPASS ))+
381
+ "\n \t \t \t \t \t compAccuracy: " +
382
+ c .getLong (c .getColumnIndex (TrackContentProvider .Schema .COL_COMPASS_ACCURACY ))+
383
+ CDATA_END +"</cmt>" +"\n " );
384
+ }
385
+
386
+ String buff = "" ;
387
+ if (! c .isNull (c .getColumnIndex (TrackContentProvider .Schema .COL_SPEED ))) {
388
+ buff += "\t \t \t \t \t " + "<speed>" + c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_SPEED )) + "</speed>" + "\n " ;
389
+ }
390
+ if (OSMTracker .Preferences .VAL_OUTPUT_COMPASS_EXTENSION .equals (compass ) && !c .isNull (c .getColumnIndex (TrackContentProvider .Schema .COL_COMPASS ))) {
391
+ buff += "\t \t \t \t \t " + "<compass>" + c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_COMPASS )) + "</compass>" + "\n " ;
392
+ buff += "\t \t \t \t \t " + "<compass_accuracy>" + c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_COMPASS_ACCURACY )) + "</compass_accuracy>" + "\n " ;
393
+ }
394
+ if (! buff .equals ("" )) {
395
+ out .append ("\t \t \t \t " + "<extensions>\n " );
396
+ out .append (buff );
397
+ out .append ("\t \t \t \t " + "</extensions>\n " );
398
+ }
399
+
400
+ out .append ("\t \t \t " + "</trkpt>" + "\n " );
401
+ fw .write (out .toString ());
402
+
403
+ if (i % dialogUpdateThreshold == 0 ) {
404
+ publishProgress ((long ) dialogUpdateThreshold );
405
+ }
406
+ }
407
+
408
+ fw .write ("\t \t " + "</trkseg>" + "\n " );
409
+ fw .write ("\t " + "</trk>" + "\n " );
410
+ }
411
+
412
+ /**
413
+ * Iterates on way points and write them. Long version, multiple lines per point.
414
+ * @param fw Writer to the target file.
415
+ * @param c Cursor to way points.
416
+ * @param accuracyInfo Constant describing how to include (or not) accuracy info for way points.
417
+ * @param fillHDOP Indicates whether fill <hdop> tag with approximation from location accuracy.
418
+ * @param compass Indicates if and how to write compass heading to the GPX ('none', 'comment', 'extension')
419
+ * @throws IOException
420
+ */
421
+ private void writeWayPoints_long (Writer fw , Cursor c , String accuracyInfo , boolean fillHDOP , String compass ) throws IOException {
422
+
423
+ // Update dialog every 1%
424
+ int dialogUpdateThreshold = c .getCount () / 100 ;
425
+ if (dialogUpdateThreshold == 0 ) {
426
+ dialogUpdateThreshold ++;
427
+ }
428
+
429
+ // Label for meter unit
430
+ String meterUnit = context .getResources ().getString (R .string .various_unit_meters );
431
+ // Word "accuracy"
432
+ String accuracy = context .getResources ().getString (R .string .various_accuracy );
433
+
434
+ int i =0 ;
435
+ for (c .moveToFirst (); !c .isAfterLast (); c .moveToNext (), i ++) {
436
+ StringBuffer out = new StringBuffer ();
437
+ out .append ("\t " + "<wpt lat=\" "
438
+ + c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_LATITUDE )) + "\" "
439
+ + "lon=\" " + c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_LONGITUDE )) + "\" >" + "\n " );
440
+ if (! c .isNull (c .getColumnIndex (TrackContentProvider .Schema .COL_ELEVATION ))) {
441
+ out .append ("\t \t " + "<ele>" + c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_ELEVATION )) + "</ele>" + "\n " );
442
+ }
443
+ out .append ("\t \t " + "<time>" + pointDateFormatter .format (new Date (c .getLong (c .getColumnIndex (TrackContentProvider .Schema .COL_TIMESTAMP )))) + "</time>" + "\n " );
444
+
445
+ String name = c .getString (c .getColumnIndex (TrackContentProvider .Schema .COL_NAME ));
446
+
447
+ if (! OSMTracker .Preferences .VAL_OUTPUT_ACCURACY_NONE .equals (accuracyInfo ) && ! c .isNull (c .getColumnIndex (TrackContentProvider .Schema .COL_ACCURACY ))) {
448
+ // Outputs accuracy info for way point
449
+ if (OSMTracker .Preferences .VAL_OUTPUT_ACCURACY_WPT_NAME .equals (accuracyInfo )) {
450
+ // Output accuracy with name
451
+ out .append ("\t \t " + "<name>"
452
+ + CDATA_START
453
+ + name
454
+ + " (" + c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_ACCURACY )) + meterUnit + ")"
455
+ + CDATA_END
456
+ + "</name>" + "\n " );
457
+ if (OSMTracker .Preferences .VAL_OUTPUT_COMPASS_COMMENT .equals (compass ) &&
458
+ ! c .isNull (c .getColumnIndex (TrackContentProvider .Schema .COL_COMPASS ))) {
459
+ out .append ("\t \t " + "<cmt>" + CDATA_START + "compass: " + c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_COMPASS )) +
460
+ "\n \t \t \t compass accuracy: " + c .getInt (c .getColumnIndex (TrackContentProvider .Schema .COL_COMPASS_ACCURACY )) + CDATA_END + "</cmt>\n " );
461
+ }
462
+ } else if (OSMTracker .Preferences .VAL_OUTPUT_ACCURACY_WPT_CMT .equals (accuracyInfo )) {
463
+ // Output accuracy in separate tag
464
+ out .append ("\t \t " + "<name>" + CDATA_START + name + CDATA_END + "</name>" + "\n " );
465
+ if (OSMTracker .Preferences .VAL_OUTPUT_COMPASS_COMMENT .equals (compass ) &&
466
+ ! c .isNull (c .getColumnIndex (TrackContentProvider .Schema .COL_COMPASS ))) {
467
+ out .append ("\t \t " + "<cmt>" + CDATA_START + accuracy + ": " + c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_ACCURACY )) + meterUnit +
468
+ "\n \t \t \t compass heading: " + c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_COMPASS )) +
469
+ "deg\n \t \t \t compass accuracy: " + c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_COMPASS_ACCURACY )) +CDATA_END + "</cmt>" + "\n " );
470
+ } else {
471
+ out .append ("\t \t " + "<cmt>" + CDATA_START + accuracy + ": " + c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_ACCURACY )) + meterUnit + CDATA_END + "</cmt>" + "\n " );
472
+ }
473
+ } else {
474
+ // Unknown value for accuracy info, shouldn't occur but who knows ?
475
+ // See issue #68. Output at least the name just in case.
476
+ out .append ("\t \t " + "<name>" + CDATA_START + name + CDATA_END + "</name>" + "\n " );
477
+ }
478
+ } else {
479
+ // No accuracy info requested, or available
480
+ out .append ("\t \t " + "<name>" + CDATA_START + name + CDATA_END + "</name>" + "\n " );
481
+ if (OSMTracker .Preferences .VAL_OUTPUT_COMPASS_COMMENT .equals (compass ) &&
482
+ ! c .isNull (c .getColumnIndex (TrackContentProvider .Schema .COL_COMPASS ))) {
483
+ out .append ("\t \t " + "<cmt>" + CDATA_START + "compass: " + c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_COMPASS )) +
484
+ "\n \t \t \t compass accuracy: " + c .getInt (c .getColumnIndex (TrackContentProvider .Schema .COL_COMPASS_ACCURACY )) + CDATA_END + "</cmt>\n " );
485
+ }
486
+ }
487
+
488
+ String link = c .getString (c .getColumnIndex (TrackContentProvider .Schema .COL_LINK ));
489
+ if (link != null ) {
490
+ out .append ("\t \t " + "<link href=\" " + URLEncoder .encode (link ) + "\" >" + "\n " );
491
+ out .append ("\t \t \t " + "<text>" + link +"</text>\n " );
492
+ out .append ("\t \t " + "</link>" + "\n " );
493
+ }
494
+
495
+ if (! c .isNull (c .getColumnIndex (TrackContentProvider .Schema .COL_NBSATELLITES ))) {
496
+ out .append ("\t \t " + "<sat>" + c .getInt (c .getColumnIndex (TrackContentProvider .Schema .COL_NBSATELLITES )) + "</sat>" + "\n " );
497
+ }
498
+
499
+ if (fillHDOP && ! c .isNull (c .getColumnIndex (TrackContentProvider .Schema .COL_ACCURACY ))) {
500
+ out .append ("\t \t " + "<hdop>" + (c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_ACCURACY )) / OSMTracker .HDOP_APPROXIMATION_FACTOR ) + "</hdop>" + "\n " );
501
+ }
502
+
503
+ if (OSMTracker .Preferences .VAL_OUTPUT_COMPASS_EXTENSION .equals (compass ) &&
504
+ ! c .isNull (c .getColumnIndex (TrackContentProvider .Schema .COL_COMPASS ))) {
505
+ out .append ("\t \t <extensions>\n " );
506
+ out .append ("\t \t \t " + "<compass>" + c .getDouble (c .getColumnIndex (TrackContentProvider .Schema .COL_COMPASS )) + "</compass>\n " );
507
+ out .append ("\t \t \t " + "<compass_accuracy>" + c .getInt (c .getColumnIndex (TrackContentProvider .Schema .COL_COMPASS_ACCURACY )) + "</compass_accuracy>" + "\n " );
508
+ out .append ("\t \t </extensions>\n " );
509
+ }
510
+
511
+ out .append ("\t " + "</wpt>" + "\n " );
512
+
513
+ fw .write (out .toString ());
514
+
515
+ if (i % dialogUpdateThreshold == 0 ) {
516
+ publishProgress ((long ) dialogUpdateThreshold );
517
+ }
518
+ }
519
+ }
520
+
521
+ /**
522
+ * Iterates on track points and write them. Short version, one line per point.
331
523
* @param trackName Name of the track (metadata).
332
524
* @param fw Writer to the target file.
333
525
* @param c Cursor to track points.
334
526
* @param fillHDOP Indicates whether fill <hdop> tag with approximation from location accuracy.
335
527
* @param compass Indicates if and how to write compass heading to the GPX ('none', 'comment', 'extension')
336
528
* @throws IOException
337
529
*/
338
- private void writeTrackPoints (String trackName , Writer fw , Cursor c , boolean fillHDOP , String compass ) throws IOException {
530
+ private void writeTrackPoints_short (String trackName , Writer fw , Cursor c , boolean fillHDOP , String compass ) throws IOException {
339
531
// Update dialog every 1%
340
532
int dialogUpdateThreshold = c .getCount () / 100 ;
341
533
if (dialogUpdateThreshold == 0 ) {
@@ -402,15 +594,15 @@ private void writeTrackPoints(String trackName, Writer fw, Cursor c, boolean fil
402
594
}
403
595
404
596
/**
405
- * Iterates on way points and write them.
597
+ * Iterates on way points and write them. Short version, one line per point.
406
598
* @param fw Writer to the target file.
407
599
* @param c Cursor to way points.
408
600
* @param accuracyInfo Constant describing how to include (or not) accuracy info for way points.
409
601
* @param fillHDOP Indicates whether fill <hdop> tag with approximation from location accuracy.
410
602
* @param compass Indicates if and how to write compass heading to the GPX ('none', 'comment', 'extension')
411
603
* @throws IOException
412
604
*/
413
- private void writeWayPoints (Writer fw , Cursor c , String accuracyInfo , boolean fillHDOP , String compass ) throws IOException {
605
+ private void writeWayPoints_short (Writer fw , Cursor c , String accuracyInfo , boolean fillHDOP , String compass ) throws IOException {
414
606
415
607
// Update dialog every 1%
416
608
int dialogUpdateThreshold = c .getCount () / 100 ;
0 commit comments