很简单,直接上代码
注意:通过微信发送的图片是获取不到GPS信息,我自己是通过usb上传测试的(打成压缩包传也可以)
引用依赖
<dependency>
<groupId>com.drewnoakes</groupId>
<artifactId>metadata-extractor</artifactId>
<version>2.17.0</version>
</dependency>
获取图片的全部信息
public void fileGpsText2(){
System.out.println("开始读取图片信息...");
File jpegFile = new File("C:\\Users\\hp\\Desktop\\IMG_20220630_102607.jpg");
Metadata metadata;
try {
metadata = JpegMetadataReader.readMetadata(jpegFile);
Iterator<Directory> it = metadata.getDirectories().iterator();
while (it.hasNext()) {
Directory exif = it.next();
Iterator<Tag> tags = exif.getTags().iterator();
while (tags.hasNext()) {
Tag tag = (Tag) tags.next();
System.out.println(tag);
}
}
System.out.println("图片信息读取完成!");
} catch (JpegProcessingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
得到的结果
获取图片的经纬度,手机型号,拍摄时间,拍摄地址
@Test
public void fileGpstext3(){
File file = new File("C:\\Users\\hp\\Desktop\\IMG_20220630_102607.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"));
}
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;
}
/**
* 经纬度转换
* @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
* @param
* @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=wgs84ll&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;
}
得到的结果
需要注意一点,根据经纬度去获取地址,需要输入自己的百度应用ak
如果没有根据这个地址去注册
最后在创建应用时需要勾选“地理编码”,不然会报错 {“status”:240,“message”:“APP 服务被禁用”}
最后补充一点,获取到的拍摄地址是通过经纬度去进行定位的,需要联网,如果没有网的话是获取不到位置的,会是null