使用Java和高德地图API将经纬度转换为地理位置信息的步骤
前言
在开发涉及地图和位置服务的应用时,将GPS设备提供的经纬度坐标转换成人类可读的地理位置是一个常见需求。本文将详细介绍如何使用Java语言和高德地图API实现这一功能,包括环境准备、代码实现、异常处理以及代码优化。
开发环境准备
- Java环境:确保你的开发环境中已安装Java。
- 高德地图API密钥:访问高德地图开放平台,注册并申请API密钥。
步骤一:创建Java类
首先,创建一个名为LocationFinder
的Java类。这个类包含一个主方法main
用于调用位置转换功能,并且包含getLocationFromCoordinates
方法用于实现经纬度到地理位置的转换。
public class LocationFinder { public static void main(String[] args) { String longitude = "115.658755"; // 经度 String latitude = "38.961134"; // 纬度 String apiKey = "您的API密钥"; // 高德地图API密钥 try { String location = getLocationFromCoordinates(longitude, latitude, apiKey); System.out.println("地理位置: " + location); } catch (Exception e) { e.printStackTrace(); System.out.println("地理位置解析失败"); } } }
步骤二:实现位置转换功能
getLocationFromCoordinates
方法中使用了高德地图的逆地理编码API。该方法通过构建带有API密钥和位置参数的URL,向高德服务器发起HTTP GET请求。接收到的响应是JSON格式的数据,我们使用Gson库来解析这些数据以提取省市区信息。
import com.google.gson.Gson; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public static String getLocationFromCoordinates(String longitude, String latitude, String apiKey) { String url = "https://restapi.amap.com/v3/geocode/regeo?key=" + apiKey + "&location=" + longitude + "," + latitude; HttpURLConnection connection = null; BufferedReader reader = null; try { connection = (HttpURLConnection) new URL(url).openConnection(); connection.setRequestMethod("GET"); reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } Gson gson = new Gson(); GaoDeDTO gaoDeDTO = gson.fromJson(response.toString(), GaoDeDTO.class); GaoDeDTO.RegeocodeDTO.AddressComponentDTO addressComponent = gaoDeDTO.getRegeocode().getAddressComponent(); String province = addressComponent.getProvince(); String cityStr = getStringFromObject(addressComponent.getCity()); String districtStr = getStringFromObject(addressComponent.getDistrict()); return province + cityStr + districtStr; } catch (Exception e) { return "境外地址,无法解析"; } finally { if (reader != null) { try { reader.close(); } catch (Exception e) { e.printStackTrace(); } } if (connection != null) { connection.disconnect(); } } } // 从对象中获取字符串 private static String getStringFromObject(Object obj) { if (obj instanceof String) { return " " + (String) obj; } else if (obj instanceof List) { List<String> list = (List<String>) obj; if (!list.isEmpty()) { return " " + list.get(0); } } return ""; }
/** * @author lxy * @date 2024/5/13 */ @NoArgsConstructor @Data public class GaoDeDTO { @JsonProperty("info") private String info; @JsonProperty("infocode") private String infocode; @JsonProperty("regeocode") private RegeocodeDTO regeocode; @JsonProperty("status") private String status; @NoArgsConstructor @Data public static class RegeocodeDTO { @JsonProperty("addressComponent") private AddressComponentDTO addressComponent; @JsonProperty("formatted_address") private String formattedAddress; @NoArgsConstructor @Data public static class AddressComponentDTO { @JsonProperty("adcode") private String adcode; @JsonProperty("city") private Object city; @JsonProperty("citycode") private String citycode; @JsonProperty("country") private String country; @JsonProperty("district") private Object district; @JsonProperty("province") private String province; @JsonProperty("towncode") private String towncode; @JsonProperty("township") private String township; } } }
步骤三:异常处理
我们通过异常处理来确保程序的健壮性,捕获并处理可能出现的异常。在网络请求或JSON解析出现问题时,程序会输出“境外地址,无法解析”。
主要的代码调整和优化
- 代码重构:将API密钥作为方法参数传入,增加了代码的灵活性。
- 使用Gson进行JSON解析:替换原有的手动解析方法,使用Gson库自动映射JSON到Java对象,简化了代码并提高了可维护性。
- 增强异常处理:对网络请求和JSON解析的异常处理进行了增强,确保程序在出错时可以正确关闭资源并给出清晰的错误信息。
测试运行
运行main
方法,输出应显示指定坐标的省市区信息,例如:“河北省保定市清苑区”。
结语
通过以上步骤,你可以轻松地在任何Java应用中实现经纬度到地理位置的转换。这对于开发地理信息系统(GIS)、位置服务或任何需要地理编码的应用都非常有用。希望这篇教程能帮助你在项目中实现位置转换功能。
附:java利用高德地图解析经纬度字符串所在的城市
public class LocationUtil { /** * 通过地址位置信息,解析城市信息 * @param location 地理信息,格式 经度,纬度 * 114.05,22.55 * @return */ public static String parseLocation(String location){ // https://lbs.amap.com/api/webservice/guide/api/georegeo 逆地址解析 // amap_api 注册高德地图开发者,创建应用,获取apikey //测试key:8f21643950153e066e4bfefc3d244e19 String amap_api_key = "这里需要填写高德地图apiKey"; String url = "https://restapi.amap.com/v3/geocode/regeo?key="+amap_api_key+"&"+"location="+location; String jsonData = HttpUtil.httpGet(url); JSONObject jsonLocation = JSON.parseObject(jsonData); String city = ""; if("1".equals(jsonLocation.getString("status"))){ JSONObject addressComponent =jsonLocation.getJSONObject("regeocode").getJSONObject("addressComponent"); Object obj = null; // 如果是非直辖市,city返回数据 if((obj = addressComponent.get("city")) instanceof String){ city= (String)obj; }else if ((obj = addressComponent.get("province")) instanceof String){ // 如果是直辖市,通过province返回数据 city= (String)obj; } city = city.replace("市",""); } return city; } }
到此这篇关于使用Java和高德地图API将经纬度转换为地理位置信息的文章就介绍到这了,更多相关Java经纬度转换为地理位置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
三分钟读懂mybatis中resultMap和resultType区别
这篇文章主要给大家介绍了mybatis中resultMap和resultType区别的相关资料,resultType和resultMap都是mybatis进行数据库连接操作处理返回结果的,需要的朋友可以参考下2023-07-07springboot中spring.profiles.include的妙用分享
这篇文章主要介绍了springboot中spring.profiles.include的妙用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-08-08
最新评论