exif_read_data()函数的作用是从 JPEG 或 TIFF 图像文件中读取 EXIF 头信息
PHP 7.2.10 版本 华为手机获取不到GPS,降版本到 7.1.28 或者 7.1.13 这俩版本亲测没问题
class ImgHelper
{
/**
* 获取图片信息
* @param $img_url
* @param $gaode_key
* @return array|bool
*/
public function get_img_info($img_url,$baidu_key,$type){
$data = array(
'img_time' => '',//图片拍摄时间
'latitude' => '',//纬度
'longitude' => '',//经度
'country' => '',
'address' => '',//详细地址
'province' => '',//省份
'city' => '',//城市
'district' => '',//区
'street' => '',//街道
);
if($type){
$arr = explode('/',$type);
if(!in_array(strtolower($arr[1]),['jpeg','tiff'])){
return $data;
}
}
$exif = @exif_read_data($img_url,0,true);
if ($exif === false) {
return $data;
} else {
$latitude = isset($exif['GPS']['GPSLatitude'])?$exif['GPS']['GPSLatitude']:[]; //纬度
$longitude = isset($exif['GPS']['GPSLongitude'])?$exif['GPS']['GPSLongitude']:[]; //经度
$GPSLatitudeRef = isset($exif['GPS']['GPSLatitudeRef'])?$exif['GPS']['GPSLatitudeRef']:''; //南半球 S 北半球 N
$GPSLongitudeRef = isset($exif['GPS']['GPSLongitudeRef'])?$exif['GPS']['GPSLongitudeRef']:''; //东半球 S 西半球 N
//计算经纬度信息
$latitude = self::get_gps($latitude, $GPSLatitudeRef);
$longitude = self::get_gps($longitude, $GPSLongitudeRef);
/**使用百度地图提供逆向地理编码接口获取定位信息;
* 需在百度申请key
* 百度接口地址:http://api./geocoder/v2/
*/
$url = "http://api./geocoder/v2/?location=$latitude,$longitude&output=json&ak=$baidu_key";
$res = file_get_contents($url);
$res = json_decode($res, true);
// var_dump($res);die;
if ($res['status'] == 0) {
$address = $res['result']['formatted_address'];
$country = $res['result']['addressComponent']['country'];
$province = $res['result']['addressComponent']['province'];
$district = $res['result']['addressComponent']['district'];
$street = $res['result']['addressComponent']['street'];
$city = $res['result']['addressComponent']['city'];
}
//图片拍摄时间
$time = isset($exif['IFD0']['DateTime'])?$exif['IFD0']['DateTime']:'';
$data = array(
'img_time' => $time,//图片拍摄时间
'latitude' => $latitude,//纬度
'longitude' => $longitude,//经度
'country' => $country,
'address' => $address,//详细地址
'province' => $province,//省份
'city' => $city,//城市
'district' => $district,//区
'street' => $street,//街道
);
return $data;
}
}
//计算经纬度
public function get_gps($exifCoord,$banqiu)
{
$degrees= count($exifCoord) > 0 ? self::gps2Num($exifCoord[0]) : 0;
$minutes= count($exifCoord) > 1 ? self::gps2Num($exifCoord[1]) : 0;
$seconds= count($exifCoord) > 2 ? self::gps2Num($exifCoord[2]) : 0;
$minutes+= 60 * ($degrees- floor($degrees));
$degrees= floor($degrees);
$seconds+= 60 * ($minutes- floor($minutes));
$minutes= floor($minutes);
if($seconds>= 60)
{
$minutes+= floor($seconds/60.0);
$seconds-= 60*floor($seconds/60.0);
}
if($minutes>= 60)
{
$degrees+= floor($minutes/60.0);
$minutes-= 60*floor($minutes/60.0);
}
$lng_lat = $degrees + $minutes/60 + $seconds/60/60;
if(strtoupper($banqiu) == 'W' || strtoupper($banqiu) == 'S'){
//如果是南半球 或者 西半球 乘以-1
$lng_lat = $lng_lat * -1;
}
return $lng_lat;
//return array('degrees'=> $degrees, 'minutes'=> $minutes, 'seconds'=> $seconds);
}
/*
取得EXIF的內容
分数 转 小数
*/
public 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]);
}
}
如果觉得《php exif gps php exif_read_data() 获取GPS》对你有帮助,请点赞、收藏,并留下你的观点哦!