手把手教你调用百度全球逆地理编码API接口-文末附带多种编程语言的完成版本

为什么要使用全球逆地理编码

在工作中有的时候需要根据经纬度转为对应位置信息,今天就遇到了这么一个业务场景,最终实现!!!
接下来手把手教你get新技能哦,话不多说,开整!!!!!!!!!!!!!!!!!!!!!

什么是全球逆地理编码

全球逆地理编码服务是一类Web API接口服务
全球逆地理编码服务提供将坐标点(经纬度)转换为对应位置信息(如所在行政区划,周边地标点分布)功能。
服务同时支持全球行政区划位置描述及周边地标POI数据召回(包括中国在内的全球200多个国家地区)。

在这里插入图片描述

一、创建应用前期准备工作

点击链接注册个人账号,然后创建应用,点击链接跳转去这个页面
在这里插入图片描述
应用服务不要记得勾选,应用类型选择服务端。
在这里插入图片描述
请求校验方式选择sn点击提交。
去应用管理我的应用复制AK到剪切板,后续会用到滴。。。。。

在这里插入图片描述

二、在线平台运行

在线运行走起

https://api.map.baidu.com/reverse_geocoding/v3/?ak=您的ak&output=json&coordtype=wgs84ll&location=31.225696563611,121.49884033194

在这里插入图片描述
下拉到示例代码,输入AK

在这里插入图片描述

得到的代码如下:

/**
  * 选择AK使用SN校验:
  */

package com.android.javaproject;

import org.springframework.web.util.UriUtils;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.security.NoSuchAlgorithmException;
import java.util.LinkedHashMap;
import java.util.Map;

public class SearchHttpSN {

    public static String AK = "替换成你的";

    public static String SK = "替换成你的";

    public static String URL = "https://api.map.baidu.com/reverse_geocoding/v3?";

    public static void main(String[] args) throws Exception {

        SearchHttpSN snCal = new SearchHttpSN();

        Map params = new LinkedHashMap<String, String>();
        params.put("ak", AK);
        params.put("output", "json");
        params.put("coordtype", "wgs84ll");
        params.put("extensions_poi", "0");
        params.put("location", "31.225696563611,121.49884033194");

        params.put("sn", snCal.caculateSn());

        snCal.requestGetSN(URL, params);
    }

    /**
     * 选择了ak,使用SN校验:
     * 根据您选择的AK已为您生成调用代码
     * 检测您当前的AK设置了sn检验,本示例中已为您生成sn计算代码
     * @param strUrl
     * @param param
     * @throws Exception
     */
    public void requestGetSN(String strUrl, Map<String, String> param) throws Exception {
        if (strUrl == null || strUrl.length() <= 0 || param == null || param.size() <= 0) {
            return;
        }

        StringBuffer queryString = new StringBuffer();
        queryString.append(strUrl);
        for (Map.Entry<?, ?> pair : param.entrySet()) {
            queryString.append(pair.getKey() + "=");
            //    第一种方式使用的 jdk 自带的转码方式  第二种方式使用的 spring 的转码方法 两种均可
            //    queryString.append(URLEncoder.encode((String) pair.getValue(), "UTF-8").replace("+", "%20") + "&");
            queryString.append(UriUtils.encode((String) pair.getValue(), "UTF-8") + "&");
        }

        if (queryString.length() > 0) {
            queryString.deleteCharAt(queryString.length() - 1);
        }

        java.net.URL url = new URL(queryString.toString());
        System.out.println(queryString.toString());
        URLConnection httpConnection = (HttpURLConnection) url.openConnection();
        httpConnection.connect();

        InputStreamReader isr = new InputStreamReader(httpConnection.getInputStream());
        BufferedReader reader = new BufferedReader(isr);
        StringBuffer buffer = new StringBuffer();
        String line;
        while ((line = reader.readLine()) != null) {
            buffer.append(line);
        }
        reader.close();
        isr.close();
        System.out.println("SN: " + buffer.toString());
    }

    public String caculateSn() throws UnsupportedEncodingException,
            NoSuchAlgorithmException {
        SearchHttpSN snCal = new SearchHttpSN();

        // 计算sn跟参数对出现顺序有关,get请求请使用LinkedHashMap保存<key,value>,该方法根据key的插入顺序排序;post请使用TreeMap保存<key,value>,该方法会自动将key按照字母a-z顺序排序。
        // 所以get请求可自定义参数顺序(sn参数必须在最后)发送请求,但是post请求必须按照字母a-z顺序填充body(sn参数必须在最后)。
        // 以get请求为例:http://api.map.baidu.com/geocoder/v2/?address=百度大厦&output=json&ak=yourak,paramsMap中先放入address,再放output,然后放ak,放入顺序必须跟get请求中对应参数的出现顺序保持一致。
        Map paramsMap = new LinkedHashMap<String, String>();
        paramsMap.put("ak", AK);
        paramsMap.put("output", "json");
        paramsMap.put("coordtype", "wgs84ll");
        paramsMap.put("extensions_poi", "0");
        paramsMap.put("location", "31.225696563611,121.49884033194");


        // 调用下面的toQueryString方法,对LinkedHashMap内所有value作utf8编码,拼接返回结果address=%E7%99%BE%E5%BA%A6%E5%A4%A7%E5%8E%A6&output=json&ak=yourak
        String paramsStr = snCal.toQueryString(paramsMap);

        // 对paramsStr前面拼接上/geocoder/v2/?,后面直接拼接yoursk得到/geocoder/v2/?address=%E7%99%BE%E5%BA%A6%E5%A4%A7%E5%8E%A6&output=json&ak=yourakyoursk
        String wholeStr = new String("/reverse_geocoding/v3?" + paramsStr + SK);

        System.out.println(wholeStr);
        // 对上面wholeStr再作utf8编码
        String tempStr = URLEncoder.encode(wholeStr, "UTF-8");

        // 调用下面的MD5方法得到最后的sn签名
        String sn = snCal.MD5(tempStr);
        System.out.println(sn);
        return sn;
    }

    // 对Map内所有value作utf8编码,拼接返回结果
    public String toQueryString(Map<?, ?> data)
            throws UnsupportedEncodingException {
        StringBuffer queryString = new StringBuffer();
        for (Map.Entry<?, ?> pair : data.entrySet()) {
            queryString.append(pair.getKey() + "=");
            //    第一种方式使用的 jdk 自带的转码方式  第二种方式使用的 spring 的转码方法 两种均可
            //    queryString.append(URLEncoder.encode((String) pair.getValue(), "UTF-8").replace("+", "%20") + "&");
            queryString.append(UriUtils.encode((String) pair.getValue(), "UTF-8") + "&");
        }
        if (queryString.length() > 0) {
            queryString.deleteCharAt(queryString.length() - 1);
        }
        return queryString.toString();
    }

    // 来自stackoverflow的MD5计算方法,调用了MessageDigest库函数,并把byte数组结果转换成16进制
    public String MD5(String md5) {
        try {
            java.security.MessageDigest md = java.security.MessageDigest
                    .getInstance("MD5");
            byte[] array = md.digest(md5.getBytes());
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < array.length; ++i) {
                sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100)
                        .substring(1, 3));
            }
            return sb.toString();
        } catch (java.security.NoSuchAlgorithmException e) {
        }
        return null;
    }
}

运行结果如下:

{
    "status": 0,
    "result": {
      "location": {
        "lng": 121.50989077799083,
        "lat": 31.22932842411674
      },
      "formatted_address": "上海市黄浦区中山南路187",
      "edz": {
        "name": ""
      },
      "business": "外滩,陆家嘴,董家渡",
      "addressComponent": {
        "country": "中国",
        "country_code": 0,
        "country_code_iso": "CHN",
        "country_code_iso2": "CN",
        "province": "上海市",
        "city": "上海市",
        "city_level": 2,
        "district": "黄浦区",
        "town": "小东门街道",
        "town_code": "310101017",
        "distance": "91",
        "direction": "东北",
        "adcode": "310101",
        "street": "中山南路",
        "street_number": "187"
      },
      "pois": [],
      "roads": [],
      "poiRegions": [],
      "sematic_description": "",
      "formatted_address_poi": "",
      "cityCode": 289
    }
  }

go版本:

// 根据您选择的AK已为您生成调用代码
// 检测您当前的AK设置了sn检验,本示例中已为您生成sn计算代码
package main

import (
  "fmt"
  "strings"
  "crypto/md5"
  "io/ioutil"
  "net/http"
  "net/url"
)


func calculateSN(queryStr string, sk string) string {
    str := queryStr + sk
    key := md5.Sum([]byte(str))
    sn := fmt.Sprintf("%x", key)
    return sn
}

func main() {
    // 此处填写您在控制台-应用管理-创建应用后获取的AK
    ak := "98siR0AoFIvNcUV24zNBQJcYAOmZyKgQ"
    
    // 此处填写您在控制台-应用管理-创建应用时,校验方式选择sn校验后生成的SK
    sk := "E8liNkrQ8eBv2Ojp7tBY92jBKL8Z59GR"

    // 服务地址
    host := "https://api.map.baidu.com"

    // 接口地址
    uri := "/reverse_geocoding/v3"
    
    // 设置请求参数
    params := [][]string {
        {"ak",      ak},
        {"output",  "json"},
        {"coordtype",  "wgs84ll"},
        {"extensions_poi",  "0"},
        {"location",  "31.225696563611,121.49884033194"},

    }

    paramsArr := make([]string, 0)
    for _, v := range params {
        kv := v[0] + "=" + (v[1])
        paramsArr = append(paramsArr, kv)
    }
    paramsStr := strings.Join(paramsArr, "&")

    // 计算sn
    queryStr := url.QueryEscape(uri + "?" + paramsStr)
    sn := calculateSN(queryStr, sk)

    // 发起请求
    request, err := url.Parse(host + uri + "?" + paramsStr + "&sn=" + sn)
    if nil != err {
        fmt.Printf("host error: %v", err)
        return
    }

    resp, err1 := http.Get(request.String())
    // 请注意,此处打印的url为非urlencode后的请求串
    // 如果将该请求串直接粘贴到浏览器中发起请求,由于浏览器会自动进行urlencode,会导致返回sn校验失败
    fmt.Printf("url: %s\n", request.String())
    defer resp.Body.Close()
    if err1 != nil {
        fmt.Printf("request error: %v", err1)
        return
    }
    body, err2 := ioutil.ReadAll(resp.Body)
    if err2 != nil {
        fmt.Printf("response error: %v", err2)
    }

    fmt.Println(string(body))

    return
}

java代码在idea运行效果图如下:
在这里插入图片描述
成功执行,有需要帮助的同仁们欢迎后台私信。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值