/** * Reads exif data in Image file (if available) and hydrates object with the most important of them. * Also reads GPS info if set (for instance with gpscorrelate, a GPX file and a bunch of well-tagged pictures) * see for instance http://freefoote.dview.net/linux_gpscorr.html * * @param $filename_with_path * @param $overwrite_geom : if true, then image lon, lat and ele will be overwritten by those taken from the Exif data (if they exist). */ public function populateWithExifDataFrom($filename_with_path, $overwrite_geom = true, $overwrite_datetime = true) { // here, read eventual lon, lat and elevation in exif tag... if (c2cTools::getFileType($filename_with_path) == 'jpg' && ($exif = exif_read_data($filename_with_path))) { $lon = ''; $lat = ''; if (isset($exif['GPSLatitude']) && isset($exif['GPSLongitude']) && isset($exif['GPSLatitudeRef']) && isset($exif['GPSLongitudeRef']) && $overwrite_geom) { if (strtoupper($exif['GPSLongitudeRef']) == "W") { $lon = -1 * self::convertDMSToDecimal($exif['GPSLongitude']); } else { $lon = self::convertDMSToDecimal($exif['GPSLongitude']); } if (strtoupper($exif['GPSLatitudeRef']) == "S") { $lat = -1 * self::convertDMSToDecimal($exif['GPSLatitude']); } else { $lat = self::convertDMSToDecimal($exif['GPSLatitude']); } // some images come with (0,0) coordinates. Skip such cases // also skip obviously wrong values (it happens) if ($lon != 0 && $lat != 0 && abs($lat) < 90 && abs($lon) < 180) { $this->set('lon', $lon); $this->set('lat', $lat); } } $ele = ''; if (isset($exif['GPSAltitude']) && isset($exif['GPSAltitudeRef']) && $overwrite_geom) { if ($exif['GPSAltitudeRef'] == "1") { $ele = -1 * round(self::frac_to_dec($exif['GPSAltitude'])); } else { $ele = round(self::frac_to_dec($exif['GPSAltitude'])); } $this->set('elevation', $ele); } $camera_name = null; if (isset($exif['Make']) && strtolower($exif['Make']) != 'canon') { $camera_name = $exif['Make']; } if (isset($exif['Model'])) { if (strtolower($exif['Make']) != 'canon') { $camera_name .= ' ' . $exif['Model']; } else { $camera_name = $exif['Model']; } } $this->set('camera_name', $camera_name); if (isset($exif['DateTimeOriginal']) && $overwrite_datetime) { $image_date = str_replace(' ', ':', $exif['DateTimeOriginal']); $image_date = explode(':', $image_date); $image_date = mktime($image_date[3], $image_date[4], $image_date[5], $image_date[1], $image_date[2], $image_date[0]); $this->set('date_time', date('c', $image_date)); } if (isset($exif['ExposureTime'])) { $this->set('exposure_time', self::frac_to_dec($exif['ExposureTime'])); } if (isset($exif['FNumber'])) { $this->set('fnumber', self::frac_to_dec($exif['FNumber'])); } if (isset($exif['ISOSpeedRatings'])) { $iso_speed = is_array($exif['ISOSpeedRatings']) ? $exif['ISOSpeedRatings'][0] : $exif['ISOSpeedRatings']; $this->set('iso_speed', $iso_speed); } if (isset($exif['FocalLength'])) { $this->set('focal_length', self::frac_to_dec($exif['FocalLength'])); } c2cTools::log("Image::populateWithExifDataFrom found GPS data in exif tag : {$lon}, {$lat}, {$ele}"); } }
/** * Returns a 3D or 4D WKT */ protected function getWktFromFileUpload($request) { $path = sfConfig::get('sf_upload_dir') . DIRECTORY_SEPARATOR . c2cTools::generateUniqueName(); $status = $request->moveFile('gps_data', $path); $type = c2cTools::getFileType($path); c2cTools::log("File uploaded to: {$path} with status: {$status} and a file type of: {$type}"); $finalPath = $path; $wkt = NULL; // we rename file according to true type // FIXME as for now we only accept gpx, // this is kinda redundant... if ($type) { $status = rename($path, "{$path}.{$type}"); if ($status) { $finalPath = $path . '.' . $type; c2cTools::log("File renamed: {$finalPath}"); $wkt = $this->getWktFromFile($finalPath, $type); c2cTools::log("wkt computed"); } } // we clear temp file : unlink($finalPath); //c2cTools::log("getWktFromFileUpload has generated this WKT: $wkt"); return $wkt; }
/** * Get file extension from a file path (eg. /tmp/photo.jpg) using file type info. * * @input string filepath * @return string ext **/ public static function detectExtension($filepath) { return '.' . c2cTools::getFileType($filepath); }