如何读取照片的GPS信息?—最好的语言Java实现起来就这么简单【手把手教程+完整代码】

如何读取照片的GPS信息?—最好的语言Java实现起来就这么简单【手把手教程+完整代码】通过一张照片来进行GPS定位,java实现起来就这么简单

大家好,又见面了,我是你们的朋友全栈君。

大家好,我是Lex 喜欢欺负超人那个Lex

上次,我们用Python读取照片的GPS信息,可以获取拍摄时间、手机型号等信息,还可以对

拍摄地点进行精确定位。Java表示不服~~~

今日重点:用Java读取照片的拍摄时间、GPS 以及手机型号等等信息

带你一步步实现功能,文末有完整源码哦【建议收藏】


事情是这样的

上次用python对照片进行GPS读取,如下 ↓ ↓ ↓

女友半夜加班发自拍 python男友用30行代码发现惊天秘密

【当然是选择原谅她啊】Python破解”通宵加班”女友的秘密


 今天决定,露出我的真面目

用世界上最好的语言—Java(可能会挨喷)

来实现一遍这个功能

如何读取照片的GPS信息?—最好的语言Java实现起来就这么简单【手把手教程+完整代码】


功能大体介绍一下就是:

通过脚本分析照片,对照片的拍摄地点进行GPS读取

另外,还可以拿到拍摄时间、手机型号等等信息。

如何读取照片的GPS信息?—最好的语言Java实现起来就这么简单【手把手教程+完整代码】

先上效果

从微信某个群里随便找了一位美女发的照片

如何读取照片的GPS信息?—最好的语言Java实现起来就这么简单【手把手教程+完整代码】

Java对照片进行分析,效果如下

如何读取照片的GPS信息?—最好的语言Java实现起来就这么简单【手把手教程+完整代码】

获得结果如下:

{海拔=0 metres, 手机=Xiaomi, 纬度=24.41046111111111, 型号=MI MAX, 经度=103.41424722222223, 拍摄时间=2018:12:01 16:37:32, 
拍摄地点=中国  云南省 红河哈尼族彝族自治州 xx市 XXX路 XXX号 温泉XXXX}
经纬度:24.41046111111111,103.41424722222223
拍摄时间:2018:12:01 16:37:32
手机型号:Xiaomi MI MAX
拍摄地点:中国  云南省 红河哈尼族彝族自治州 弥勒市 XXX路 XXX号 温泉XXX酒店
{"status":0,"result":{"location":{"lng":103.42283328917563,"lat":24.413805252378915},
"formatted_address":"云南省红河哈尼族彝族自治州弥勒市XXX路","business":"","addressComponent":
{"country":"中国","country_code":0,"country_code_iso":"CHN","country_code_iso2":"CN",
"province":"云南省","city":"红河哈尼族彝族自治州","city_level":2,"district":"弥勒市","town":"","town_code":"","adcode":"532504","street":"温泉路","street_number":"","direction":"","distance":""},"cityCode":107}}

emmm,不好过多描述


Java实现方法

1、引入相关jar包

这里需要引入两个jar包,用于读取照片的exif信息,里面包含照片的完整信息。

资源下载,放在最后啦。

如何读取照片的GPS信息?—最好的语言Java实现起来就这么简单【手把手教程+完整代码】

2、读取Exif原始信息

首先利用jar包工具,

将照片里的Exif原始信息读取出来。

完整代码如下:

public static HashMap<String, Object> readPicInfo(String file_path) {
	HashMap<String, Object> map = new HashMap<String,Object>();
	Tag tag = null;
    File jpegFile = new File(file_path);
    Metadata metadata;
    try {
        metadata = JpegMetadataReader.readMetadata(jpegFile);
        Iterator<Directory> it = metadata.getDirectories().iterator();
        while (it.hasNext()) {
            Directory exif = it.next();
            Iterator<Tag> tags = exif.getTags().iterator();
            while (tags.hasNext()) {
                tag = (Tag) tags.next();
                System.out.println(tag.getTagName()+"--"+tag.getDescription());
            }
        }
    } catch (JpegProcessingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
	return map;
}
public static void main(String[] args) {
        //传入照片的绝对路径
	readPicInfo("C:\\Users\\pacer\\Desktop\\img\\others\\10.jpg");
}

我们来看一下,能获得那些信息:

拍摄的手机型号、GPS精确位置、拍摄时间、像素、修改日期

甚至包括,拍摄地点的海拔信息都是有的。

如何读取照片的GPS信息?—最好的语言Java实现起来就这么简单【手把手教程+完整代码】

如何读取照片的GPS信息?—最好的语言Java实现起来就这么简单【手把手教程+完整代码】

3、GPS格式转换

我们通过exif读取的GPS信息,是类似于度、分、秒这种格式的。

我们需要将GPS信息通过计算转换成十进制的数字位数,

这样才可以调用百度地图API或者其他的地图API来将GPS信息转换为地理位置信息。

/***
 * 经纬度坐标格式转换
 * @param Gps
 */
public double latitude_and_longitude_convert_to_decimal_system(String Gps) {
	String a = Gps.split("°")[0].replace(" ", "");
	String b = Gps.split("°")[1].split("'")[0].replace(" ", "");
	String c = Gps.split("°")[1].split("'")[1].replace(" ", "").replace("\"", "");
	double gps_dou = Double.parseDouble(a)+Double.parseDouble(b)/60 + Double.parseDouble(c)/60/60;
	return gps_dou;
}

通过这个函数,我们将经纬度信息转换为10进制数字信息。

如何读取照片的GPS信息?—最好的语言Java实现起来就这么简单【手把手教程+完整代码】

4、调用地图API将GPS坐标转换为地理位置

我们通过exif原始信息,拿到的是一串地理坐标数字。

如果想要转换为具体的地址信息,那么就需要通过各大地图API来进行转换,

小伙伴们可以自己去免费注册一个百度地图API,然后通过调用它提供的接口,

就可以将传入的GPS坐标值,转换为地址信息。当然,这里也可以用我的。

调用接口方法如下:

//接口调用方法如下:
//api_key:是你注册的key值
//coords:是你的经纬度坐标

http://api.map.baidu.com/reverse_geocoding/v3/?ak="+api_key+"&output=json&coordtype=wgs84ll&location="+coords

5、完整代码

最后,将代码整理汇总一下。

做成了一个简单的java小项目

有java环境,即可运行~~

【项目完整代码+完整jar包】

下载地址:

完整项目下载地址【附带测试照片】

原下载地址

深藏功与名~~

如何读取照片的GPS信息?—最好的语言Java实现起来就这么简单【手把手教程+完整代码】


推荐阅读

【Java资源下载】

【python实战】

【pygame开发实战开发30例 完整源码】

【pygame游戏开发专栏,获取完整源码+教程】

CSDN官方学习推荐 ↓ ↓ ↓

为了帮助更多小白从零进阶 Java 工程师,从CSDN官方那边搞来了一套 《Java 工程师学习成长知识图谱》

尺寸 870mm x 560mm,知识汇总非常齐全,还可以折叠成一本书大小。

如何读取照片的GPS信息?—最好的语言Java实现起来就这么简单【手把手教程+完整代码】

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/130260.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 单例模式(Singleton)应用场景和优缺点

    单例模式(Singleton)应用场景和优缺点单例(Singleton)模式 也叫单态模式概述:单例(Singleton)模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点。这就提出了一个问题:如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例?客户程序在调用某一个类时,它是不会考虑这个类是否只能有一个实例等问题的,所以,这应该是类设计者的责任,而不是类使用者的责任。 从另一个角度来说,Singleton模式其实也是一…

  • 机器学习之数据分析

    熟话说,'巧妇难为无米之炊',数据和特征就是'米',模型和算法则是'巧妇',没有充足的数据、合适的特征,再强大的模型结构也无法得到满意的输出,为了更好的

    2021年12月30日
  • TCP和UDP的区别是什么_socket tcp udp区别

    TCP和UDP的区别是什么_socket tcp udp区别TCP/IP协议栈主要分为四层:应用层、传输层、网络层、数据链路层,每层都有相应的协议,如下图IP:网络层协议;(高速公路)TCP和UDP:传输层协议;(卡车)HTTP:应用层协议;(货物)。HTTP(超文本传输协议)是利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议。客户端使用Web浏览器发起HTTP请求给Web服务器,Web服务器发送被请求的信息给客户端。SOCKET:套

  • Js数组求和_数组求和

    Js数组求和_数组求和$.fn.sum=function(fun){varv=0;if($(this).length>0){$(this).each(function(index,item){if(fun!=null&&fun!=undefined&&typeof

  • 级联下拉菜单的实现「建议收藏」

    级联下拉菜单的实现「建议收藏」级联下拉菜单的实现

  • java多线程编程实例

    java多线程编程实例        这篇文章主要介绍了java多线程编程实例,分享了几则多线程的实例代码,具有一定参考价值,加深多线程编程的理解还是很有帮助的,需要的朋友可以参考下。1.相关知识:Java多线程程序设计到的知识:(1)对同一个数量进行操作(2)对同一个对象进行操作(3)回调方法使用(4)线程同步,死锁问题(5)线程通信等等2.示例2.1三个售票窗口同时出售20张票程序分析:    (1)票数要使用同一…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号