国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

引領(lǐng)位置服務(wù)驅(qū)動(dòng):騰訊地圖 WebService 服務(wù)端 API 實(shí)用指南

這篇具有很好參考價(jià)值的文章主要介紹了引領(lǐng)位置服務(wù)驅(qū)動(dòng):騰訊地圖 WebService 服務(wù)端 API 實(shí)用指南。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

?? 嗨,您好 ?? 我是 vnjohn,在互聯(lián)網(wǎng)企業(yè)擔(dān)任 Java 開(kāi)發(fā),CSDN 優(yōu)質(zhì)創(chuàng)作者
?? 推薦專(zhuān)欄:Spring、MySQL、Nacos、Java,后續(xù)其他專(zhuān)欄會(huì)持續(xù)優(yōu)化更新迭代
??文章所在專(zhuān)欄:業(yè)務(wù)設(shè)計(jì)
?? 我當(dāng)前正在學(xué)習(xí)微服務(wù)領(lǐng)域、云原生領(lǐng)域、消息中間件等架構(gòu)、原理知識(shí)
?? 向我詢問(wèn)任何您想要的東西,ID:vnjohn
??覺(jué)得博主文章寫(xiě)的還 OK,能夠幫助到您的,感謝三連支持博客??
?? 代詞: vnjohn
? 有趣的事實(shí):音樂(lè)、跑步、電影、游戲

目錄

簡(jiǎn)介

在工作中,一旦涉及到地理位置經(jīng)緯度的解析,通過(guò)經(jīng)緯度解析所在的詳細(xì)地址,通過(guò) IP 解析所在的經(jīng)緯度再解析所在的詳細(xì)地址,常用的地圖 API 有百度、騰訊等第三方可以用于集成在項(xiàng)目中使用,本文我們會(huì)以騰訊地圖 API 實(shí)現(xiàn)地理位置信息解析,提供源碼以及應(yīng)用的場(chǎng)景

騰訊地圖 API 官方文檔:WebService API|騰訊位置服務(wù)

騰訊地圖 WebService API 是基于 HTTPS/HTTP 協(xié)議的數(shù)據(jù)接口
開(kāi)發(fā)者可以使用任何客戶端、服務(wù)器和開(kāi)發(fā)語(yǔ)言,按照騰訊地圖 WebService API 規(guī)范,按需構(gòu)建 HTTPS 請(qǐng)求,并獲取結(jié)果數(shù)據(jù)(目前支持JSON/JSONP方式返回)

配置管理

配額

針對(duì)個(gè)人開(kāi)發(fā)者和企業(yè)開(kāi)發(fā)者,提供的服務(wù) API 調(diào)用量有明顯的差別,以下圖來(lái)自官方文檔

引領(lǐng)位置服務(wù)驅(qū)動(dòng):騰訊地圖 WebService 服務(wù)端 API 實(shí)用指南,業(yè)務(wù)設(shè)計(jì),1024程序員節(jié),java

從上圖可知,普通的接口 API 能夠讓我們自由的調(diào)用,根據(jù)不同的身份來(lái)區(qū)分對(duì)應(yīng)的可用額度,個(gè)人開(kāi)發(fā)者 -> 企業(yè)開(kāi)發(fā)者 -> 商業(yè)授權(quán)開(kāi)發(fā)者

除了:路線規(guī)劃|距離矩陣:貨車(chē)|智能地址解析這些復(fù)雜的地理位置信息采集,其他啊的接口都有可限的使用額度

申請(qǐng)步驟

前往騰訊位置服務(wù)注冊(cè)頁(yè),通過(guò)手機(jī)號(hào)+郵箱認(rèn)證號(hào)個(gè)人開(kāi)發(fā)者身份,隨即登錄至控制臺(tái)

1、創(chuàng)建應(yīng)用

引領(lǐng)位置服務(wù)驅(qū)動(dòng):騰訊地圖 WebService 服務(wù)端 API 實(shí)用指南,業(yè)務(wù)設(shè)計(jì),1024程序員節(jié),java

應(yīng)用是最大的承載能力,一個(gè)應(yīng)用下可以添加多個(gè)對(duì)應(yīng)的 Key,而應(yīng)用下所屬的 Key 才是我們服務(wù)端調(diào)用 API 必須要的能力

2、創(chuàng)建 Key

引領(lǐng)位置服務(wù)驅(qū)動(dòng):騰訊地圖 WebService 服務(wù)端 API 實(shí)用指南,業(yè)務(wù)設(shè)計(jì),1024程序員節(jié),java

啟用產(chǎn)品:WebServiceAPI、SDK、微信小程序

WebServiceAPI 產(chǎn)品是用于服務(wù)端調(diào)用的能力,有三種可配置能力:域名白名單、授權(quán) IP、簽名檢驗(yàn)

1、域名白名單:當(dāng)在調(diào)用騰訊地圖 API 時(shí)傳入當(dāng)前所要服務(wù)的域名,請(qǐng)求的域名在域名白名單內(nèi),才能完成服務(wù)的請(qǐng)求
2、授權(quán) IP:當(dāng)在調(diào)用騰訊地圖 API 時(shí)傳入當(dāng)前所要請(qǐng)求的 IP 地址,請(qǐng)求的 IP 在「授權(quán)IP」內(nèi),才能完成服務(wù)的請(qǐng)求
3、簽名校驗(yàn):當(dāng)采用這種方式時(shí),騰訊地圖 API 會(huì)為我們分配一個(gè) Secret key 值,同時(shí)會(huì)為我們提供具體的簽名校驗(yàn)方式,讓我們能夠快速接入

一般在工作中較多采用的是第一種、第二種方式,第一種、第二種沒(méi)有那么大的復(fù)雜性不需要額外的技術(shù)成本去接入但安全性不高,第三種方式會(huì)增加接入的復(fù)雜性要額外的技術(shù)知識(shí)去實(shí)現(xiàn)但安全性較高

WebServiceAPI 如何使用的官方文檔:WebServiceAPI 配置

「SDK」產(chǎn)品是用于安卓端、IOS 端使用的能力,當(dāng) App 應(yīng)用需要使用到騰訊地圖的地圖、導(dǎo)航服務(wù)時(shí),需要配置好該產(chǎn)品的能力,它的配置方式則與 WebServiceAPI 不同,它要配置的是安卓應(yīng)用或 IOS 應(yīng)用打包以后生成的包名稱(chēng),可支持配置多個(gè),每行配一個(gè),多個(gè)進(jìn)行隔行分開(kāi)

「微信小程序」產(chǎn)品是用于在微信小程序端使用的能力,當(dāng)小程序內(nèi)需要用到騰訊地圖的某些功能時(shí),例如:路線規(guī)劃,那么使用它是非常好的選擇

3、當(dāng)創(chuàng)建 Key 完成以后,會(huì)生成一個(gè)隨機(jī)的密鑰字符

引領(lǐng)位置服務(wù)驅(qū)動(dòng):騰訊地圖 WebService 服務(wù)端 API 實(shí)用指南,業(yè)務(wù)設(shè)計(jì),1024程序員節(jié),java

4、點(diǎn)擊詳情,可查看具體分配的接口 API 調(diào)用額度信息

引領(lǐng)位置服務(wù)驅(qū)動(dòng):騰訊地圖 WebService 服務(wù)端 API 實(shí)用指南,業(yè)務(wù)設(shè)計(jì),1024程序員節(jié),java

當(dāng)您是個(gè)人開(kāi)發(fā)者時(shí),默認(rèn)只會(huì)給你一個(gè) Key 的可用額度,再申請(qǐng)其他的 Key 是無(wú)法獲取額度的

地理位置解析

當(dāng)應(yīng)用和 Key 配置好以后,下面我們就通過(guò)官方文檔 API 來(lái)進(jìn)行以下幾種 API 具體的實(shí)現(xiàn)

基礎(chǔ)代碼配置

騰訊 API 配置信息

/**
 * 騰訊地圖 API 配置信息
 *
 * @author vnjohn
 * @since 2023/10/25
 */
@Component
public class TencentMapConfig {
    @Value("${tencent.map.key}")
    private String tencentMapKey;

    protected static String PARSE_IP = "https://apis.map.qq.com/ws/location/v1/ip?key=%s&ip=%s";
    protected static String PARSE_ADDRESS = "https://apis.map.qq.com/ws/geocoder/v1/?key=%s&address=%s";
    protected static String PARSE_INVERSE_ADDRESS = "https://apis.map.qq.com/ws/geocoder/v1/?key=%s&location=%s,%s&get_poi=0";
    protected static String PLACE_TIPS = "https://apis.map.qq.com/ws/place/v1/suggestion?key=%s&keyword=%s&page_index=%s&page_size=%s&location=%s,%s";
	// .......
}

調(diào)用 API 接口所需的 Key 信息以及其他 API 完整的 URL 地址,單獨(dú)放在一個(gè)類(lèi)進(jìn)行存儲(chǔ)

一般我們會(huì)放在 Nacos 中進(jìn)行存儲(chǔ),當(dāng)發(fā)生 URL 參數(shù)變更時(shí),可以結(jié)合 Nacos 動(dòng)態(tài)刷新機(jī)制一起使用

基礎(chǔ)地圖結(jié)構(gòu)定義

/**
 * @author vnjohn
 * @since 2023/7/23
 */
@Data
public class TencentMapResult<T> {
    /**
     * 狀態(tài)碼,0為正常,其它為異常
     */
    private Integer status;

    /**
     * 狀態(tài)說(shuō)明
     */
    private String message;

    /**
     * 查詢結(jié)果總數(shù)量
     */
    private Integer count;

    /**
     * 返回?cái)?shù)據(jù) > 數(shù)組
     */
    private T data;

    /**
     * 返回?cái)?shù)據(jù) > 對(duì)象
     */
    private T result;

}

因?yàn)樵隍v訊位置服務(wù)提供的 API 接口中,不同的接口可能它返回的結(jié)構(gòu)不一樣,有的返回是數(shù)組,有的返回是對(duì)象,所以在我們對(duì)接使用這一側(cè),就必須對(duì)不同的數(shù)據(jù)結(jié)構(gòu)做一層適配,故而之采用泛型的結(jié)構(gòu)來(lái)接收處理

公用數(shù)據(jù)結(jié)構(gòu)抽象

/**
 * 騰訊地圖「經(jīng)緯度」
 *
 * @author vnjohn
 * @since 2023/7/23
 */
@Data
public class TencentLocation {
    /**
     * 經(jīng)度
     */
    private Double lng;

    /**
     * 緯度
     */
    private Double lat;

}

在接收 API 接口返回的結(jié)果時(shí),這一塊的結(jié)構(gòu)可以在多個(gè)地方同時(shí)運(yùn)用到,故將它抽象出來(lái)作為一個(gè)單獨(dú)的類(lèi)

請(qǐng)求工具類(lèi)

在簡(jiǎn)介中介紹到了「騰訊地圖 WebService API 是基于 HTTPS/HTTP 協(xié)議的數(shù)據(jù)接口」那么我們就調(diào)用這部分?jǐn)?shù)據(jù)接口時(shí),就需要一個(gè) HTTPS、HTTP 工具來(lái)進(jìn)行調(diào)用,從而拿到具體的返回結(jié)果,在這里我們采用了 Spring 提供的客戶端請(qǐng)求類(lèi):org.springframework.web.client.RestTemplate,如下的源碼就是基于它進(jìn)行再次封裝,我們只需要關(guān)心具體的結(jié)果即可,在再次封裝中我會(huì)適配好 HTTP、HTTPS 協(xié)議實(shí)現(xiàn),如下:

/**
 * 遠(yuǎn)程調(diào)用 URL 工具類(lèi)
 *
 * @author vnjohn
 * @date 2022/1/7
 */
@Slf4j
@Configuration
public class RestTemplateUtils {
    private static final RestTemplate restTemplate = new RestTemplate();

    @PostConstruct
    public void initial() {
        restTemplate.getMessageConverters().add(new WxHttpMessageConverter());
        restTemplate.setRequestFactory(clientHttpRequestFactory());
        restTemplate.setErrorHandler(new DefaultResponseErrorHandler());
    }

    /**
     * 添加對(duì) HTTPS 的支持.
     *
     * @return
     */
    @Bean
    public HttpComponentsClientHttpRequestFactory clientHttpRequestFactory() {
        try {
            HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null,
                    (TrustStrategy) (arg0, arg1) -> true).build();
            httpClientBuilder.setSSLContext(sslContext);
            HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
            SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext,
                    hostnameVerifier);
            Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
                                                                                     .register("http", PlainConnectionSocketFactory.getSocketFactory())
                                                                                     .register("https", sslConnectionSocketFactory).build();
            PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(
                    socketFactoryRegistry);
            poolingHttpClientConnectionManager.setMaxTotal(2700);
            poolingHttpClientConnectionManager.setDefaultMaxPerRoute(100);
            httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager);
            httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(3, true));
            HttpClient httpClient = httpClientBuilder.build();
            HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(
                    httpClient);
            clientHttpRequestFactory.setConnectTimeout(20000);
            clientHttpRequestFactory.setReadTimeout(30000);
            clientHttpRequestFactory.setConnectionRequestTimeout(20000);
            return clientHttpRequestFactory;
        } catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {
            log.error("===> init http client pool error!!!", e);
        }
        return null;
    }

    // ----------------------------------GET-------------------------------------------------------

    /**
     * GET請(qǐng)求調(diào)用方式
     *
     * @param url          請(qǐng)求URL
     * @param responseType 返回對(duì)象類(lèi)型
     * @return ResponseEntity 響應(yīng)對(duì)象封裝類(lèi)
     */
    public static <T> ResponseEntity<T> get(String url, Class<T> responseType) {
        return restTemplate.getForEntity(url, responseType);
    }

    /**
     * GET請(qǐng)求調(diào)用方式
     *
     * @param url          請(qǐng)求URL
     * @param responseType 返回對(duì)象類(lèi)型
     * @param uriVariables URL中的變量,按順序依次對(duì)應(yīng)
     * @return ResponseEntity 響應(yīng)對(duì)象封裝類(lèi)
     */
    public static <T> ResponseEntity<T> get(String url, Class<T> responseType, Object... uriVariables) {
        return restTemplate.getForEntity(url, responseType, uriVariables);
    }

    /**
     * GET請(qǐng)求調(diào)用方式
     *
     * @param url          請(qǐng)求URL
     * @param responseType 返回對(duì)象類(lèi)型
     * @param uriVariables URL中的變量,與Map中的key對(duì)應(yīng)
     * @return ResponseEntity 響應(yīng)對(duì)象封裝類(lèi)
     */
    public static <T> ResponseEntity<T> get(String url, Class<T> responseType, Map<String, ?> uriVariables) {
        return restTemplate.getForEntity(url, responseType, uriVariables);
    }

    /**
     * 帶請(qǐng)求頭的GET請(qǐng)求調(diào)用方式
     *
     * @param url          請(qǐng)求URL
     * @param headers      請(qǐng)求頭參數(shù)
     * @param responseType 返回對(duì)象類(lèi)型
     * @param uriVariables URL中的變量,按順序依次對(duì)應(yīng)
     * @return ResponseEntity 響應(yīng)對(duì)象封裝類(lèi)
     */
    public static <T> ResponseEntity<T> get(String url, Map<String, String> headers, Class<T> responseType, Object... uriVariables) {
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setAll(headers);
        return get(url, httpHeaders, responseType, uriVariables);
    }

    /**
     * 帶請(qǐng)求頭的GET請(qǐng)求調(diào)用方式
     *
     * @param url          請(qǐng)求URL
     * @param headers      請(qǐng)求頭參數(shù)
     * @param responseType 返回對(duì)象類(lèi)型
     * @param uriVariables URL中的變量,按順序依次對(duì)應(yīng)
     * @return ResponseEntity 響應(yīng)對(duì)象封裝類(lèi)
     */
    public static <T> ResponseEntity<T> get(String url, HttpHeaders headers, Class<T> responseType, Object... uriVariables) {
        HttpEntity<?> requestEntity = new HttpEntity<>(headers);
        return exchange(url, HttpMethod.GET, requestEntity, responseType, uriVariables);
    }

    /**
     * 帶請(qǐng)求頭的GET請(qǐng)求調(diào)用方式
     *
     * @param url          請(qǐng)求URL
     * @param headers      請(qǐng)求頭參數(shù)
     * @param responseType 返回對(duì)象類(lèi)型
     * @param uriVariables URL中的變量,與Map中的key對(duì)應(yīng)
     * @return ResponseEntity 響應(yīng)對(duì)象封裝類(lèi)
     */
    public static <T> ResponseEntity<T> get(String url, Map<String, String> headers, Class<T> responseType, Map<String, ?> uriVariables) {
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setAll(headers);
        return get(url, httpHeaders, responseType, uriVariables);
    }

    /**
     * 帶請(qǐng)求頭的GET請(qǐng)求調(diào)用方式
     *
     * @param url          請(qǐng)求URL
     * @param headers      請(qǐng)求頭參數(shù)
     * @param responseType 返回對(duì)象類(lèi)型
     * @param uriVariables URL中的變量,與Map中的key對(duì)應(yīng)
     * @return ResponseEntity 響應(yīng)對(duì)象封裝類(lèi)
     */
    public static <T> ResponseEntity<T> get(String url, HttpHeaders headers, Class<T> responseType, Map<String, ?> uriVariables) {
        HttpEntity<?> requestEntity = new HttpEntity<>(headers);
        return exchange(url, HttpMethod.GET, requestEntity, responseType, uriVariables);
    }

    // ----------------------------------POST-------------------------------------------------------

    /**
     * POST請(qǐng)求調(diào)用方式
     *
     * @param url          請(qǐng)求URL
     * @param responseType 返回對(duì)象類(lèi)型
     * @return
     */
    public static <T> ResponseEntity<T> post(String url, Class<T> responseType) {
        return restTemplate.postForEntity(url, HttpEntity.EMPTY, responseType);
    }
	// ......................
}

若想要關(guān)于該工具類(lèi)的全部源碼及依賴(lài),可以私信博主或底下留言進(jìn)行獲取~

IP 定位接口

IP 定位,官方文檔介紹:IP 定位

IP 定位返回結(jié)構(gòu)如下:

/**
 * @author vnjohn
 * @since 2023/7/23
 */
@Data
public class TencentParseIpResponse {
    @ApiModelProperty("ip 信息")
    private String ip;

    @ApiModelProperty("所在定位")
    private TencentLocation location;

    @JsonProperty("ad_info")
    @ApiModelProperty("定位行政區(qū)劃信息")
    private AdInfoComponent adInfoComponent;

    @Data
    public static class AdInfoComponent {
        @ApiModelProperty("國(guó)家")
        private String nation;

        @ApiModelProperty("省")
        private String province;

        @ApiModelProperty("市")
        private String city;

        @ApiModelProperty("區(qū)")
        private String district;
    }

}

IP 定位接口如何調(diào)用的方法如下:

/**
 * 通過(guò)傳入的 IP 解析所在經(jīng)緯度「IP定位」
 *
 * @param ip IP
 * @return 解析地址后所得信息
 */
public TencentMapResult<TencentParseIpResponse> parseIp(String ip) {
    TencentMapResult<TencentParseIpResponse> tencentMapResult = new TencentMapResult<>();
    // 拼接請(qǐng)求參數(shù)
    String parseIpRequestUrl = String.format(TencentMapConfig.PARSE_IP, tencentMapKey, ip);
    ResponseEntity<TencentMapResult> parseIpResult = RestTemplateUtils.get(parseIpRequestUrl, TencentMapResult.class);
    // RestTemplate 請(qǐng)求未處理成功
    if (parseIpResult.getStatusCodeValue() != CommonConstant.EXTERNAL_SUCCESS_CODE || Objects.isNull(parseIpResult.getBody())) {
        log.error("RestTemplate 請(qǐng)求騰訊地圖 parseIpResult 失敗,{}", JsonUtils.objToJsonStr(parseIpResult.getBody()));
        return tencentMapResult;
    }
    if (!parseIpResult.getBody().getStatus().equals(CommonConstant.ZERO)) {
        log.error("調(diào)用騰訊地圖 parseIpResult API 失敗,{}", JsonUtils.objToJsonStr(parseIpResult.getBody()));
        return tencentMapResult;
    }
    Object data = parseIpResult.getBody().getResult();
    BeanUtils.copyProperties(parseIpResult.getBody(), tencentMapResult);
    TencentParseIpResponse parseIpResponse = JsonUtils.jsonStrToObj(JsonUtils.objToJsonStr(data), TencentParseIpResponse.class);
    tencentMapResult.setResult(parseIpResponse);
    return tencentMapResult;
}

地址解析接口

地址解析,官方文檔介紹:地址解析

地址解析返回結(jié)構(gòu)如下:

/**
 * @author vnjohn
 * @since 2023/7/23
 */
@Data
public class TencentParseAddressResponse {
    @ApiModelProperty("提示文字")
    private String title;

    @ApiModelProperty("所在定位")
    private TencentLocation location;

    @JsonProperty("address_components")
    private AddressComponent addressComponent;

    @Data
    public static class AddressComponent {
        @ApiModelProperty("省")
        private String province;

        @ApiModelProperty("市")
        private String city;

        @ApiModelProperty("區(qū)")
        private String district;

        @ApiModelProperty("街道")
        private String street;
    }

}

地址解析接口如何調(diào)用|處理的方法如下:

/**
 * 通過(guò)傳入的地址解析所在經(jīng)緯度「地址解析」
 *
 * @param address 地址信息
 * @return 解析地址后所得信息
 */
public TencentMapResult<TencentParseAddressResponse> parseAddress(String address) {
    TencentMapResult<TencentParseAddressResponse> tencentMapResult = new TencentMapResult<>();
    // 拼接請(qǐng)求參數(shù)
    String parseAddressRequestUrl = String.format(TencentMapConfig.PARSE_ADDRESS, tencentMapKey, address);
    ResponseEntity<TencentMapResult> parseAddressResult = RestTemplateUtils.get(parseAddressRequestUrl, TencentMapResult.class);
    // RestTemplate 請(qǐng)求未處理成功
    if (parseAddressResult.getStatusCodeValue() != CommonConstant.EXTERNAL_SUCCESS_CODE || Objects.isNull(parseAddressResult.getBody())) {
        log.error("RestTemplate 請(qǐng)求騰訊地圖 parseAddressResult 失敗,{}", JsonUtils.objToJsonStr(parseAddressResult.getBody()));
        return tencentMapResult;
    }
    if (!parseAddressResult.getBody().getStatus().equals(CommonConstant.ZERO)) {
        log.error("調(diào)用騰訊地圖 parseAddressResult API 失敗,{}", JsonUtils.objToJsonStr(parseAddressResult.getBody()));
        return tencentMapResult;
    }
    Object data = parseAddressResult.getBody().getResult();
    BeanUtils.copyProperties(parseAddressResult.getBody(), tencentMapResult);
    TencentParseAddressResponse parseAddressResponse = JsonUtils.jsonStrToObj(JsonUtils.objToJsonStr(data), TencentParseAddressResponse.class);
    tencentMapResult.setResult(parseAddressResponse);
    return tencentMapResult;
}

逆地址解析接口

逆地址解析,官方文檔介紹:地址解析

逆地址解析返回結(jié)構(gòu)如下:

/**
 * @author vnjohn
 * @since 2023/7/23
 */
@Data
public class TencentParseInverseAddressResponse {
    @ApiModelProperty("詳細(xì)地址信息")
    private String address;

    @ApiModelProperty("所在定位")
    private TencentLocation location;

    @JsonProperty("address_components")
    private AddressComponent addressComponent;

    @JsonProperty("formatted_addresses")
    private FormattedAddress formattedAddress;

    @Data
    public static class FormattedAddress {
        @ApiModelProperty("推薦使用的地址描述,描述精確性較高")
        private String recommend;

        @ApiModelProperty("粗略位置描述")
        private String rough;
    }

    @Data
    public static class AddressComponent {
        @ApiModelProperty("省")
        private String province;

        @ApiModelProperty("市")
        private String city;

        @ApiModelProperty("區(qū)")
        private String district;

        @ApiModelProperty("街道")
        private String street;
    }

}

逆地址解析接口如何調(diào)用|處理的方法如下:

/**
 * 通過(guò)經(jīng)緯度解析當(dāng)前所在地址信息「逆地址解析」
 *
 * @param lng 經(jīng)度
 * @param lat 緯度
 * @return 解析好的地址信息
 */
public TencentMapResult<TencentParseInverseAddressResponse> parseInverseAddress(Double lng, Double lat) {
    TencentMapResult<TencentParseInverseAddressResponse> tencentMapResult = new TencentMapResult<>();
    // 拼接請(qǐng)求參數(shù)
    String parseInverseAddressRequestUrl = String.format(TencentMapConfig.PARSE_INVERSE_ADDRESS, tencentMapKey, lat, lng);
    ResponseEntity<TencentMapResult> parseInverseAddressResult = RestTemplateUtils.get(parseInverseAddressRequestUrl, TencentMapResult.class);
    // RestTemplate 請(qǐng)求未處理成功
    if (parseInverseAddressResult.getStatusCodeValue() != CommonConstant.EXTERNAL_SUCCESS_CODE || Objects.isNull(parseInverseAddressResult.getBody())) {
        log.error("RestTemplate 請(qǐng)求騰訊地圖 parseInverseAddress 失敗,{}", JsonUtils.objToJsonStr(parseInverseAddressResult.getBody()));
        return tencentMapResult;
    }
    if (!parseInverseAddressResult.getBody().getStatus().equals(CommonConstant.ZERO)) {
        log.error("調(diào)用騰訊地圖 parseInverseAddress API 失敗,{}", JsonUtils.objToJsonStr(parseInverseAddressResult.getBody()));
        return tencentMapResult;
    }
    Object data = parseInverseAddressResult.getBody().getResult();
    BeanUtils.copyProperties(parseInverseAddressResult.getBody(), tencentMapResult);
    TencentParseInverseAddressResponse parseInverseAddressResponse = JsonUtils.jsonStrToObj(JsonUtils.objToJsonStr(data), TencentParseInverseAddressResponse.class);
    tencentMapResult.setResult(parseInverseAddressResponse);
    return tencentMapResult;
}

關(guān)鍵字輸入提示接口

關(guān)鍵字輸入提示,官方文檔介紹:關(guān)鍵字輸入提示

關(guān)鍵字輸入提示返回結(jié)構(gòu)如下:

/**
 * 關(guān)鍵字輸入提示響應(yīng)內(nèi)容
 *
 * @author vnjohn
 * @since 2023/7/23
 */
@Data
public class TencentPlaceTipsResponse implements Serializable {
    private static final long serialVersionUID = -3155685021522526885L;

    @ApiModelProperty("提示文字")
    private String title;

    @ApiModelProperty("地址")
    private String address;

    @ApiModelProperty("省")
    private String province;

    @ApiModelProperty("市")
    private String city;

    @ApiModelProperty("區(qū)")
    private String district;

    @ApiModelProperty("所在定位")
    private TencentLocation location;

}

關(guān)鍵字輸入提示接口如何調(diào)用|處理的方法如下:

/**
 * 關(guān)鍵字輸入提示,獲取可見(jiàn)提示內(nèi)容
 *
 * @param keyword 關(guān)鍵字
 * @param page    頁(yè)碼
 * @param size    條數(shù)
 */
public TencentMapResult<List<TencentPlaceTipsResponse>> placeTips(String keyword, Double lng, Double lat, Integer page, Integer size) {
    TencentMapResult<List<TencentPlaceTipsResponse>> tencentMapResult = new TencentMapResult<>();
    // 拼接請(qǐng)求參數(shù)
    String placeTipsRequestUrl = String.format(TencentMapConfig.PLACE_TIPS, tencentMapKey, keyword, page, size, lat, lng);
    ResponseEntity<TencentMapResult> placeTipsResult = RestTemplateUtils.get(placeTipsRequestUrl, TencentMapResult.class);
    // RestTemplate 請(qǐng)求未處理成功
    if (placeTipsResult.getStatusCodeValue() != CommonConstant.EXTERNAL_SUCCESS_CODE || Objects.isNull(placeTipsResult.getBody())) {
        log.error("RestTemplate 請(qǐng)求騰訊地圖 placeTips 失敗,{}", JsonUtils.objToJsonStr(placeTipsResult.getBody()));
        return tencentMapResult;
    }
    if (!placeTipsResult.getBody().getStatus().equals(CommonConstant.ZERO)) {
        log.error("調(diào)用騰訊地圖 placeTips API 失敗,{}", JsonUtils.objToJsonStr(placeTipsResult.getBody()));
        return tencentMapResult;
    }
    Object data = placeTipsResult.getBody().getData();
    BeanUtils.copyProperties(placeTipsResult.getBody(), tencentMapResult);
    List<TencentPlaceTipsResponse> tencentPlaceTipsList = JsonUtils.jsonStrToList(JsonUtils.objToJsonStr(data), TencentPlaceTipsResponse.class);
    tencentMapResult.setData(tencentPlaceTipsList);
    return tencentMapResult;
}

總結(jié)

該篇博文簡(jiǎn)單了介紹地理位置解析在我們實(shí)際開(kāi)發(fā)中的應(yīng)用,在配置管理中告知了如何一步步進(jìn)行注冊(cè)以及配置相關(guān)的產(chǎn)品信息,在地理位置解析中將博主自身運(yùn)用地理位置服務(wù)時(shí),所實(shí)現(xiàn)的部分相關(guān)源碼告知大家如何運(yùn)用封裝及抽象的特性將你的代碼構(gòu)建的更好更優(yōu),最后,通過(guò)實(shí)際工作中經(jīng)常會(huì)運(yùn)用到四種接口來(lái)作了一層層的剝離及代碼實(shí)戰(zhàn),希望能夠得到你的支持+喜歡,再次感謝您能支持此文章!

??????愿你我都能夠在寒冬中相互取暖,互相成長(zhǎng),只有不斷積累、沉淀自己,后面有機(jī)會(huì)自然能破冰而行!

博文放在 業(yè)務(wù)設(shè)計(jì) 專(zhuān)欄里,歡迎訂閱,會(huì)持續(xù)更新!

如果覺(jué)得博文不錯(cuò),關(guān)注我 vnjohn,后續(xù)會(huì)有更多實(shí)戰(zhàn)、源碼、架構(gòu)干貨分享!

推薦專(zhuān)欄:Spring、MySQL,訂閱一波不再迷路

大家的「關(guān)注?? + 點(diǎn)贊?? + 收藏?」就是我創(chuàng)作的最大動(dòng)力!謝謝大家的支持,我們下文見(jiàn)!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-713113.html

到了這里,關(guān)于引領(lǐng)位置服務(wù)驅(qū)動(dòng):騰訊地圖 WebService 服務(wù)端 API 實(shí)用指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包