设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间05 现在时间05 缓存数据 许嵩你要为了你那句:上得厅堂也下得厨房,就像我一直在找的姑娘,而努力的姑娘负责啊。

许嵩你要为了你那句:上得厅堂也下得厨房,就像我一直在找的姑娘,而努力的姑娘负责啊。 -- 雅俗共赏

查看: 675|回复: 2

使用Java和高德地图API将经纬度转换为地理位置信息的步骤

[复制链接]

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:22
  • 打卡月天数:0
  • 打卡总奖励:250
  • 最近打卡:2025-04-09 23:11:29
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
396
主题
364
精华
0
金钱
1425
积分
806
注册时间
2023-2-10
最后登录
2025-4-9

发表于 2024-9-27 18:11:52 | 显示全部楼层 |阅读模式
目录
  • 前言
  • 开发环境准备
  • 步骤一:创建Java类
  • 步骤二:实现位置转换功能
  • 步骤三:异常处理
    • 主要的代码调整和优化
    • 测试运行
  • 结语
    • 附:java利用高德地图解析经纬度字符串所在的城市

      前言

      在开发涉及地图和位置服务的应用时,将GPS设备提供的经纬度坐标转换成人类可读的地理位置是一个常见需求。本文将详细介绍如何使用Java语言和高德地图API实现这一功能,包括环境准备、代码实现、异常处理以及代码优化。

      开发环境准备

      • Java环境:确保你的开发环境中已安装Java。
      • 高德地图API密钥:访问高德地图开放平台,注册并申请API密钥。

      步骤一:创建Java类

      首先,创建一个名为

      1. LocationFinder
      复制代码
      的Java类。这个类包含一个主方法
      1. main
      复制代码
      用于调用位置转换功能,并且包含
      1. getLocationFromCoordinates
      复制代码
      方法用于实现经纬度到地理位置的转换。

      1. public class LocationFinder {
      2. public static void main(String[] args) {
      3. String longitude = "115.658755"; // 经度
      4. String latitude = "38.961134"; // 纬度
      5. String apiKey = "您的API密钥"; // 高德地图API密钥
      6. try {
      7. String location = getLocationFromCoordinates(longitude, latitude, apiKey);
      8. System.out.println("地理位置: " + location);
      9. } catch (Exception e) {
      10. e.printStackTrace();
      11. System.out.println("地理位置解析失败");
      12. }
      13. }
      14. }
      复制代码

      步骤二:实现位置转换功能

      1. getLocationFromCoordinates
      复制代码
      方法中使用了高德地图的逆地理编码API。该方法通过构建带有API密钥和位置参数的URL,向高德服务器发起HTTP GET请求。接收到的响应是JSON格式的数据,我们使用Gson库来解析这些数据以提取省市区信息。

      1. import com.google.gson.Gson;
      2. import java.io.BufferedReader;
      3. import java.io.InputStreamReader;
      4. import java.net.HttpURLConnection;
      5. import java.net.URL;
      6. public static String getLocationFromCoordinates(String longitude, String latitude, String apiKey) {
      7. String url = "https://restapi.amap.com/v3/geocode/regeo?key=" + apiKey + "&location=" + longitude + "," + latitude;
      8. HttpURLConnection connection = null;
      9. BufferedReader reader = null;
      10. try {
      11. connection = (HttpURLConnection) new URL(url).openConnection();
      12. connection.setRequestMethod("GET");
      13. reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
      14. StringBuilder response = new StringBuilder();
      15. String line;
      16. while ((line = reader.readLine()) != null) {
      17. response.append(line);
      18. }
      19. Gson gson = new Gson();
      20. GaoDeDTO gaoDeDTO = gson.fromJson(response.toString(), GaoDeDTO.class);
      21. GaoDeDTO.RegeocodeDTO.AddressComponentDTO addressComponent = gaoDeDTO.getRegeocode().getAddressComponent();
      22. String province = addressComponent.getProvince();
      23. String cityStr = getStringFromObject(addressComponent.getCity());
      24. String districtStr = getStringFromObject(addressComponent.getDistrict());
      25. return province + cityStr + districtStr;
      26. } catch (Exception e) {
      27. return "境外地址,无法解析";
      28. } finally {
      29. if (reader != null) {
      30. try {
      31. reader.close();
      32. } catch (Exception e) {
      33. e.printStackTrace();
      34. }
      35. }
      36. if (connection != null) {
      37. connection.disconnect();
      38. }
      39. }
      40. }
      41. // 从对象中获取字符串
      42. private static String getStringFromObject(Object obj) {
      43. if (obj instanceof String) {
      44. return " " + (String) obj;
      45. } else if (obj instanceof List) {
      46. List<String> list = (List<String>) obj;
      47. if (!list.isEmpty()) {
      48. return " " + list.get(0);
      49. }
      50. }
      51. return "";
      52. }
      复制代码
      1. /**
      2. * @author lxy
      3. * @date 2024/5/13
      4. */
      5. @NoArgsConstructor
      6. @Data
      7. public class GaoDeDTO {
      8. @JsonProperty("info")
      9. private String info;
      10. @JsonProperty("infocode")
      11. private String infocode;
      12. @JsonProperty("regeocode")
      13. private RegeocodeDTO regeocode;
      14. @JsonProperty("status")
      15. private String status;
      16. @NoArgsConstructor
      17. @Data
      18. public static class RegeocodeDTO {
      19. @JsonProperty("addressComponent")
      20. private AddressComponentDTO addressComponent;
      21. @JsonProperty("formatted_address")
      22. private String formattedAddress;
      23. @NoArgsConstructor
      24. @Data
      25. public static class AddressComponentDTO {
      26. @JsonProperty("adcode")
      27. private String adcode;
      28. @JsonProperty("city")
      29. private Object city;
      30. @JsonProperty("citycode")
      31. private String citycode;
      32. @JsonProperty("country")
      33. private String country;
      34. @JsonProperty("district")
      35. private Object district;
      36. @JsonProperty("province")
      37. private String province;
      38. @JsonProperty("towncode")
      39. private String towncode;
      40. @JsonProperty("township")
      41. private String township;
      42. }
      43. }
      44. }
      复制代码

      步骤三:异常处理

      我们通过异常处理来确保程序的健壮性,捕获并处理可能出现的异常。在网络请求或JSON解析出现问题时,程序会输出“境外地址,无法解析”。

      主要的代码调整和优化

      • 代码重构:将API密钥作为方法参数传入,增加了代码的灵活性。
      • 使用Gson进行JSON解析:替换原有的手动解析方法,使用Gson库自动映射JSON到Java对象,简化了代码并提高了可维护性。
      • 增强异常处理:对网络请求和JSON解析的异常处理进行了增强,确保程序在出错时可以正确关闭资源并给出清晰的错误信息。

      测试运行

      运行

      1. main
      复制代码
      方法,输出应显示指定坐标的省市区信息,例如:“河北省保定市清苑区”。

      结语

      通过以上步骤,你可以轻松地在任何Java应用中实现经纬度到地理位置的转换。这对于开发地理信息系统(GIS)、位置服务或任何需要地理编码的应用都非常有用。希望这篇教程能帮助你在项目中实现位置转换功能。

      附:java利用高德地图解析经纬度字符串所在的城市

      1. public class LocationUtil {
      2. /**
      3. * 通过地址位置信息,解析城市信息
      4. * @param location 地理信息,格式 经度,纬度
      5. * 114.05,22.55
      6. * @return
      7. */
      8. public static String parseLocation(String location){
      9. // https://lbs.amap.com/api/webservice/guide/api/georegeo 逆地址解析
      10. // amap_api 注册高德地图开发者,创建应用,获取apikey
      11. //测试key:8f21643950153e066e4bfefc3d244e19
      12. String amap_api_key = "这里需要填写高德地图apiKey";
      13. String url = "https://restapi.amap.com/v3/geocode/regeo?key="+amap_api_key+"&"+"location="+location;
      14. String jsonData = HttpUtil.httpGet(url);
      15. JSONObject jsonLocation = JSON.parseObject(jsonData);
      16. String city = "";
      17. if("1".equals(jsonLocation.getString("status"))){
      18. JSONObject addressComponent =jsonLocation.getJSONObject("regeocode").getJSONObject("addressComponent");
      19. Object obj = null;
      20. // 如果是非直辖市,city返回数据
      21. if((obj = addressComponent.get("city")) instanceof String){
      22. city= (String)obj;
      23. }else if ((obj = addressComponent.get("province")) instanceof String){
      24. // 如果是直辖市,通过province返回数据
      25. city= (String)obj;
      26. }
      27. city = city.replace("市","");
      28. }
      29. return city;
      30. }
      31. }
      复制代码

      到此这篇关于使用Java和高德地图API将经纬度转换为地理位置信息的文章就介绍到这了,更多相关Java经纬度转换为地理位置内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!


      免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
      晓枫资讯-科技资讯社区-免责声明
      免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
            1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
            2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
            3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
            4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
            5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
      http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

        离线 

      TA的专栏

      等级头衔

      等級:晓枫资讯-列兵

      在线时间
      0 小时

      积分成就
      威望
      0
      贡献
      0
      主题
      0
      精华
      0
      金钱
      16
      积分
      12
      注册时间
      2022-12-30
      最后登录
      2022-12-30

      发表于 2025-3-21 09:32:03 | 显示全部楼层
      路过,支持一下
      http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

        离线 

      TA的专栏

      等级头衔

      等級:晓枫资讯-列兵

      在线时间
      0 小时

      积分成就
      威望
      0
      贡献
      0
      主题
      0
      精华
      0
      金钱
      15
      积分
      10
      注册时间
      2022-12-27
      最后登录
      2022-12-27

      发表于 2025-4-7 09:03:44 | 显示全部楼层
      顶顶更健康!!!
      http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
      严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
      您需要登录后才可以回帖 登录 | 立即注册

      本版积分规则

      1楼
      2楼
      3楼

      手机版|晓枫资讯--科技资讯社区 本站已运行

      CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

      晓枫资讯--科技资讯社区

      本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

      如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

      Powered by Discuz! X3.5

      快速回复 返回顶部 返回列表