ExifGPSTagSet.java revision 13532:859397229dc4
1/*
2 * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package javax.imageio.plugins.tiff;
27
28import java.nio.charset.StandardCharsets;
29import java.util.ArrayList;
30import java.util.List;
31
32/**
33 * A class representing the tags found in an Exif GPS Info IFD.
34 *
35 * <p> The definitions of the data types referenced by the field
36 * definitions may be found in the {@link TIFFTag TIFFTag} class.
37 *
38 * @since 9
39 * @see   ExifTIFFTagSet
40 */
41public class ExifGPSTagSet extends TIFFTagSet {
42    private static ExifGPSTagSet theInstance = null;
43
44    /**
45     * A tag indicating the GPS tag version (type BYTE, count = 4).
46     *
47     * @see #GPS_VERSION_2_2
48     */
49    public static final int TAG_GPS_VERSION_ID = 0;
50
51    /**
52     * A value to be used with the "GPSVersionID" tag to indicate GPS version
53     * 2.2.  The value equals the US-ASCII encoding of the byte array
54     * <code>{'2', '2', '0', '0'}</code>.
55     *
56     * @see #TAG_GPS_VERSION_ID
57     */
58    public static final String GPS_VERSION_2_2 =
59        new String(new byte[] { '2', '2', '0', '0' },
60        StandardCharsets.US_ASCII);
61
62    /**
63     * A tag indicating the North or South latitude (type ASCII, count = 2).
64     *
65     * @see #LATITUDE_REF_NORTH
66     * @see #LATITUDE_REF_SOUTH
67     */
68    public static final int TAG_GPS_LATITUDE_REF = 1;
69
70    /**
71     * A tag indicating the Latitude (type RATIONAL, count = 3).
72     */
73    public static final int TAG_GPS_LATITUDE = 2;
74
75    /**
76     * A tag indicating the East or West Longitude (type ASCII, count = 2).
77     *
78     * @see #LONGITUDE_REF_EAST
79     * @see #LONGITUDE_REF_WEST
80     */
81    public static final int TAG_GPS_LONGITUDE_REF = 3;
82
83    /**
84     * A tag indicating the Longitude (type RATIONAL, count = 3).
85     */
86    public static final int TAG_GPS_LONGITUDE = 4;
87
88    /**
89     * A tag indicating the Altitude reference (type BYTE, count = 1);
90     *
91     * @see #ALTITUDE_REF_SEA_LEVEL
92     * @see #ALTITUDE_REF_SEA_LEVEL_REFERENCE
93     */
94    public static final int TAG_GPS_ALTITUDE_REF = 5;
95
96    /**
97     * A tag indicating the Altitude (type RATIONAL, count = 1).
98     */
99    public static final int TAG_GPS_ALTITUDE = 6;
100
101    /**
102     * A tag indicating the GPS time (atomic clock) (type RATIONAL, count = 3).
103     */
104    public static final int TAG_GPS_TIME_STAMP = 7;
105
106    /**
107     * A tag indicating the GPS satellites used for measurement (type ASCII).
108     */
109    public static final int TAG_GPS_SATELLITES = 8;
110
111    /**
112     * A tag indicating the GPS receiver status (type ASCII, count = 2).
113     *
114     * @see #STATUS_MEASUREMENT_IN_PROGRESS
115     * @see #STATUS_MEASUREMENT_INTEROPERABILITY
116     */
117    public static final int TAG_GPS_STATUS = 9;
118
119    /**
120     * A tag indicating the GPS measurement mode (type ASCII, count = 2).
121     *
122     * @see #MEASURE_MODE_2D
123     * @see #MEASURE_MODE_3D
124     */
125    public static final int TAG_GPS_MEASURE_MODE = 10;
126
127    /**
128     * A tag indicating the Measurement precision (type RATIONAL, count = 1).
129     */
130    public static final int TAG_GPS_DOP = 11;
131
132    /**
133     * A tag indicating the Speed unit (type ASCII, count = 2).
134     *
135     * @see #SPEED_REF_KILOMETERS_PER_HOUR
136     * @see #SPEED_REF_MILES_PER_HOUR
137     * @see #SPEED_REF_KNOTS
138     */
139    public static final int TAG_GPS_SPEED_REF = 12;
140
141    /**
142     * A tag indicating the Speed of GPS receiver (type RATIONAL, count = 1).
143     */
144    public static final int TAG_GPS_SPEED = 13;
145
146    /**
147     * A tag indicating the Reference for direction of movement (type ASCII,
148     * count = 2).
149     *
150     * @see #DIRECTION_REF_TRUE
151     * @see #DIRECTION_REF_MAGNETIC
152     */
153    public static final int TAG_GPS_TRACK_REF = 14;
154
155    /**
156     * A tag indicating the Direction of movement (type RATIONAL, count = 1).
157     */
158    public static final int TAG_GPS_TRACK = 15;
159
160    /**
161     * A tag indicating the Reference for direction of image (type ASCII,
162     * count = 2).
163     *
164     * @see #DIRECTION_REF_TRUE
165     * @see #DIRECTION_REF_MAGNETIC
166     */
167    public static final int TAG_GPS_IMG_DIRECTION_REF = 16;
168
169    /**
170     * A tag indicating the Direction of image (type RATIONAL, count = 1).
171     */
172    public static final int TAG_GPS_IMG_DIRECTION = 17;
173
174    /**
175     * A tag indicating the Geodetic survey data used (type ASCII).
176     */
177    public static final int TAG_GPS_MAP_DATUM = 18;
178
179    /**
180     * A tag indicating the Reference for latitude of destination (type
181     * ASCII, count = 2).
182     *
183     * @see #LATITUDE_REF_NORTH
184     * @see #LATITUDE_REF_SOUTH
185     */
186    public static final int TAG_GPS_DEST_LATITUDE_REF = 19;
187
188    /**
189     * A tag indicating the Latitude of destination (type RATIONAL, count = 3).
190     */
191    public static final int TAG_GPS_DEST_LATITUDE = 20;
192
193    /**
194     * A tag indicating the Reference for longitude of destination (type
195     * ASCII, count = 2).
196     *
197     * @see #LONGITUDE_REF_EAST
198     * @see #LONGITUDE_REF_WEST
199     */
200    public static final int TAG_GPS_DEST_LONGITUDE_REF = 21;
201
202    /**
203     * A tag indicating the Longitude of destination (type RATIONAL,
204     * count = 3).
205     */
206    public static final int TAG_GPS_DEST_LONGITUDE = 22;
207
208    /**
209     * A tag indicating the Reference for bearing of destination (type ASCII,
210     * count = 2).
211     *
212     * @see #DIRECTION_REF_TRUE
213     * @see #DIRECTION_REF_MAGNETIC
214     */
215    public static final int TAG_GPS_DEST_BEARING_REF = 23;
216
217    /**
218     * A tag indicating the Bearing of destination (type RATIONAL, count = 1).
219     */
220    public static final int TAG_GPS_DEST_BEARING = 24;
221
222    /**
223     * A tag indicating the Reference for distance to destination (type ASCII,
224     * count = 2).
225     *
226     * @see #DEST_DISTANCE_REF_KILOMETERS
227     * @see #DEST_DISTANCE_REF_MILES
228     * @see #DEST_DISTANCE_REF_KNOTS
229     */
230    public static final int TAG_GPS_DEST_DISTANCE_REF = 25;
231
232    /**
233     * A tag indicating the Distance to destination (type RATIONAL, count = 1).
234     */
235    public static final int TAG_GPS_DEST_DISTANCE = 26;
236
237    /**
238     * A tag indicating the Name of GPS processing method (type UNDEFINED).
239     */
240    public static final int TAG_GPS_PROCESSING_METHOD = 27;
241
242    /**
243     * A tag indicating the Name of GPS area (type UNDEFINED).
244     */
245    public static final int TAG_GPS_AREA_INFORMATION = 28;
246
247    /**
248     * A tag indicating the GPS date (type ASCII, count 11).
249     */
250    public static final int TAG_GPS_DATE_STAMP = 29;
251
252    /**
253     * A tag indicating the GPS differential correction (type SHORT,
254     * count = 1).
255     *
256     * @see #DIFFERENTIAL_CORRECTION_NONE
257     * @see #DIFFERENTIAL_CORRECTION_APPLIED
258     */
259    public static final int TAG_GPS_DIFFERENTIAL = 30;
260
261    /**
262     * A value to be used with the "GPSLatitudeRef" and
263     * "GPSDestLatitudeRef" tags.
264     *
265     * @see #TAG_GPS_LATITUDE_REF
266     * @see #TAG_GPS_DEST_LATITUDE_REF
267     */
268    public static final String LATITUDE_REF_NORTH = "N";
269
270    /**
271     * A value to be used with the "GPSLatitudeRef" and
272     * "GPSDestLatitudeRef" tags.
273     *
274     * @see #TAG_GPS_LATITUDE_REF
275     * @see #TAG_GPS_DEST_LATITUDE_REF
276     */
277    public static final String LATITUDE_REF_SOUTH = "S";
278
279    /**
280     * A value to be used with the "GPSLongitudeRef" and
281     * "GPSDestLongitudeRef" tags.
282     *
283     * @see #TAG_GPS_LONGITUDE_REF
284     * @see #TAG_GPS_DEST_LONGITUDE_REF
285     */
286    public static final String LONGITUDE_REF_EAST = "E";
287
288    /**
289     * A value to be used with the "GPSLongitudeRef" and
290     * "GPSDestLongitudeRef" tags.
291     *
292     * @see #TAG_GPS_LONGITUDE_REF
293     * @see #TAG_GPS_DEST_LONGITUDE_REF
294     */
295    public static final String LONGITUDE_REF_WEST = "W";
296
297    /**
298     * A value to be used with the "GPSAltitudeRef" tag.
299     *
300     * @see #TAG_GPS_ALTITUDE_REF
301     */
302    public static final int ALTITUDE_REF_SEA_LEVEL = 0;
303
304    /**
305     * A value to be used with the "GPSAltitudeRef" tag.
306     *
307     * @see #TAG_GPS_ALTITUDE_REF
308     */
309    public static final int ALTITUDE_REF_SEA_LEVEL_REFERENCE = 1;
310
311    /**
312     * A value to be used with the "GPSStatus" tag.
313     *
314     * @see #TAG_GPS_STATUS
315     */
316    public static final String STATUS_MEASUREMENT_IN_PROGRESS = "A";
317
318    /**
319     * A value to be used with the "GPSStatus" tag.
320     *
321     * @see #TAG_GPS_STATUS
322     */
323    public static final String STATUS_MEASUREMENT_INTEROPERABILITY = "V";
324
325    /**
326     * A value to be used with the "GPSMeasureMode" tag.
327     *
328     * @see #TAG_GPS_MEASURE_MODE
329     */
330    public static final String MEASURE_MODE_2D = "2";
331
332    /**
333     * A value to be used with the "GPSMeasureMode" tag.
334     *
335     * @see #TAG_GPS_MEASURE_MODE
336     */
337    public static final String MEASURE_MODE_3D = "3";
338
339    /**
340     * A value to be used with the "GPSSpeedRef" tag.
341     *
342     * @see #TAG_GPS_SPEED_REF
343     */
344    public static final String SPEED_REF_KILOMETERS_PER_HOUR = "K";
345
346    /**
347     * A value to be used with the "GPSSpeedRef" tag.
348     *
349     * @see #TAG_GPS_SPEED_REF
350     */
351    public static final String SPEED_REF_MILES_PER_HOUR = "M";
352
353    /**
354     * A value to be used with the "GPSSpeedRef" tag.
355     *
356     * @see #TAG_GPS_SPEED_REF
357     */
358    public static final String SPEED_REF_KNOTS = "N";
359
360    /**
361     * A value to be used with the "GPSTrackRef", "GPSImgDirectionRef",
362     * and "GPSDestBearingRef" tags.
363     *
364     * @see #TAG_GPS_TRACK_REF
365     * @see #TAG_GPS_IMG_DIRECTION_REF
366     * @see #TAG_GPS_DEST_BEARING_REF
367     */
368    public static final String DIRECTION_REF_TRUE = "T";
369
370    /**
371     * A value to be used with the "GPSTrackRef", "GPSImgDirectionRef",
372     * and "GPSDestBearingRef" tags.
373     *
374     * @see #TAG_GPS_TRACK_REF
375     * @see #TAG_GPS_IMG_DIRECTION_REF
376     * @see #TAG_GPS_DEST_BEARING_REF
377     */
378    public static final String DIRECTION_REF_MAGNETIC = "M";
379
380    /**
381     * A value to be used with the "GPSDestDistanceRef" tag.
382     *
383     * @see #TAG_GPS_DEST_DISTANCE_REF
384     */
385    public static final String DEST_DISTANCE_REF_KILOMETERS = "K";
386
387    /**
388     * A value to be used with the "GPSDestDistanceRef" tag.
389     *
390     * @see #TAG_GPS_DEST_DISTANCE_REF
391     */
392    public static final String DEST_DISTANCE_REF_MILES = "M";
393
394    /**
395     * A value to be used with the "GPSDestDistanceRef" tag.
396     *
397     * @see #TAG_GPS_DEST_DISTANCE_REF
398     */
399    public static final String DEST_DISTANCE_REF_KNOTS = "N";
400
401    /**
402     * A value to be used with the "GPSDifferential" tag.
403     *
404     * @see #TAG_GPS_DIFFERENTIAL
405     */
406    public static final int DIFFERENTIAL_CORRECTION_NONE = 0;
407
408    /**
409     * A value to be used with the "GPSDifferential" tag.
410     *
411     * @see #TAG_GPS_DIFFERENTIAL
412     */
413    public static final int DIFFERENTIAL_CORRECTION_APPLIED = 1;
414
415    static class GPSVersionID extends TIFFTag {
416        public GPSVersionID() {
417            super("GPSVersionID",
418                  TAG_GPS_VERSION_ID,
419                  1 << TIFFTag.TIFF_BYTE);
420        }
421    }
422
423    static class GPSLatitudeRef extends TIFFTag {
424        public GPSLatitudeRef() {
425            super("GPSLatitudeRef",
426                  TAG_GPS_LATITUDE_REF,
427                  1 << TIFFTag.TIFF_ASCII);
428        }
429    }
430
431    static class GPSLatitude extends TIFFTag {
432        public GPSLatitude() {
433            super("GPSLatitude",
434                  TAG_GPS_LATITUDE,
435                  1 << TIFFTag.TIFF_RATIONAL);
436        }
437    }
438
439    static class GPSLongitudeRef extends TIFFTag {
440        public GPSLongitudeRef() {
441            super("GPSLongitudeRef",
442                  TAG_GPS_LONGITUDE_REF,
443                  1 << TIFFTag.TIFF_ASCII);
444        }
445    }
446
447    static class GPSLongitude extends TIFFTag {
448        public GPSLongitude() {
449            super("GPSLongitude",
450                  TAG_GPS_LONGITUDE,
451                  1 << TIFFTag.TIFF_RATIONAL);
452        }
453    }
454
455    static class GPSAltitudeRef extends TIFFTag {
456        public GPSAltitudeRef() {
457            super("GPSAltitudeRef",
458                  TAG_GPS_ALTITUDE_REF,
459                  1 << TIFFTag.TIFF_BYTE);
460
461            addValueName(ALTITUDE_REF_SEA_LEVEL, "Sea level");
462            addValueName(ALTITUDE_REF_SEA_LEVEL_REFERENCE,
463                         "Sea level reference (negative value)");
464        }
465    }
466
467    static class GPSAltitude extends TIFFTag {
468        public GPSAltitude() {
469            super("GPSAltitude",
470                  TAG_GPS_ALTITUDE,
471                  1 << TIFFTag.TIFF_RATIONAL);
472        }
473    }
474
475    static class GPSTimeStamp extends TIFFTag {
476        public GPSTimeStamp() {
477            super("GPSTimeStamp",
478                  TAG_GPS_TIME_STAMP,
479                  1 << TIFFTag.TIFF_RATIONAL);
480        }
481    }
482
483    static class GPSSatellites extends TIFFTag {
484        public GPSSatellites() {
485            super("GPSSatellites",
486                  TAG_GPS_SATELLITES,
487                  1 << TIFFTag.TIFF_ASCII);
488        }
489    }
490
491    static class GPSStatus extends TIFFTag {
492        public GPSStatus() {
493            super("GPSStatus",
494                  TAG_GPS_STATUS,
495                  1 << TIFFTag.TIFF_ASCII);
496        }
497    }
498
499    static class GPSMeasureMode extends TIFFTag {
500        public GPSMeasureMode() {
501            super("GPSMeasureMode",
502                  TAG_GPS_MEASURE_MODE,
503                  1 << TIFFTag.TIFF_ASCII);
504        }
505    }
506
507    static class GPSDOP extends TIFFTag {
508        public GPSDOP() {
509            super("GPSDOP",
510                  TAG_GPS_DOP,
511                  1 << TIFFTag.TIFF_RATIONAL);
512        }
513    }
514
515    static class GPSSpeedRef extends TIFFTag {
516        public GPSSpeedRef() {
517            super("GPSSpeedRef",
518                  TAG_GPS_SPEED_REF,
519                  1 << TIFFTag.TIFF_ASCII);
520        }
521    }
522
523    static class GPSSpeed extends TIFFTag {
524        public GPSSpeed() {
525            super("GPSSpeed",
526                  TAG_GPS_SPEED,
527                  1 << TIFFTag.TIFF_RATIONAL);
528        }
529    }
530
531    static class GPSTrackRef extends TIFFTag {
532        public GPSTrackRef() {
533            super("GPSTrackRef",
534                  TAG_GPS_TRACK_REF,
535                  1 << TIFFTag.TIFF_ASCII);
536        }
537    }
538
539    static class GPSTrack extends TIFFTag {
540        public GPSTrack() {
541            super("GPSTrack",
542                  TAG_GPS_TRACK,
543                  1 << TIFFTag.TIFF_RATIONAL);
544        }
545    }
546
547    static class GPSImgDirectionRef extends TIFFTag {
548        public GPSImgDirectionRef() {
549            super("GPSImgDirectionRef",
550                  TAG_GPS_IMG_DIRECTION_REF,
551                  1 << TIFFTag.TIFF_ASCII);
552        }
553    }
554
555    static class GPSImgDirection extends TIFFTag {
556        public GPSImgDirection() {
557            super("GPSImgDirection",
558                  TAG_GPS_IMG_DIRECTION,
559                  1 << TIFFTag.TIFF_RATIONAL);
560        }
561    }
562
563    static class GPSMapDatum extends TIFFTag {
564        public GPSMapDatum() {
565            super("GPSMapDatum",
566                  TAG_GPS_MAP_DATUM,
567                  1 << TIFFTag.TIFF_ASCII);
568        }
569    }
570
571    static class GPSDestLatitudeRef extends TIFFTag {
572        public GPSDestLatitudeRef() {
573            super("GPSDestLatitudeRef",
574                  TAG_GPS_DEST_LATITUDE_REF,
575                  1 << TIFFTag.TIFF_ASCII);
576        }
577    }
578
579    static class GPSDestLatitude extends TIFFTag {
580        public GPSDestLatitude() {
581            super("GPSDestLatitude",
582                  TAG_GPS_DEST_LATITUDE,
583                  1 << TIFFTag.TIFF_RATIONAL);
584        }
585    }
586
587    static class GPSDestLongitudeRef extends TIFFTag {
588        public GPSDestLongitudeRef() {
589            super("GPSDestLongitudeRef",
590                  TAG_GPS_DEST_LONGITUDE_REF,
591                  1 << TIFFTag.TIFF_ASCII);
592        }
593    }
594
595    static class GPSDestLongitude extends TIFFTag {
596        public GPSDestLongitude() {
597            super("GPSDestLongitude",
598                  TAG_GPS_DEST_LONGITUDE,
599                  1 << TIFFTag.TIFF_RATIONAL);
600        }
601    }
602
603    static class GPSDestBearingRef extends TIFFTag {
604        public GPSDestBearingRef() {
605            super("GPSDestBearingRef",
606                  TAG_GPS_DEST_BEARING_REF,
607                  1 << TIFFTag.TIFF_ASCII);
608        }
609    }
610
611    static class GPSDestBearing extends TIFFTag {
612        public GPSDestBearing() {
613            super("GPSDestBearing",
614                  TAG_GPS_DEST_BEARING,
615                  1 << TIFFTag.TIFF_RATIONAL);
616        }
617    }
618
619    static class GPSDestDistanceRef extends TIFFTag {
620        public GPSDestDistanceRef() {
621            super("GPSDestDistanceRef",
622                  TAG_GPS_DEST_DISTANCE_REF,
623                  1 << TIFFTag.TIFF_ASCII);
624        }
625    }
626
627    static class GPSDestDistance extends TIFFTag {
628        public GPSDestDistance() {
629            super("GPSDestDistance",
630                  TAG_GPS_DEST_DISTANCE,
631                  1 << TIFFTag.TIFF_RATIONAL);
632        }
633    }
634
635    static class GPSProcessingMethod extends TIFFTag {
636        public GPSProcessingMethod() {
637            super("GPSProcessingMethod",
638                  TAG_GPS_PROCESSING_METHOD,
639                  1 << TIFFTag.TIFF_UNDEFINED);
640        }
641    }
642
643    static class GPSAreaInformation extends TIFFTag {
644        public GPSAreaInformation() {
645            super("GPSAreaInformation",
646                  TAG_GPS_AREA_INFORMATION,
647                  1 << TIFFTag.TIFF_UNDEFINED);
648        }
649    }
650
651    static class GPSDateStamp extends TIFFTag {
652        public GPSDateStamp() {
653            super("GPSDateStamp",
654                  TAG_GPS_DATE_STAMP,
655                  1 << TIFFTag.TIFF_ASCII);
656        }
657    }
658
659    static class GPSDifferential extends TIFFTag {
660        public GPSDifferential() {
661            super("GPSDifferential",
662                  TAG_GPS_DIFFERENTIAL,
663                  1 << TIFFTag.TIFF_SHORT);
664            addValueName(DIFFERENTIAL_CORRECTION_NONE,
665                         "Measurement without differential correction");
666            addValueName(DIFFERENTIAL_CORRECTION_APPLIED,
667                         "Differential correction applied");
668
669        }
670    }
671
672    private static List<TIFFTag> initTags() {
673        ArrayList<TIFFTag> tags = new ArrayList<TIFFTag>(31);
674
675        tags.add(new GPSVersionID());
676        tags.add(new GPSLatitudeRef());
677        tags.add(new GPSLatitude());
678        tags.add(new GPSLongitudeRef());
679        tags.add(new GPSLongitude());
680        tags.add(new GPSAltitudeRef());
681        tags.add(new GPSAltitude());
682        tags.add(new GPSTimeStamp());
683        tags.add(new GPSSatellites());
684        tags.add(new GPSStatus());
685        tags.add(new GPSMeasureMode());
686        tags.add(new GPSDOP());
687        tags.add(new GPSSpeedRef());
688        tags.add(new GPSSpeed());
689        tags.add(new GPSTrackRef());
690        tags.add(new GPSTrack());
691        tags.add(new GPSImgDirectionRef());
692        tags.add(new GPSImgDirection());
693        tags.add(new GPSMapDatum());
694        tags.add(new GPSDestLatitudeRef());
695        tags.add(new GPSDestLatitude());
696        tags.add(new GPSDestLongitudeRef());
697        tags.add(new GPSDestLongitude());
698        tags.add(new GPSDestBearingRef());
699        tags.add(new GPSDestBearing());
700        tags.add(new GPSDestDistanceRef());
701        tags.add(new GPSDestDistance());
702        tags.add(new GPSProcessingMethod());
703        tags.add(new GPSAreaInformation());
704        tags.add(new GPSDateStamp());
705        tags.add(new GPSDifferential());
706        return tags;
707    }
708
709    private ExifGPSTagSet() {
710        super(initTags());
711    }
712
713    /**
714     * Returns a shared instance of an <code>ExifGPSTagSet</code>.
715     *
716     * @return an <code>ExifGPSTagSet</code> instance.
717     */
718    public synchronized static ExifGPSTagSet getInstance() {
719        if (theInstance == null) {
720            theInstance = new ExifGPSTagSet();
721        }
722        return theInstance;
723    }
724}
725