照片也能实现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 Resolution | X/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 ,可以在线将度分秒格式转换成经纬度。
- 手动定位坐标
打开拾取坐标系统,输入上一步得到的经纬度,就可以查看到具体地址
最后
一直想整理出一份完美的面试宝典,但是时间上一直腾不开,这套一千多道面试题宝典,结合今年金三银四各种大厂面试题,以及 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:
jdk1.7 到 jdk1.8 Map 发生了什么变化(底层)?
ConcurrentHashMap
并行跟并发有什么区别?
jdk1.7 到 jdk1.8 java 虚拟机发生了什么变化?
如果叫你自己设计一个中间件,你会如何设计?
什么是中间件?
ThreadLock 用过没有,说说它的作用?
Hashcode()和 equals()和==区别?
mysql 数据库中,什么情况下设置了索引但无法使用?
mysql 优化会不会,mycat 分库,垂直分库,水平分库?
分布式事务解决方案?
sql 语句优化会不会,说出你知道的?
mysql 的存储引擎了解过没有?
红黑树原理?
题 2:
说说三种分布式锁?
redis 的实现原理?
redis 数据结构,使⽤场景?
redis 集群有哪⼏种?
codis 原理?
是否熟悉⾦融业务?记账业务?蚂蚁⾦服对这部分有要求。
好啦~展示完毕,大概估摸一下自己是青铜还是王者呢?
前段时间,在和群友聊天时,把今年他们见到的一些不同类别的面试题整理了一番,于是有了以下面试题集,也一起分享给大家~
如果你觉得这些内容对你有帮助,可以加入csdn进阶交流群,领取资料
基础篇
JVM 篇
MySQL 篇
Redis 篇
由于篇幅限制,详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
需要的小伙伴,可以一键三连,下方获取免费领取方式!
以上是关于照片也能实现GPS定位?以后还是不要轻易发图了...的主要内容,如果未能解决你的问题,请参考以下文章
如何用一张照片进行GPS定位?—最好的语言Java实现起来就这么简单!手把手教程+完整代码
这款PDF阅读器1秒定位论文公式变量,不同页图文也能同屏看,刷论文再也不用来回翻页看文找图了! | 开源...