如何通过JAVA获取照片的位置信息,一招教你实现(快去找你的男/女朋友试一试,看看他有没有背着你干坏事)

先看最终结果

经度:120.21555555555555   纬度:30.209166666666665
手机型号:HUAWEI  YAL-AL10
拍摄时间:2021:12:22 09:50:05
拍摄地址:浙江省杭州市滨江区江晖路1552号  风雅钱塘内,碧塔海足道(滨江店)东北481米

一、我们需要有一张图片(必须是原图),我这里随手拍了一张

二、新建SpringBoot项目(这里就不展示了)

三、导入相关依赖

        
        <!-- 图片信息解析 -->
        <dependency>
            <groupId>com.drewnoakes</groupId>
            <artifactId>metadata-extractor</artifactId>
            <version>2.7.2</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.72</version>
        </dependency>

四、读取照片原始信息

    public static void main(String[] args) {
        File file = new File("C:/Users/asus/Desktop/1.jpg");
        JSONObject jsonObject = getPosition(file);
        for (String s : jsonObject.keySet()) {
            System.out.println(s+"=> "+jsonObject.get(s));
        }
    }
    private static JSONObject getPosition(File file) {
        JSONObject jsonObject = new JSONObject();
        Metadata metadata = null;
        try {
            metadata = JpegMetadataReader.readMetadata(file);
            for (Directory directory : metadata.getDirectories()) {
                for (Tag tag : directory.getTags()) {
                    jsonObject.put(tag.getTagName(),tag.getDescription());
                }
            }
        } catch (JpegProcessingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return jsonObject;
    }

执行结果如下:

//解析结果中有很多信息,这里我们只取有用的展示:

//拍摄时间
Date/Time Digitized==> 2021:12:22 09:50:05
//GPS信息
GPS Latitude==> 30° 12' 33"
GPS Altitude==> 0 metres
GPS Latitude Ref==> N
GPS Altitude Ref==> Below sea level
GPS Processing Method==> GPS
GPS Version ID==> 2.200
GPS Longitude Ref==> E
GPS Time-Stamp==> 1:50:3 UTC
GPS Longitude==> 120° 12' 56"
GPS Date Stamp==> 2021-12-22
//手机厂家和型号
Make==> HUAWEI
Model==> YAL-AL10

 五、通过百度地图API(或高德地图)定位

    public static void main(String[] args) {
        File file = new File("C:/Users/asus/Desktop/1.jpg");
        JSONObject jsonObject = getPosition(file);
        Map map = getAddress(jsonObject);

        String gps_longitude = jsonObject.getString("GPS Longitude");//经度
        String gps_latitude = jsonObject.getString("GPS Latitude");//纬度
        double longitude = transformPosition(gps_longitude);
        double latitude = transformPosition(gps_latitude);
        System.out.println("经度:"+longitude+"   纬度:"+latitude);
        System.out.println("手机型号:"+jsonObject.getString("Make")+"  "+jsonObject.getString("Model"));
        System.out.println("拍摄时间:"+jsonObject.getString("Date/Time"));
        System.out.println("拍摄地址:"+map.get("formatted_address")+" "+map.get("sematic_description"));
    }

    /**
     * 经纬度转换
     * @param s
     * @return
     */
    private static double transformPosition(String s) {
        String a = s.split("°")[0].replace(" ", "");
        String b = s.split("°")[1].split("'")[0].replace(" ", "");
        String c = s.split("°")[1].split("'")[1].replace(" ", "").replace("\"", "");
        double gps_dou = Double.parseDouble(a)+Double.parseDouble(b)/60 + Double.parseDouble(c)/60/60;
        return gps_dou;
    }
    /**
     *  经纬度定位结果(百度地图)
     * @param log
     * @param lat
     * @return
     */
    private static Map getAddress(JSONObject json) {
        String log = String.valueOf(transformPosition(json.getString("GPS Longitude")));//经度
        String lat = String.valueOf(transformPosition(json.getString("GPS Latitude")));//纬度
        String ak="你的百度应用AK";
        String urlString =
                "http://api.map.baidu.com/reverse_geocoding/v3/?ak=" +ak+
                        "&output=json&coordtype=bd09ll&extensions_road&extensions_poi=1&radius=500&location="+lat+","+log;
        Map map = new LinkedHashMap();
        try {
            URL url = new URL(urlString);
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();

            if (conn!=null) {
                InputStreamReader inputStreamReader = new InputStreamReader(conn.getInputStream(), "UTF-8");
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                String data = null;
                if ((data = bufferedReader.readLine()) != null) {
                    JSONObject jsonObject = JSON.parseObject(data);
                    Object result = jsonObject.get("result");
                    map = JSONObject.parseObject(JSONObject.toJSONString(result), Map.class);
                }
                inputStreamReader.close();
            }
        } catch (Exception e) {
            System.out.println("error in wapaction,and e is " + e.getMessage());
        }
        return map;
    }

六、附百度地图操作流程

 最后点击提交即可完成应用创建。

七、总结

        1:解析的图片必须为原图。

        2:手机和百度地图的定位均有误差,不必较真。

        3:百度地图接口功能、入参、出参等信息可从 百度地图开放平台-->开发文档-->服务接口-->Web服务API 中查看,其中有实时路况、天气查询等诸多功能。

      感谢大家观看,动动大家发财的小手点个赞吧。

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值