先看最终结果
经度: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 中查看,其中有实时路况、天气查询等诸多功能。