java 调用百度地址匹配接口获取经纬度坐标

本文介绍了一个利用百度地图API实现的通用方法,包括根据坐标获取所在省市县和根据地址名称匹配得到经纬度坐标。代码示例中包含了地址解析与坐标转换的核心逻辑,适合在项目中调用。

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

做项目中经常要调用 百度地图,遇到要根据坐标得到地址名称,或根据名称匹配得到经纬度坐标,所以提取出来写了两个通用方法。

需要依赖 json.jar 包。


源代码如下:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import net.sf.json.JSONObject;


/**
 * 地址匹配
 * @author
 *
 */
public class AddressParse {
    /**
     * 正向地址匹配接口
     * 根据xy获取所在省市县
     * @param xy
     * @return
     */
     public static Map geodecode(String xy){
            String sUrl="http://api.map.baidu.com/geocoder/v2/?ak=8926feb9ef0a93c41c13b6103bf4dfa6&location="+xy + "&output=json&pois=0";
             String address="";
             StringBuffer str = new StringBuffer();
             Map resultMap=new HashMap();
             try {  
                 java.net.URL url = new java.net.URL(sUrl);
                 BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"utf-8"));
                 String line;
                 while ((line = in.readLine()) != null) {
                     str.append(line);
                 }
                 in.close();
                if (str.equals("") || str == null) {
                    System.err.println("百度服务无返回");
                    return null;
                }
                System.out.println(str.toString());
                
                
                JSONObject jsonobj = null;
                try {
                    jsonobj = JSONObject.fromObject(str.toString());
                    JSONObject result = jsonobj.getJSONObject("result");// 获取对象
                    JSONObject addressComponent = result
                            .getJSONObject("addressComponent");
                    String province = addressComponent
                            .getString("province");
                    resultMap.put("province",province);
                    String city = addressComponent.getString("city");
                    resultMap.put("city",city);
                    String district = addressComponent
                            .getString("district");
                    resultMap.put("district",district);
                    
                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println("此坐标获取不到省份:"+xy);
                }
                
               
             } catch (Exception e) {  
                 e.printStackTrace();  
             }  
             return resultMap;
        }
 
     /**
      * 逆向匹配接口
      * 根据地址名称,匹配得到经纬度坐标
      * @param addr
      * @return
      */
    public static String geocode(String addr){
        String xyStr="";
        addr=URLEncoder.encode(addr);
        StringBuffer str = new StringBuffer();
        String lng="";
        String lat="";
        try {
            //System.out.println("http://api.map.baidu.com/geocoder?address="+addr+"&output=json");
            String sUrl="http://api.map.baidu.com/geocoder/v2/?address="+addr+"&output=json&ak=FeuQOBmCyjUYrbWkgey8eSmn";
            java.net.URL url = new java.net.URL(sUrl);
            //java.net.URL url = new java.net.URL("http://api.map.baidu.com/?qt=gc&wd="+addr+"&cn=%E5%85%A8%E5%9B%BD&ie=utf-8&oue=0&res=api&callback=BMap._rd._cbk96117");
            BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
            String line;
            while ((line = in.readLine()) != null) {
                str.append(line);
            }
            in.close();
            JSONObject dataJson=null;
            dataJson =JSONObject.fromObject(str.toString());
            JSONObject result=dataJson.getJSONObject("result");
            JSONObject location=result.getJSONObject("location");
            lng =location.getDouble("lng")+"";
            lat =location.getDouble("lat")+"";
            xyStr= lng+" "+lat;
        } catch (Exception e) {
            lng="";
            lat="";
        }
        return xyStr;
    }
    
    public static void main(String [] args){
        String xy = AddressParse.geocode("成都市成华区建设路颐和家园7栋2801");
        System.out.println(xy);
        
        Map address = AddressParse.geodecode("40.033534,116.313289");
        System.out.println(address);
        
    }
}


### 百度地图API中实现点击后获取经纬度地址信息 要在百度地图 API 中实现点击操作来获取经纬度以及对应的地址信息,可以按照以下方法完成: #### 地图初始化 首先,在 Android Studio 中集成百度地图 SDK 并配置好 `AK` 和其他必要参数。确保已正确申请并绑定应用的 SHA1 密钥和包名。 ```xml <com.baidu.mapapi.map.MapView android:id="@+id/baiduMapView" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` 在 Java 或 Kotlin 文件中初始化地图视图: ```java public class MapActivity extends AppCompatActivity { private BMapManager mBMapManager; private MapView mapView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_map); mapView = findViewById(R.id.baiduMapView); mapView.showZoomControls(false); // 隐藏缩放控件 initMap(); } private void initMap() { final BaiduMap baiduMap = mapView.getMap(); // 设置监听器以捕获点击事件 baiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() { @Override public void onMapClick(LatLng point) { double latitude = point.latitude; // 获取纬度 double longitude = point.longitude; // 获取经度 String address = getAddressFromLatLng(latitude, longitude); // 转换为地址 Toast.makeText(MapActivity.this, "Latitude:" + latitude + ", Longitude:" + longitude + "\nAddress:" + address, Toast.LENGTH_SHORT).show(); } @Override public boolean onMapPoiClick(MapPoi mapPoi) { return false; } }); } } ``` 上述代码实现了当用户点击地图时触发回调函数,并提取点击位置的经纬度[^1]。 --- #### 使用逆地理编码服务获取地址信息 为了将经纬度转换为实际的地址信息,可以通过百度地图提供的 **逆地理编码接口** 完成此功能。以下是具体实现方式: 定义一个工具类用于发送 HTTP 请求到百度地图 API 的逆地理编码服务端口: ```java import org.json.JSONObject; public class GeoCoderUtil { private static final String BAIDU_GEOCODER_URL = "http://api.map.baidu.com/reverse_geocoding/v3/?ak=YOUR_API_KEY&output=json&coordtype=wgs84ll&location=%f,%f"; public static String reverseGeocode(double latitude, double longitude) throws Exception { URL url = new URL(String.format(BAIDU_GEOCODER_URL, latitude, longitude)); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); int responseCode = connection.getResponseCode(); if (responseCode == 200) { BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); StringBuilder jsonResponse = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { jsonResponse.append(line); } JSONObject jsonObject = new JSONObject(jsonResponse.toString()); if ("OK".equals(jsonObject.getString("status"))) { return jsonObject.getJSONObject("result").getJSONObject("addressComponent").getString("formatted_address"); } else { throw new RuntimeException("Reverse geocoding failed with status: " + jsonObject.getString("status")); } } else { throw new IOException("Failed to connect to the server. Response code: " + responseCode); } } } ``` 调用该工具类中的 `reverseGeocode()` 方法即可获得指定坐标下的详细地址信息[^2]。 --- #### 存储经纬度对象 如果需要频繁处理多个地点的数据,则建议封装一个简单的数据模型来保存这些信息。例如基于引用内容构建如下结构体: ```java @Data @AllArgsConstructor @NoArgsConstructor public class Point { /** 经度 */ private Double lng; /** 纬度 */ private Double lat; } ``` 这样可以在程序内部方便地传递地理位置的相关属性[^3]。 --- ### 注意事项 - 如果遇到错误提示 `{“status”:230,"message":"APP Mcode码校验失败"}` ,可能是因为签名验证未通过,请重新核对 SHA1 是否匹配当前项目的证书指纹。 - 对于 HTTPS 连接请求部分,务必考虑线程安全问题;通常推荐采用异步加载机制或者借助第三方库简化网络交互流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值