?? 嗨,您好 ?? 我是 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)自官方文檔
從上圖可知,普通的接口 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)用
應(yīng)用是最大的承載能力,一個(gè)應(yīng)用下可以添加多個(gè)對(duì)應(yīng)的 Key,而應(yīng)用下所屬的 Key 才是我們服務(wù)端調(diào)用 API 必須要的能力
2、創(chuàng)建 Key
啟用產(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ī)的密鑰字符
4、點(diǎn)擊詳情,可查看具體分配的接口 API 調(diào)用額度信息
當(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,訂閱一波不再迷路文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-713113.html
大家的「關(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)!