Java获取图片的拍摄地理位置

准备
1,在手机的相机里面设置打开位置信息,然后拍摄一张图片备用。
2,将手机拍摄的图片上传到电脑上面,需要注意的是微信,QQ接收的话需要先压缩图片然后在发送(防止图片信息发生变化)。
3,创建springboot项目,jdk8,idea,电脑联网状态(这里解析经纬度是通过百度的api)。
直接上代码
依赖引入

<dependency>
    <groupId>com.drewnoakes</groupId>
    <artifactId>metadata-extractor</artifactId>
    <version>2.16.0</version>
</dependency>
<dependency>
   <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.53</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.10</version>
    <scope>provided</scope>
</dependency>

GpsUtile工具类
经纬度格式化

/**
 * @author lipeng
 * @date 2021/11/4 10:56
 */
public class GpsUtil {
    /**
     * 经纬度格式  转换为  度分秒格式
     *
     * @param point 坐标点
     * @return duStr
     */
    public static String pointToLatlong(String point) {
        Double du = Double.parseDouble(point.substring(0, point.indexOf("°")).trim());
        Double fen = Double.parseDouble(point.substring(point.indexOf("°") + 1, point.indexOf("'")).trim());
        Double miao = Double.parseDouble(point.substring(point.indexOf("'") + 1, point.indexOf("\"")).trim());
        Double duStr = du + fen / 60 + miao / 60 / 60;
        return duStr.toString();
    }
    /***
     * 经纬度坐标格式转换(* °转十进制格式)
     * @param gps
     * @return gps_dou
     */
    public static double latLng2Decimal(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;
    }
}

ImgUtil类
文件详细信息读取
经纬度解析成详细地址

import com.alibaba.fastjson.JSONObject;
import com.drew.imaging.ImageMetadataReader;
import com.drew.imaging.ImageProcessingException;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.Tag;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
/**
 * @author lipeng
 * @date 2021/11/4 10:26
 */
public class ImgUtil {
    // 读取图片的全部信息
    public static void readImgAll(File file) throws ImageProcessingException, IOException {
        Metadata metadata = ImageMetadataReader.readMetadata(file);
        System.out.println("---打印全部详情---");
        for (Directory directory : metadata.getDirectories()) {
            for (Tag tag : directory.getTags()) {
                System.out.format("[%s] - %s = %s\n",
                        directory.getName(), tag.getTagName(), tag.getDescription());
            }
            if (directory.hasErrors()) {
                for (String error : directory.getErrors()) {
                    System.err.format("ERROR: %s", error);
                }
            }
        }
    }
    // 读取图片的常用信息,并将信息封装到集合里面
    public static Map readImgNormal(File file) throws ImageProcessingException, IOException {
        Metadata metadata = ImageMetadataReader.readMetadata(file);
        Map<String,String> map = new HashMap<>();
        for (Directory directory : metadata.getDirectories()) {
            for (Tag tag : directory.getTags()) {
                String tagName = tag.getTagName();  //标签名
                String desc = tag.getDescription(); //标签信息
                if (tagName.equals("Image Height")) {
                    map.put("imgHeigh" , desc);
                } else if (tagName.equals("Image Width")) {
                    map.put("imgWeith" , desc);
                } else if (tagName.equals("Date/Time Original")) {
                    map.put("time" , desc);
                } else if (tagName.equals("GPS Latitude")) {
                    map.put("lat" , GpsUtil.pointToLatlong(desc));
                } else if (tagName.equals("GPS Longitude")) {
                    map.put("log" , GpsUtil.pointToLatlong(desc));
                }
            }
        }
        return map;
    }
    /**
     * api_key:注册的百度api的key
     * coords:经纬度坐标
     * http://api.map.baidu.com/reverse_geocoding/v3/?ak="+api_key+"&output=json&coordtype=wgs84ll&location="+coords
     * <p>
     * 经纬度转地址信息
     *
     * @param lat  维度
     * @param log 精度
     * @return add 地址
     */
    public static Map parseAdd(String log, String lat) throws IOException {
        Map<String,String> adress = new HashMap<>();
        String apiKey = "YNxcSCAphFvuPD4LwcgWXwC3SEZZc7Ra";
        //lat 小  log  大
        //参数解释: 纬度,经度 type 001 (100代表道路,010代表POI,001代表门址,111可以同时显示前三项)
        String urlString = "http://api.map.baidu.com/reverse_geocoding/v3/?ak=" + apiKey + "&output=json&coordtype=wgs84ll&location=" + (lat + "," + log);
        String res = "";
        try {
            URL url = new URL(urlString);
            java.net.HttpURLConnection conn = (java.net.HttpURLConnection)url.openConnection();
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");
            java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(conn.getInputStream(),"UTF-8"));
            String line;
            while ((line = in.readLine()) != null) {
                res += line+"\n";
            }
            in.close();
        } catch (Exception e) {
            System.out.println("error in wapaction,and e is " + e.getMessage());
        }
        JSONObject object = JSONObject.parseObject(res);
        if (object.containsKey("result")) {
            JSONObject result = object.getJSONObject("result");
            if (result.containsKey("addressComponent")) {
                JSONObject addressObj = object.getJSONObject("result").getJSONObject("addressComponent");
                adress.put("country", (String) addressObj.get("country"));
                adress.put("province", (String) addressObj.get("province"));
                adress.put("city", (String) addressObj.get("city"));
                adress.put("district", (String) addressObj.get("district"));
                adress.put("street", (String) addressObj.get("street"));
            }
        }else {
            adress = null;
        }
        return adress;
    }
    // 将图片里面的经纬度通过百度地图的api解析成详细的地址
    public static Map parseAddByImg(File file) throws ImageProcessingException, IOException {
        Map map = readImgNormal(file);
        String lat = (String) map.get("lat");
        String log = (String) map.get("log");
        return parseAdd(log,lat);
    }
}

测试

import com.drew.imaging.ImageProcessingException;
import com.lp.img_gps.util.ImgUtil;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.Map;
/**
 * @author lipeng
 * @date 2021/11/4 10:53
 */
public class ImgTest {
    private File file = new File("C:\\Users\\TY\\Desktop\\daskImage\\临时\\test.jpg");
    @Test
    public void readImgAllTest() throws ImageProcessingException, IOException {
        ImgUtil.readImgAll(file);
    }
    @Test
    public void readImgNormalTest() throws ImageProcessingException, IOException {
        Map map = ImgUtil.readImgNormal(file);
        System.out.println(map);
    }
    @Test
    public void parseAdd() throws IOException {
        Map add = ImgUtil.parseAdd("116.3039", "39.97646");
        System.out.println(add);
    }
    @Test
    public void parseAddByImg() throws ImageProcessingException, IOException {
        Map add = ImgUtil.parseAddByImg(file);
        System.out.println(add);
    }
}
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值