Java调用高德地图API根据详细地址获取经纬度

该博客介绍了使用Java调用高德地图API,依据详细地址获取经纬度的方法。给出了官方API链接,涉及Web服务API地理/逆地理编码,还展示了实现代码及执行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java调用高德地图API根据详细地址获取经纬度

官方API:https://lbs.amap.com/api/webservice/guide/api/georegeo
*
Web服务API 地理/逆地理编码

实现代码*

package com.example.listdemo.utils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map;

public class MapUtils {
    public static void main(String[] args) {
        try {
            // 1、根据地址获取经纬度
            Map<String, String> lonAndLat = getLonAndLat("浙江省杭州市滨江区江汉路1515号", "key");
            System.out.println("转换后经纬度为:" + lonAndLat);

            // 2、根据经纬度获取地址
            String formattedAddress = getAMapByLngAndLat("120.204798", "30.201000", "高德key");
            System.out.println("转换后地址为:" + formattedAddress);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 地址转换为经纬度
     *
     * @param address 地址
     * @param key     高德地图应用key
     * @return 经纬度
     */
    public static Map getLonAndLat(String address, String key) {
        // 返回输入地址address的经纬度信息, 格式是 经度,纬度
        String queryUrl = "http://restapi.amap.com/v3/geocode/geo?key=" + key + "&address=" + address;
        // 高德接口返回的是JSON格式的字符串
        String queryResult = getResponse(queryUrl);
        Map<String, String> map = new HashMap<String, String>();
        JSONObject obj = JSONObject.parseObject(queryResult);
        if (obj.get("status").toString().equals("1")) {
            JSONObject jobJSON = JSONObject.parseObject(obj.get("geocodes").toString().substring(1, obj.get("geocodes").toString().length() - 1));
            String location = jobJSON.get("location").toString();
            System.out.println("经纬度:" + location);
            String[] lonAndLat = location.split(",");
            if (lonAndLat != null && lonAndLat.length == 2) {
                map.put("lng", lonAndLat[0]);
                map.put("lat", lonAndLat[1]);
            }
            System.out.println(map);
            return map;
        } else {
            throw new RuntimeException("地址转换经纬度失败,错误码:" + obj.get("infocode"));
        }
    }

    /**
     * 将经纬度getLng, getLat 通过getAMapByLngAndLat方法转换地址
     *
     * @param getLng 经度
     * @param getLat 纬度
     * @param key    高德地图应用key
     * @return 地址名称
     * @throws Exception
     */
    public static String getAMapByLngAndLat(String getLng, String getLat, String key) throws Exception {
        String url;
        try {
            url = "http://restapi.amap.com/v3/geocode/regeo?output=JSON&location=" + getLng + ","
                    + getLat + "&key=" + key + "&radius=0&extensions=base";
            String queryResult = getResponse(url); // 高德接品返回的是JSON格式的字符串
            // 将获取结果转为json数据
            JSONObject obj = JSONObject.parseObject(queryResult);
            System.out.println("obj为:" + obj);
            if (obj.get("status").toString().equals("1")) {
                // 如果没有返回-1
                JSONObject regeocode = obj.getJSONObject("regeocode");
                if (regeocode.size() > 0) {
                    // 在regeocode中拿到 formatted_address 具体位置
                    return regeocode.get("formatted_address").toString();
                } else {
                    throw new RuntimeException("未找到相匹配的地址!");
                }
            } else {
                throw new RuntimeException("请求错误!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "-1";
    }

    /**
     * 根据两个定位点的经纬度算出两点间的距离
     *
     * @param startLonLat 起始经纬度
     * @param endLonLat   结束经纬度(目标经纬度)
     * @param key         高德地图应用key
     * @return 两个定位点之间的距离
     */
    private static long getDistance(String startLonLat, String endLonLat, String key) {
        // 返回起始地startAddr与目的地endAddr之间的距离,单位:米
        Long result = new Long(0);
        String queryUrl = "http://restapi.amap.com/v3/distance?key=" + key + "&origins=" + startLonLat + "&destination=" + endLonLat;
        String queryResult = getResponse(queryUrl);
        JSONObject obj = JSONObject.parseObject(queryResult);
        JSONArray ja = obj.getJSONArray("results");
        JSONObject jobO = JSONObject.parseObject(ja.getString(0));
        result = Long.parseLong(jobO.get("distance").toString());
        System.out.println("距离:" + result);
        return result;
    }

    /**
     * 发送请求
     *
     * @param serverUrl 请求地址
     */
    private static String getResponse(String serverUrl) {
        // 用JAVA发起http请求,并返回json格式的结果
        StringBuffer result = new StringBuffer();
        try {
            URL url = new URL(serverUrl);
            URLConnection conn = url.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result.toString();
    }
}


执行结果:

"D:\Program Files\Java\jdk1.8.0_40\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2021.1.3\lib\idea_rt.jar=52173:C:\Program Files\JetBrains\IntelliJ IDEA 2021.1.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_40\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_40\jre\lib\rt.jar;F:\study-project\list-demo\target\classes;D:\mvnrepository\org\springframework\boot\spring-boot-starter-web\2.5.2\spring-boot-starter-web-2.5.2.jar;D:\mvnrepository\org\springframework\boot\spring-boot-starter\2.5.2\spring-boot-starter-2.5.2.jar;D:\mvnrepository\org\springframework\boot\spring-boot-starter-logging\2.5.2\spring-boot-starter-logging-2.5.2.jar;D:\mvnrepository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\mvnrepository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\mvnrepository\org\apache\logging\log4j\log4j-to-slf4j\2.14.1\log4j-to-slf4j-2.14.1.jar;D:\mvnrepository\org\apache\logging\log4j\log4j-api\2.14.1\log4j-api-2.14.1.jar;D:\mvnrepository\org\slf4j\jul-to-slf4j\1.7.31\jul-to-slf4j-1.7.31.jar;D:\mvnrepository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\mvnrepository\org\yaml\snakeyaml\1.28\snakeyaml-1.28.jar;D:\mvnrepository\org\springframework\boot\spring-boot-starter-json\2.5.2\spring-boot-starter-json-2.5.2.jar;D:\mvnrepository\com\fasterxml\jackson\core\jackson-databind\2.12.3\jackson-databind-2.12.3.jar;D:\mvnrepository\com\fasterxml\jackson\core\jackson-annotations\2.12.3\jackson-annotations-2.12.3.jar;D:\mvnrepository\com\fasterxml\jackson\core\jackson-core\2.12.3\jackson-core-2.12.3.jar;D:\mvnrepository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.12.3\jackson-datatype-jdk8-2.12.3.jar;D:\mvnrepository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.12.3\jackson-datatype-jsr310-2.12.3.jar;D:\mvnrepository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.12.3\jackson-module-parameter-names-2.12.3.jar;D:\mvnrepository\org\springframework\boot\spring-boot-starter-tomcat\2.5.2\spring-boot-starter-tomcat-2.5.2.jar;D:\mvnrepository\org\apache\tomcat\embed\tomcat-embed-core\9.0.48\tomcat-embed-core-9.0.48.jar;D:\mvnrepository\org\apache\tomcat\embed\tomcat-embed-el\9.0.48\tomcat-embed-el-9.0.48.jar;D:\mvnrepository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.48\tomcat-embed-websocket-9.0.48.jar;D:\mvnrepository\org\springframework\spring-web\5.3.8\spring-web-5.3.8.jar;D:\mvnrepository\org\springframework\spring-beans\5.3.8\spring-beans-5.3.8.jar;D:\mvnrepository\org\springframework\spring-webmvc\5.3.8\spring-webmvc-5.3.8.jar;D:\mvnrepository\org\springframework\spring-aop\5.3.8\spring-aop-5.3.8.jar;D:\mvnrepository\org\springframework\spring-context\5.3.8\spring-context-5.3.8.jar;D:\mvnrepository\org\springframework\spring-expression\5.3.8\spring-expression-5.3.8.jar;D:\mvnrepository\org\springframework\boot\spring-boot-devtools\2.5.2\spring-boot-devtools-2.5.2.jar;D:\mvnrepository\org\springframework\boot\spring-boot\2.5.2\spring-boot-2.5.2.jar;D:\mvnrepository\org\springframework\boot\spring-boot-autoconfigure\2.5.2\spring-boot-autoconfigure-2.5.2.jar;D:\mvnrepository\org\projectlombok\lombok\1.18.20\lombok-1.18.20.jar;D:\mvnrepository\org\slf4j\slf4j-api\1.7.31\slf4j-api-1.7.31.jar;D:\mvnrepository\org\springframework\spring-core\5.3.8\spring-core-5.3.8.jar;D:\mvnrepository\org\springframework\spring-jcl\5.3.8\spring-jcl-5.3.8.jar;D:\mvnrepository\com\alibaba\fastjson\1.2.68\fastjson-1.2.68.jar;D:\mvnrepository\com\google\guava\guava\22.0\guava-22.0.jar;D:\mvnrepository\com\google\code\findbugs\jsr305\1.3.9\jsr305-1.3.9.jar;D:\mvnrepository\com\google\errorprone\error_prone_annotations\2.0.18\error_prone_annotations-2.0.18.jar;D:\mvnrepository\com\google\j2objc\j2objc-annotations\1.1\j2objc-annotations-1.1.jar;D:\mvnrepository\org\codehaus\mojo\animal-sniffer-annotations\1.14\animal-sniffer-annotations-1.14.jar;D:\mvnrepository\org\apache\commons\commons-collections4\4.4\commons-collections4-4.4.jar;D:\mvnrepository\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;D:\mvnrepository\org\apache\httpcomponents\httpcore\4.4.10\httpcore-4.4.10.jar;D:\mvnrepository\org\apache\httpcomponents\httpclient\4.5.6\httpclient-4.5.6.jar;D:\mvnrepository\commons-httpclient\commons-httpclient\3.1\commons-httpclient-3.1.jar;D:\mvnrepository\commons-logging\commons-logging\1.0.4\commons-logging-1.0.4.jar;D:\mvnrepository\org\apache\commons\commons-lang3\3.3.2\commons-lang3-3.3.2.jar;D:\mvnrepository\commons-codec\commons-codec\1.15\commons-codec-1.15.jar" com.example.listdemo.utils.MapUtils
经纬度:120.204017,30.200900
{lng=120.204017, lat=30.200900}
转换后经纬度为:{lng=120.204017, lat=30.200900}
obj为:{"infocode":"10000","regeocode":{"formatted_address":"浙江省杭州市滨江区长河街道O2(杭州滨江龙湖店)龙湖郦城公馆","addressComponent":{"businessAreas":[{"name":"长河","location":"120.198800,30.188826","id":"330108"}],"country":"中国","province":"浙江省","citycode":"0571","city":"杭州市","adcode":"330108","streetNumber":{"number":"1515号","distance":"15.0673","street":"江南大道","location":"120.204721,30.200882","direction":"西南"},"towncode":"330108003000","district":"滨江区","neighborhood":{"name":[],"type":[]},"township":"长河街道","building":{"name":[],"type":[]}}},"status":"1","info":"OK"}
转换后地址为:浙江省杭州市滨江区长河街道O2(杭州滨江龙湖店)龙湖郦城公馆

Process finished with exit code 0


### Java 调用高德 API 获取省份 示例代码 为了通过经纬度获取所在的省份信息,在Java程序中可以利用HTTP请求发送至高德地图API服务器并解析返回的结果来实现这一功能[^1]。 下面是一个简单的例子展示如何完成这项工作: ```java import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class GaoDeApiTest { private static final String GAODE_API_KEY = "您的高德API Key"; // 替换成自己的key public static void main(String[] args) { try { double longitude = 116.397428; // 经度示例值 double latitude = 39.90923; // 纬度示例值 StringBuilder urlBuilder = new StringBuilder(); urlBuilder.append("https://restapi.amap.com/v3/geocode/regeo?"); urlBuilder.append("location=").append(longitude).append(",").append(latitude); urlBuilder.append("&key=").append(GAODE_API_KEY); URL url = new URL(urlBuilder.toString()); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); String line; while ((line = br.readLine()) != null){ System.out.println(line); // 实际应用应改为JSON解析逻辑以提取具体字段数据 } br.close(); conn.disconnect(); } catch(Exception e){ e.printStackTrace(); } } } ``` 上述代码构建了一个URL字符串用于访问高德逆地理编码服务接口,并传递了必要的参数,包括经度、纬度以及开发者申请得到的应用密钥(Key)。需要注意的是实际开发过程中应当对接口响应的数据做进一步处理而不是简单打印出来;通常会涉及到对JSON格式的解码操作以便于从中抽取所需的地理位置描述信息如省市区名称等[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值