source: extensions/AMetaData/JpegMetaData/Readers/GpsReader.class.php @ 4904

Last change on this file since 4904 was 4904, checked in by grum, 14 years ago

Optimize some memory leak and some bugged lines of code

  • Property svn:executable set to *
File size: 6.7 KB
Line 
1<?php
2/*
3 * --:: JPEG MetaDatas ::-------------------------------------------------------
4 *
5 *  Author    : Grum
6 *   email    : grum at piwigo.org
7 *   website  : http://photos.grum.fr
8 *
9 *   << May the Little SpaceFrog be with you ! >>
10 *
11 *
12 * +-----------------------------------------------------------------------+
13 * | JpegMetaData - a PHP based Jpeg Metadata manager                      |
14 * +-----------------------------------------------------------------------+
15 * | Copyright(C) 2010  Grum - http://www.grum.fr                          |
16 * +-----------------------------------------------------------------------+
17 * | This program is free software; you can redistribute it and/or modify  |
18 * | it under the terms of the GNU General Public License as published by  |
19 * | the Free Software Foundation                                          |
20 * |                                                                       |
21 * | This program is distributed in the hope that it will be useful, but   |
22 * | WITHOUT ANY WARRANTY; without even the implied warranty of            |
23 * | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
24 * | General Public License for more details.                              |
25 * |                                                                       |
26 * | You should have received a copy of the GNU General Public License     |
27 * | along with this program; if not, write to the Free Software           |
28 * | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
29 * | USA.                                                                  |
30 * +-----------------------------------------------------------------------+
31 *
32 *
33 * -----------------------------------------------------------------------------
34 *
35 * The GpsReader class is dedicated to read GPS tags from a sub IFD structure
36 *
37 * ======> See IfdReader.class.php to know more about an IFD structure <========
38 *
39 * -----------------------------------------------------------------------------
40 *
41 * .. Notes ..
42 *
43 *
44 * The GpsReader class is derived from the IfdReader class.
45 *
46 * ========> See IfdReader.class.php to know more about common methods <========
47 *
48 * -----------------------------------------------------------------------------
49 */
50
51  require_once(JPEG_METADATA_DIR."TagDefinitions/GpsTags.class.php");
52  require_once(JPEG_METADATA_DIR."Readers/MakerNotesReader.class.php");
53
54  class GpsReader extends IfdReader
55  {
56    function __destruct()
57    {
58      parent::__destruct();
59    }
60
61    /**
62     * initialize the definition of the GPS tags
63     */
64    protected function initializeTagDef()
65    {
66      $this->tagDef = new GpsTags();
67    }
68
69    /**
70     * this function do the interpretation of specials tags and overrides the
71     * IfdReader function
72    */
73    protected function processSpecialTag($tagId, $values, $type, $valuesOffset=0)
74    {
75      switch($tagId)
76      {
77        case 0x0000: // Version
78          $returned=sprintf("%d.%d.%d.%d", $values[0], $values[1], $values[2], $values[3]);
79          break;
80        case 0x0001: // GPSLatitudeRef
81        case 0x0013: // GPSDestLatitudeRef
82          switch(substr($values,0,1))
83          {
84            case "N" :
85              $returned="north";
86              break;
87            case "S" :
88              $returned="south";
89              break;
90            default:
91              $returned="unknown";
92              break;
93          }
94          break;
95        case 0x0002: // GPSLatitude
96        case 0x0004: // GPSLongitude
97        case 0x0014: // GPSDestLatitude
98        case 0x0016: // GPSDestLongitude
99          /*
100           * converted in degrees, minutes and seconds
101           */
102          $returned=ConvertData::toDMS($values[0], $values[1], $values[2]);
103          break;
104        case 0x0003: // GPSLongitudeRef
105        case 0x0015: // GPSDestLongitudeRef
106          switch(substr($values,0,1))
107          {
108            case "E" :
109              $returned="east";
110              break;
111            case "W" :
112              $returned="west";
113              break;
114            default:
115              $returned="unknown";
116              break;
117          }
118          break;
119        case 0x0006: // GPSAltitude
120        case 0x000D: // GPSSpeed
121        case 0x000F: // GPSTrack
122        case 0x0011: // GPSImgDirection
123        case 0x0018: // GPSDestBearing
124        case 0x001A: // GPSDestDistance
125          if($values[1]==0) $values[1]=1;
126          $returned=round($values[0]/$values[1],2);
127          break;
128        case 0x0008: // GPSSatellites
129        case 0x0012: // GPSMapDatum
130        case 0x001B: // GPSProcessingMethod => not sure about the string format...
131        case 0x001C: // GPSAreaInformation => not sure about the string format...
132          $returned=ConvertData::toStrings($values);
133          break;
134        case 0x0009: // GPSStatus
135          switch(substr($values,0,1))
136          {
137            case "A" :
138              $returned="measurement in progress";
139              break;
140            case "V" :
141              $returned="measurement interoperability";
142              break;
143            default:
144              $returned="unknown";
145              break;
146          }
147          break;
148        case 0x000A: // GPSMeasureMode
149          switch(substr($values,0,1))
150          {
151            case "2" :
152              $returned="2-dimensional measurement";
153              break;
154            case "3" :
155              $returned="3-dimensional measurement";
156              break;
157            default:
158              $returned="unknown";
159              break;
160          }
161          break;
162        case 0x000C: // GPSSpeedRef
163        case 0x0019: // GPSDestDistanceRef
164          switch(substr($values,0,1))
165          {
166            case "K" :
167              $returned="kilometers per hour";
168              break;
169            case "M" :
170              $returned="miles per hour";
171              break;
172            case "N" :
173              $returned="knots";
174              break;
175            default:
176              $returned="unknown";
177              break;
178          }
179          break;
180        case 0x000E: // GPSTrackRef
181        case 0x0010: // GPSImgDirectionRef
182        case 0x0017: // GPSDestBearingRef
183          switch(substr($values,0,1))
184          {
185            case "T" :
186              $returned="true direction";
187              break;
188            case "M" :
189              $returned="magnetic direction";
190              break;
191            default:
192              $returned="unknown";
193              break;
194          }
195          break;
196        case 0x001D: // GPSDateStamp
197          $returned=ConvertData::toDateTime($values);
198          break;
199        default:
200          $returned="Not yet implemented;".ConvertData::toHexDump($tagId, ByteType::USHORT)." => ".ConvertData::toHexDump($values, $type);
201          break;
202      }
203      return($returned);
204    }
205
206  }
207
208
209?>
Note: See TracBrowser for help on using the repository browser.