照片也能实现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 ,可以在线将度分秒格式转换成经纬度。
手动定位坐标
打开拾取坐标系统,输入上一步得到的经纬度,就可以查看到具体地址

git地址
项目会上传至git,有兴趣的小伙伴可以拉下来试试,地址为:github.com/zsh57753173…
最后
最后澄清一下,二狗至今单身,哪有什么坏心思,又怎么会有女朋友,本故事纯属虚构,如有雷同,emmm.....再见。
点关注,防走丢
作者:JavaGieGie
链接:https://juejin.cn/post/6985097334984015886
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
