Java实现根据地址获取经纬度(基于高德地图API)

摘要:本文介绍如何通过Java调用高德地图API,将具体地址转换为经纬度坐标。通过简单的代码示例演示完整的地址解析流程,并提供可直接复用的工具类。


一、实现原理

通过高德地图开放平台的地理编码API,可将结构化地址转换为经纬度坐标。其核心流程为:

  1. 构造包含地址参数的API请求URL

  2. 发送HTTP请求获取JSON响应

  3. 解析响应数据提取经纬度信息

二、实现步骤

1. 准备工作

  1. 注册高德开放平台账号

  2. 创建应用获取API Key(替换代码中的YOUR_AMAP_KEY_HERE

2. 核心工具类

 

package com.ruoyi.quartz.util;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class AMapUtils {

    // 高德地图Key,请替换为你自己的key
    public static final String KEY = "YOUR_AMAP_KEY_HERE";
    private static Pattern pattern = Pattern.compile("\"location\":\"(\\d+\\.\\d+),(\\d+\\.\\d+)\"");

    /**
     * 通过具体位置获取经纬度坐标
     * @param address 地址信息
     * @return double数组 [经度, 纬度]
     */
    public static double[] addressToGPS(String address) {
        try {
            // 构造API请求URL
            String url = String.format(
                "http://restapi.amap.com/v3/geocode/geo?&s=rsv3&address=%s&key=%s", 
                address, 
                KEY
            );
            
            // 发送HTTP GET请求
            URLConnection conn = new URL(url).openConnection();
            BufferedReader br = new BufferedReader(
                new InputStreamReader(conn.getInputStream(), "UTF-8")
            );
            
            // 读取响应数据
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                response.append(line);
            }
            
            // 使用正则表达式解析经纬度
            Matcher matcher = pattern.matcher(response.toString());
            if (matcher.find() && matcher.groupCount() == 2) {
                return new double[] {
                    Double.parseDouble(matcher.group(1)),
                    Double.parseDouble(matcher.group(2))
                };
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    // 使用示例
    public static void main(String[] args) {
        String address = "北京市朝阳区阜通东大街6号";
        double[] coordinates = addressToGPS(address);
        
        if (coordinates != null) {
            System.out.printf("地址: %s%n经度: %.6f%n纬度: %.6f", 
                address, coordinates[0], coordinates[1]);
        } else {
            System.out.println("坐标获取失败");
        }
    }
}

三、代码解析

1. API请求构造

String url = String.format(
    "http://restapi.amap.com/v3/geocode/geo?&s=rsv3&address=%s&key=%s",
    address, 
    KEY
);
  • address参数需要进行URL编码(代码中未展示,实际使用时建议添加)

  • key需替换为真实的高德API Key

2. 数据解析

使用正则表达式匹配JSON响应中的经纬度:

Pattern pattern = Pattern.compile("\"location\":\"(\\d+\\.\\d+),(\\d+\\.\\d+)\"");
  • 匹配示例:"location":"116.480983,39.989628"

四、执行示例

输入地址

String address = "北京市朝阳区阜通东大街6号";

 预期输出

地址: 北京市朝阳区阜通东大街6号
经度: 116.480983
纬度: 39.989628

五、注意事项

  1. API调用限制
    免费版每日限额2000次,企业级应用需购买更高配额

  2. 异常处理建议

    • 添加网络请求超时设置

    • 处理address包含特殊字符的情况(URL编码)

    • 建议使用JSON解析库(如Jackson)替代正则表达式

  3. 精度问题
    地址描述的准确性直接影响坐标精度,建议使用详细的结构化地址

 

结语:本文提供的方案可快速集成到位置服务、物流系统等需要地理信息处理的Java应用中。建议根据实际业务需求进行扩展优化。


注意事项:请遵守高德地图API使用条款,禁止将坐标数据用于非法用途。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值