照片也能实现GPS定位?以后还是不要轻易发图了...

Posted king哥Java架构

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了照片也能实现GPS定位?以后还是不要轻易发图了...相关的知识,希望对你有一定的参考价值。

前言

最近工作中遇到处理图片的一些场景,主要是批量提取图片中一些图像宽高、分辨率以及物理焦距等信息。然后在使用过程中也是看到图片中包含了很多其他有用的信息,本文就和大家一起分享这个小技巧吧。

代码过程

下面我就来拆分几个步骤,来看一下代码实现。

  • 分析图片

首先,引入一个jar包

 <dependency>
     <groupId>com.drewnoakes</groupId>
     <artifactId>metadata-extractor</artifactId>
     <version>2.16.0</version>
 </dependency> 

然后写一个方法,获取图片中的详细信息,包括拍摄时间位置信息手机型号等。

//分析图片获取地址
public static  Map<String,String> PicAnalysis(String path) throws JpegProcessingException, 		IOException {
    Map<String,String> map = new HashMap();
    System.out.println("强大的语言正在识别图片地址...");
    File picFile = new File(path);
    Metadata metadata = JpegMetadataReader.readMetadata(picFile);
    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();
            map.put(tag.getTagName(),tag.getDescription());
            System.out.println(tag.getTagName() + ":" +tag.getDescription());
        }
    }
    System.out.println("图片分析完毕!");
    return map;
} 

该方法会返回如下信息,相当多,这里整理成表格:

参数说明
Make产品生产厂家
Model设备型号
Orientation方向
X Resolution/Y ResolutionX/Y方向分辨率
ResolutionUnit分辨率单位
DateTime日期和时间
Software软件版本
ISO speed ratings感光度
Date/Time Original创建时间
Date/Time Digitized数字化时间
Components Configuration图像构造(多指色彩组合方案)
Compressed Bits Per Pixel压缩时每像素色彩位 指压缩程度
Exposure Bias Value曝光补偿
Max Aperture Value最大光圈
Metering Mode测光方式, 平均式测光、中央重点测光、点测光等
Flash是否使用闪光灯
Focal Length焦距,一般显示镜头物理焦距
Makernote作者标记、说明、记录
Color Space色域、色彩空间
Exif Image Width图像宽度,指横向像素数
Exif Image Height图像高度,指纵向像素数
  • 转换成坐标

从图片中拿出的信息为度分秒格式:即30° 14' 32.52",我们需要将其转换为经纬度:如121.485559,31.240778,代码如下:

public static String translate(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 = Double.parseDouble(a)+Double.parseDouble(b)/60 + Double.parseDouble(c)/60/60;
    return String.valueOf(gps);
} 
  • 揭开最终面纱

获取到具体坐标后,这距离成功只有半步之遥,接下来调用高德地图的Api来获取具体地址。

 public static void getAddress( Map<String,String> param){
        String str = RequestUtils.sendGet("https://restapi.amap.com/v3/geocode/regeo", "key=5a3c45fd68d04bbc&location="+translate(param.get("GPS Longitude"))+","+translate(param.get("GPS Latitude")));
        JSONObject result = JSON.parseObject(str);
        System.out.println("拍摄时间:" +param.get("Date/Time"));
        System.out.println("拍摄地点:" +result.getJSONObject("regeocode").getString("formatted_address"));
        System.out.println("手机型号:" +param.get("Make") +" " + param.get("Model"));
        System.out.println(str);
    } 

不过我们首先要进入高德地图开发者平台,没有申请个人开发者身份的需要先进行申请,申请步骤比较简单,申请后每天会有指定数量的免费调用次数,足够个人使用。

懒人的玩法

如果觉得太麻烦,不想申请开发者,哎,就是玩,就是不想申请,那花Gie也有手动版做法。

  • 手动转换经纬度

打开网址 www.minigps.net/fc.html ,可以在线将度分秒格式转换成经纬度。

  • 手动定位坐标

打开拾取坐标系统,输入上一步得到的经纬度,就可以查看到具体地址

image.png

最后

一直想整理出一份完美的面试宝典,但是时间上一直腾不开,这套一千多道面试题宝典,结合今年金三银四各种大厂面试题,以及 GitHub 上 star 数超 30K+ 的文档整理出来的,我上传以后,毫无意外的短短半个小时点赞量就达到了 13k,说实话还是有点不可思议的。

一千道互联网 Java 工程师面试题

内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、mysql、Spring、SpringBoot、SpringCloud、RabbitMQ、Kafka、Linux等技术栈(485页)

初级—中级—高级三个级别的大厂面试真题

阿里云——Java 实习生/初级

List 和 Set 的区别 HashSet 是如何保证不重复的

HashMap 是线程安全的吗,为什么不是线程安全的(最好画图说明多线程环境下不安全)?

HashMap 的扩容过程

HashMap 1.7 与 1.8 的 区别,说明 1.8 做了哪些优化,如何优化的?

对象的四种引用

Java 获取反射的三种方法

Java 反射机制

Arrays.sort 和 Collections.sort 实现原理 和区别

Cloneable 接口实现原理

异常分类以及处理机制

wait 和 sleep 的区别

数组在内存中如何分配

答案展示:

美团——Java 中级

BeanFactory 和 ApplicationContext 有什么区别

Spring Bean 的生命周期

Spring IOC 如何实现

说说 Spring AOP

Spring AOP 实现原理

动态代理(cglib 与 JDK)

Spring 事务实现方式

Spring 事务底层原理

如何自定义注解实现功能

Spring MVC 运行流程

Spring MVC 启动流程

Spring 的单例实现原理

Spring 框架中用到了哪些设计模式

为什么选择 Netty

说说业务中,Netty 的使用场景

原生的 NIO 在 JDK 1.7 版本存在 epoll bug

什么是 TCP 粘包/拆包

TCP 粘包/拆包的解决办法

Netty 线程模型

说说 Netty 的零拷贝

Netty 内部执行流程

答案展示:

蚂蚁金服——Java 高级

题 1:

  1. jdk1.7 到 jdk1.8 Map 发生了什么变化(底层)?

  2. ConcurrentHashMap

  3. 并行跟并发有什么区别?

  4. jdk1.7 到 jdk1.8 java 虚拟机发生了什么变化?

  5. 如果叫你自己设计一个中间件,你会如何设计?

  6. 什么是中间件?

  7. ThreadLock 用过没有,说说它的作用?

  8. Hashcode()和 equals()和==区别?

  9. mysql 数据库中,什么情况下设置了索引但无法使用?

  10. mysql 优化会不会,mycat 分库,垂直分库,水平分库?

  11. 分布式事务解决方案?

  12. sql 语句优化会不会,说出你知道的?

  13. mysql 的存储引擎了解过没有?

  14. 红黑树原理?

题 2:

  1. 说说三种分布式锁?

  2. redis 的实现原理?

  3. redis 数据结构,使⽤场景?

  4. redis 集群有哪⼏种?

  5. codis 原理?

  6. 是否熟悉⾦融业务?记账业务?蚂蚁⾦服对这部分有要求。

好啦~展示完毕,大概估摸一下自己是青铜还是王者呢?

前段时间,在和群友聊天时,把今年他们见到的一些不同类别的面试题整理了一番,于是有了以下面试题集,也一起分享给大家~

如果你觉得这些内容对你有帮助,可以加入csdn进阶交流群,领取资料

基础篇


JVM 篇


MySQL 篇



Redis 篇




由于篇幅限制,详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

需要的小伙伴,可以一键三连,下方获取免费领取方式!
在这里插入图片描述

以上是关于照片也能实现GPS定位?以后还是不要轻易发图了...的主要内容,如果未能解决你的问题,请参考以下文章

如何用一张照片进行GPS定位?—最好的语言Java实现起来就这么简单!手把手教程+完整代码

这款PDF阅读器1秒定位论文公式变量,不同页图文也能同屏看,刷论文再也不用来回翻页看文找图了! | 开源...

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

华为使用h5上传图片没有gps信息

手机定位开启了,怎么还是定位失败

手机/电脑的定位方式