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

news2024/11/15 17:28:42

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

在工作中有的时候需要根据经纬度转为对应位置信息,今天就遇到了这么一个业务场景,最终实现!!!
接下来手把手教你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运行效果图如下:
在这里插入图片描述
成功执行,有需要帮助的同仁们欢迎后台私信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1971326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

59简单学生管理系统【功能实现((完善注册、登录、详情页)、记住我 、安全退出、修改密码、修改学生信息、修改老师信息)】、JSP

功能实现 什么是JSP htmljava 5.完善注册、登录、详情页 html页面改用jsp 使用&#xff1a;<%java代码%>&#xff0c;展示用<%“行了”%> 注册 修改RegisterServlet 改用转发方式跳转 原因&#xff1a;注意重定向是两次请求&#xff0c;存在第一次请求中的数据会在…

HarmonyOS APP如何扩展应用功能?

前言 服务模块属于一个应用里面可以拓展的地方&#xff0c;三方服务或者新增加的服务全部可以放进来&#xff0c;这里用的核心组件就是Grid组件 一般的步骤 编写一个Gird的子组件item&#xff0c;这个item一般有图标和文字按照上下进行排列编写一个Grid的组件单元&#xff0c…

【优秀python大屏案例】基于python flask的前程无忧大数据岗位分析可视化大屏设计与实现

随着大数据和人工智能技术的迅猛发展&#xff0c;数据分析和可视化在各个行业中的应用越来越广泛。特别是在招聘领域&#xff0c;大数据分析不仅能够帮助企业更好地了解市场需求&#xff0c;还能为求职者提供科学的职业规划建议。本文探讨了基于Python Flask框架的前程无忧大数…

高效抓取网页模板:Go 1.19站点模板爬虫实战指南

基于Go 1.19的站点模板爬虫的原理是通过发送HTTP请求获取网页内容&#xff0c;然后使用正则表达式或HTML解析库来提取其中的模板内容。这种爬虫可以应用于以下几个方面&#xff1a; 数据抓取&#xff1a;通过爬取站点的模板内容&#xff0c;可以获取所需的数据&#xff0c;例如…

智谱AI张帆:大模型时代构建企业竞争力的四个维度

大模型并不是简单的对话&#xff0c;它润物细无声地贯穿整个服务体系。 7月27日&#xff0c;由《中国企业家》杂志社主办的2024&#xff08;第二十四届&#xff09;中国企业未来之星年会在上海举行。在“前沿微课”环节&#xff0c;智谱AI COO张帆进行了名为“大模型的企业级应…

RCE(远程代码执行漏洞)原理及漏洞利用

作用 RCE漏洞&#xff0c;可以让攻击者直接向后台服务器远程注入操作系统命令或者代码&#xff0c;从而控制后台系统。 原理 远程系统命令执行 一般出现这种漏洞&#xff0c;是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口。比如我们常见的路由器、防火墙、入…

揭秘循环购模式:消费即收益

大家好&#xff0c;我是你们的电商策略顾问吴军。今天&#xff0c;我将带大家深入探索一种别开生面的商业模式——循环购模式。这种模式究竟有何魅力&#xff0c;能让消费者在享受购物乐趣的同时&#xff0c;还能获得额外的收益&#xff1f;更有趣的是&#xff0c;一些商家通过…

精准防控,高效管理:AI智能分析网关V4区域未停留检测算法的介绍及应用

一、区域未停留AI检测算法概述 随着人工智能和计算机视觉技术的飞速发展&#xff0c;区域未停留AI检测算法作为一种重要的视频分析技术&#xff0c;逐渐在各个领域得到广泛应用。该算法通过高效处理视频流数据&#xff0c;能够实时分析并判断目标对象是否在预设区域内有足够的…

influxdb 读取本地csv

官方链接 Query CSV data sources | Flux Documentation (influxdata.com) 我的是windows版本的OSS&#xff0c;如果直接把csv放在文件夹路径下读取会报错&#xff0c;官方也写了&#xff0c;这样是无法读取的 所以用了grafana开的web服务来实现读取csv的目的。 import &qu…

ts踩坑!在 Vue.js 中使用 Element Plus 组件库时,组件属性值所传类型需要与组件期望的类型一致。

在 Vue.js 中使用 Element Plus 组件库时&#xff0c;用el-tag组件举例&#xff0c; 属性值所传类型需要与组件期望的类型一致。 //当我们简单定义 举例&#xff1a;let tagType:string 或者&#xff1a; let tagType ref<string>()然后给el-tag的type属性赋值时&…

数据驱动决策:内容数据产品经理的成长与价值

数据驱动决策&#xff1a;内容数据产品经理的成长与价值 内容数据产品经理以数据为媒介&#xff0c;在用户与决策之间搭建桥梁&#xff0c;通过理解分析模型和用户决策路径&#xff0c;设计产品以促成更多决策产出&#xff0c;创造用户价值。例如&#xff0c;在衡量数据产品经理…

列表的单选和多选以及联动

<template><view><cu-custom bgColor"bg-gradual-white" :isBack"true"><block slot"backText">我的收藏</block></cu-custom><view class"top"><view>加油站</view><view …

地图下载软件与网站收藏(持续更新...)

慢慢记录总结学习工作中用到的有关地图下载的工具和网站 工具 图新地球 中科图新旗下的gis软件&#xff0c;官方地址&#xff1a;传送门 中文软件直接用就行&#xff0c;可以自行配置相关图源&#xff0c;有需要的化可以私信我。 全能地图下载器 Global Mapper Global Ma…

龙腾码支付系统三网免挂个人免签支付兼容易支付带详细教程

一、系统简介 码支付是基于ThinkPhp5.0 FastAdmin 开发的一套新型聚合收款、聚合支付系统&#xff0c;是一款专业的聚合免签收款系统,无需对接其余平台,个码就可收款,灰常的方便快捷,集成实现三网免挂功能,无需挂繁琐的监控软件就可实现回调,更便捷的监控方式,更优的产品质量,更…

苹果电脑上可以使用的快捷回复工具有哪些

很多客服都用苹果电脑回复客户提问&#xff0c;那么苹果电脑上都有哪些工具&#xff0c;可以实现快捷回复呢 摘要 目前&#xff0c;很多客服都用苹果电脑回复客户提问&#xff0c;快捷回复软件就是客服的刚需。众所周知&#xff0c;苹果电脑MAC系统的应用不如Windows系统多&am…

计算机毕业设计选题推荐-课程教学辅助系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Intellij IDEA--选择圆括号(小括号)的内容的插件

原文网址&#xff1a;Intellij IDEA--选择圆括号(小括号)的内容的插件-CSDN博客 简介 本文介绍Intellij IDEA选择圆括号(小括号)内的内容的插件。本插件支持这些括号&#xff1a; "<>", "[]", "{}", "()"。 Java星球&#xf…

[Oracle]面试官:你说说rownum、currval与nextval分别是什么,还有没有其他的?

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/140866513 出自【进步*于辰的博客】 文章目录 1、rownum1.1 介绍1.2 示例 2、nextval、currval2…

【读点论文】自然场景文本检测与识别的深度学习方法,分门别类的给定义做调研,对初入门者非常友好的工作,文本检测,识别,端到端识别

自然场景文本检测与识别的深度学习方法 abstract 许多自然场景图像中都包含丰富的文本,它们对于场景理解有着重要的作用。随着移动互联网技术的飞速发展,许多新的应用场景都需要利用这些文本信息,例如招牌识别和自动驾驶等。因此,自然场景文本的分析与处理也越来越成为计算机…

Spring相关框架整合Drools

7.1 Spring简单整合Drools a.第一步&#xff1a;创建maven工程drools_spring并配置pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLS…