Merge pull request #1916 from rabuzarus/geotag
port of red matrix geotag feature
This commit is contained in:
commit
525442e4fd
|
@ -345,38 +345,37 @@ class Photo {
|
||||||
}
|
}
|
||||||
|
|
||||||
public function orient($filename) {
|
public function orient($filename) {
|
||||||
if ($this->is_imagick()) {
|
if ($this->is_imagick()) {
|
||||||
// based off comment on http://php.net/manual/en/imagick.getimageorientation.php
|
// based off comment on http://php.net/manual/en/imagick.getimageorientation.php
|
||||||
$orientation = $this->image->getImageOrientation();
|
$orientation = $this->image->getImageOrientation();
|
||||||
switch ($orientation) {
|
switch ($orientation) {
|
||||||
case imagick::ORIENTATION_BOTTOMRIGHT:
|
case imagick::ORIENTATION_BOTTOMRIGHT:
|
||||||
$this->image->rotateimage("#000", 180);
|
$this->image->rotateimage("#000", 180);
|
||||||
break;
|
break;
|
||||||
case imagick::ORIENTATION_RIGHTTOP:
|
case imagick::ORIENTATION_RIGHTTOP:
|
||||||
$this->image->rotateimage("#000", 90);
|
$this->image->rotateimage("#000", 90);
|
||||||
break;
|
break;
|
||||||
case imagick::ORIENTATION_LEFTBOTTOM:
|
case imagick::ORIENTATION_LEFTBOTTOM:
|
||||||
$this->image->rotateimage("#000", -90);
|
$this->image->rotateimage("#000", -90);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->image->setImageOrientation(imagick::ORIENTATION_TOPLEFT);
|
$this->image->setImageOrientation(imagick::ORIENTATION_TOPLEFT);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
// based off comment on http://php.net/manual/en/function.imagerotate.php
|
// based off comment on http://php.net/manual/en/function.imagerotate.php
|
||||||
|
|
||||||
if(!$this->is_valid())
|
if(!$this->is_valid())
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if( (! function_exists('exif_read_data')) || ($this->getType() !== 'image/jpeg') )
|
if( (! function_exists('exif_read_data')) || ($this->getType() !== 'image/jpeg') )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
$exif = @exif_read_data($filename);
|
$exif = @exif_read_data($filename,null,true);
|
||||||
|
if(! $exif)
|
||||||
|
return;
|
||||||
|
|
||||||
if(! $exif)
|
$ort = $exif['IFD0']['Orientation'];
|
||||||
return;
|
|
||||||
|
|
||||||
$ort = $exif['Orientation'];
|
|
||||||
|
|
||||||
switch($ort)
|
switch($ort)
|
||||||
{
|
{
|
||||||
|
@ -413,6 +412,10 @@ class Photo {
|
||||||
$this->rotate(90);
|
$this->rotate(90);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// logger('exif: ' . print_r($exif,true));
|
||||||
|
return $exif;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ function get_features() {
|
||||||
t('General Features'),
|
t('General Features'),
|
||||||
//array('expire', t('Content Expiration'), t('Remove old posts/comments after a period of time')),
|
//array('expire', t('Content Expiration'), t('Remove old posts/comments after a period of time')),
|
||||||
array('multi_profiles', t('Multiple Profiles'), t('Ability to create multiple profiles')),
|
array('multi_profiles', t('Multiple Profiles'), t('Ability to create multiple profiles')),
|
||||||
|
array('photo_location', t('Photo Location'), t('Photo metadata is normally stripped. This extracts the location (if present) prior to stripping metadata and links it to a map.'),false),
|
||||||
),
|
),
|
||||||
|
|
||||||
// Post composition
|
// Post composition
|
||||||
|
|
27
include/photos.php
Normal file
27
include/photos.php
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @file include/photos.php
|
||||||
|
* @brief Functions related to photo handling.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getGps($exifCoord, $hemi) {
|
||||||
|
$degrees = count($exifCoord) > 0 ? gps2Num($exifCoord[0]) : 0;
|
||||||
|
$minutes = count($exifCoord) > 1 ? gps2Num($exifCoord[1]) : 0;
|
||||||
|
$seconds = count($exifCoord) > 2 ? gps2Num($exifCoord[2]) : 0;
|
||||||
|
|
||||||
|
$flip = ($hemi == 'W' or $hemi == 'S') ? -1 : 1;
|
||||||
|
|
||||||
|
return floatval($flip * ($degrees + ($minutes / 60) + ($seconds / 3600)));
|
||||||
|
}
|
||||||
|
|
||||||
|
function gps2Num($coordPart) {
|
||||||
|
$parts = explode('/', $coordPart);
|
||||||
|
|
||||||
|
if (count($parts) <= 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (count($parts) == 1)
|
||||||
|
return $parts[0];
|
||||||
|
|
||||||
|
return floatval($parts[0]) / floatval($parts[1]);
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
require_once('include/Photo.php');
|
require_once('include/Photo.php');
|
||||||
|
require_once('include/photos.php');
|
||||||
require_once('include/items.php');
|
require_once('include/items.php');
|
||||||
require_once('include/acl_selectors.php');
|
require_once('include/acl_selectors.php');
|
||||||
require_once('include/bbcode.php');
|
require_once('include/bbcode.php');
|
||||||
|
@ -200,6 +201,10 @@ function photos_post(&$a) {
|
||||||
goaway($a->get_baseurl() . '/' . $_SESSION['photo_return']);
|
goaway($a->get_baseurl() . '/' . $_SESSION['photo_return']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* RENAME photo album
|
||||||
|
*/
|
||||||
|
|
||||||
$newalbum = notags(trim($_POST['albumname']));
|
$newalbum = notags(trim($_POST['albumname']));
|
||||||
if($newalbum != $album) {
|
if($newalbum != $album) {
|
||||||
q("UPDATE `photo` SET `album` = '%s' WHERE `album` = '%s' AND `uid` = %d",
|
q("UPDATE `photo` SET `album` = '%s' WHERE `album` = '%s' AND `uid` = %d",
|
||||||
|
@ -212,6 +217,9 @@ function photos_post(&$a) {
|
||||||
return; // NOTREACHED
|
return; // NOTREACHED
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DELETE photo album and all its photos
|
||||||
|
*/
|
||||||
|
|
||||||
if($_POST['dropalbum'] == t('Delete Album')) {
|
if($_POST['dropalbum'] == t('Delete Album')) {
|
||||||
|
|
||||||
|
@ -540,7 +548,7 @@ function photos_post(&$a) {
|
||||||
if(count($links)) {
|
if(count($links)) {
|
||||||
foreach($links as $link) {
|
foreach($links as $link) {
|
||||||
if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page')
|
if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page')
|
||||||
$profile = $link['@attributes']['href'];
|
$profile = $link['@attributes']['href'];
|
||||||
if($link['@attributes']['rel'] === 'salmon') {
|
if($link['@attributes']['rel'] === 'salmon') {
|
||||||
$salmon = '$url:' . str_replace(',','%sc',$link['@attributes']['href']);
|
$salmon = '$url:' . str_replace(',','%sc',$link['@attributes']['href']);
|
||||||
if(strlen($inform))
|
if(strlen($inform))
|
||||||
|
@ -839,7 +847,7 @@ function photos_post(&$a) {
|
||||||
killme();
|
killme();
|
||||||
}
|
}
|
||||||
|
|
||||||
$ph->orient($src);
|
$exif = $ph->orient($src);
|
||||||
@unlink($src);
|
@unlink($src);
|
||||||
|
|
||||||
$max_length = get_config('system','max_image_length');
|
$max_length = get_config('system','max_image_length');
|
||||||
|
@ -880,8 +888,20 @@ function photos_post(&$a) {
|
||||||
|
|
||||||
// Create item container
|
// Create item container
|
||||||
|
|
||||||
|
$lat = $lon = null;
|
||||||
|
|
||||||
|
if($exif && $exif['GPS']) {
|
||||||
|
if(feature_enabled($channel_id,'photo_location')) {
|
||||||
|
$lat = getGps($exif['GPS']['GPSLatitude'], $exif['GPS']['GPSLatitudeRef']);
|
||||||
|
$lon = getGps($exif['GPS']['GPSLongitude'], $exif['GPS']['GPSLongitudeRef']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$arr = array();
|
$arr = array();
|
||||||
|
|
||||||
|
if($lat && $lon)
|
||||||
|
$arr['coord'] = $lat . ' ' . $lon;
|
||||||
|
|
||||||
$arr['uid'] = $page_owner_uid;
|
$arr['uid'] = $page_owner_uid;
|
||||||
$arr['uri'] = $uri;
|
$arr['uri'] = $uri;
|
||||||
$arr['parent-uri'] = $uri;
|
$arr['parent-uri'] = $uri;
|
||||||
|
@ -1068,10 +1088,9 @@ function photos_content(&$a) {
|
||||||
$is_owner = (local_user() && (local_user() == $owner_uid));
|
$is_owner = (local_user() && (local_user() == $owner_uid));
|
||||||
$o .= profile_tabs($a,$is_owner, $a->data['user']['nickname']);
|
$o .= profile_tabs($a,$is_owner, $a->data['user']['nickname']);
|
||||||
|
|
||||||
//
|
/**
|
||||||
// dispatch request
|
* Display upload form
|
||||||
//
|
*/
|
||||||
|
|
||||||
|
|
||||||
if($datatype === 'upload') {
|
if($datatype === 'upload') {
|
||||||
if(! ($can_post)) {
|
if(! ($can_post)) {
|
||||||
|
@ -1182,6 +1201,10 @@ function photos_content(&$a) {
|
||||||
return $o;
|
return $o;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Display a single photo album
|
||||||
|
*/
|
||||||
|
|
||||||
if($datatype === 'album') {
|
if($datatype === 'album') {
|
||||||
|
|
||||||
$album = hex2bin($datum);
|
$album = hex2bin($datum);
|
||||||
|
@ -1209,6 +1232,7 @@ function photos_content(&$a) {
|
||||||
intval($a->pager['itemspage'])
|
intval($a->pager['itemspage'])
|
||||||
);
|
);
|
||||||
|
|
||||||
|
//edit album name
|
||||||
if($cmd === 'edit') {
|
if($cmd === 'edit') {
|
||||||
if(($album !== t('Profile Photos')) && ($album !== 'Contact Photos') && ($album !== t('Contact Photos'))) {
|
if(($album !== t('Profile Photos')) && ($album !== 'Contact Photos') && ($album !== t('Contact Photos'))) {
|
||||||
if($can_post) {
|
if($can_post) {
|
||||||
|
@ -1296,11 +1320,12 @@ function photos_content(&$a) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display one photo
|
||||||
|
*/
|
||||||
|
|
||||||
if($datatype === 'image') {
|
if($datatype === 'image') {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//$o = '';
|
//$o = '';
|
||||||
// fetch image, item containing image, then comments
|
// fetch image, item containing image, then comments
|
||||||
|
|
||||||
|
@ -1424,6 +1449,9 @@ function photos_content(&$a) {
|
||||||
$linked_items = q("SELECT * FROM `item` WHERE `resource-id` = '%s' $sql_extra LIMIT 1",
|
$linked_items = q("SELECT * FROM `item` WHERE `resource-id` = '%s' $sql_extra LIMIT 1",
|
||||||
dbesc($datum)
|
dbesc($datum)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$map = null;
|
||||||
|
|
||||||
if(count($linked_items)) {
|
if(count($linked_items)) {
|
||||||
$link_item = $linked_items[0];
|
$link_item = $linked_items[0];
|
||||||
$r = q("SELECT COUNT(*) AS `total`
|
$r = q("SELECT COUNT(*) AS `total`
|
||||||
|
@ -1467,6 +1495,10 @@ function photos_content(&$a) {
|
||||||
);
|
);
|
||||||
update_thread($link_item['parent']);
|
update_thread($link_item['parent']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if($link_item['coord']) {
|
||||||
|
$map = generate_map($link_item['coord']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$tags=Null;
|
$tags=Null;
|
||||||
|
@ -1759,6 +1791,8 @@ function photos_content(&$a) {
|
||||||
'$desc' => $ph[0]['desc'],
|
'$desc' => $ph[0]['desc'],
|
||||||
'$tags' => $tags_e,
|
'$tags' => $tags_e,
|
||||||
'$edit' => $edit,
|
'$edit' => $edit,
|
||||||
|
'$map' => $map,
|
||||||
|
'$map_text' => t('Map'),
|
||||||
'$likebuttons' => $likebuttons,
|
'$likebuttons' => $likebuttons,
|
||||||
'$like' => $like_e,
|
'$like' => $like_e,
|
||||||
'$dislike' => $dikslike_e,
|
'$dislike' => $dikslike_e,
|
||||||
|
|
Loading…
Reference in a new issue