Java를 사용하여 Baidu 인터페이스를 호출하여 두 위치 사이의 거리를 얻는 방법은 무엇입니까?
요구 사항: 배송 주소가 배송 범위 밖인지 확인
중요:
이 요구 사항의 아이디어는 판매자와 판매자의 특정 주소 정보를 통해 경도와 위도를 얻는 것입니다. "지오코딩 서비스"를 사용하면 해당 경도와 위도를 얻을 수 있습니다. 두 번째 단계는 Baidu 인터페이스의 요구 사항에 따라 둘의 경도와 위도를 보내는 것이며 둘 사이의 거리가 포함된 JSON 문자열을 얻을 수 있습니다. 이때 JSON을 파싱하면 거리를 알 수 있습니다. 마지막으로 거리를 판단한 후 자신이 배송한 거리와 비교하여 거리가 초과되었는지 판단할 수 있습니다
애플리케이션 생성 시:이를 위해 요구 사항에 따라 두 개의 Baidu 인터페이스가 사용됩니다. 지오코딩 서비스: https://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocodinghttps://lbsyun .baidu.com/index.php?title=webapi/directionlite-v1코드 작성:1. 기본 속성 구성유형: 서버 선택
IP 화이트리스트: 0.0.0.0/0
sky: baidumap: shop-address: 北京市西城区广安门内大街167号翔达大厦1层 ak: XXXXXXXXXXXXXXXXXXXXXXXXXX default-distance: 5000 // 这里在本文中没有使用,
이제 요청을 보내야 하기 때문입니다. 서버에서 이 기능을 구현하려면 작은 프레임워크인 HttpClient를 사용해야 합니다. 다음 도구 클래스는 이 프레임워크를 캡슐화한 것입니다주소의 경도 및 위도 정보를 저장하는 위치 클래스를 정의하세요package com.sky.utils; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.apache.http.NameValuePair; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.utils.URIBuilder; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Service; import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * Http工具类 */ @Slf4j public class HttpClientUtil { static final int TIMEOUT_MSEC = 5 * 1000; /** * 发送GET方式请求 * * @param url * @param paramMap * @return */ public static String doGet(String url, Map<String, String> paramMap) { // 创建Httpclient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); String result = ""; CloseableHttpResponse response = null; try { URIBuilder builder = new URIBuilder(url); if (paramMap != null) { for (String key : paramMap.keySet()) { builder.addParameter(key, paramMap.get(key)); } } URI uri = builder.build(); log.info("发送的请求====>{}", uri); //创建GET请求 HttpGet httpGet = new HttpGet(uri); //发送请求 response = httpClient.execute(httpGet); //判断响应状态 if (response.getStatusLine().getStatusCode() == 200) { result = EntityUtils.toString(response.getEntity(), "UTF-8"); } } catch (Exception e) { e.printStackTrace(); } finally { try { response.close(); httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } return result; } /** * 发送POST方式请求 * * @param url * @param paramMap * @return * @throws IOException */ public static String doPost(String url, Map<String, String> paramMap) throws IOException { // 创建Httpclient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; String resultString = ""; try { // 创建Http Post请求 HttpPost httpPost = new HttpPost(url); // 创建参数列表 if (paramMap != null) { List<NameValuePair> paramList = new ArrayList(); for (Map.Entry<String, String> param : paramMap.entrySet()) { paramList.add(new BasicNameValuePair(param.getKey(), param.getValue())); } // 模拟表单 UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList); httpPost.setEntity(entity); } httpPost.setConfig(builderRequestConfig()); // 执行http请求 response = httpClient.execute(httpPost); resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); } catch (Exception e) { throw e; } finally { try { response.close(); } catch (IOException e) { e.printStackTrace(); } } return resultString; } /** * 发送POST方式请求 * * @param url * @param paramMap * @return * @throws IOException */ public static String doPost4Json(String url, Map<String, String> paramMap) throws IOException { // 创建Httpclient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); CloseableHttpResponse response = null; String resultString = ""; try { // 创建Http Post请求 HttpPost httpPost = new HttpPost(url); if (paramMap != null) { //构造json格式数据 JSONObject jsonObject = new JSONObject(); for (Map.Entry<String, String> param : paramMap.entrySet()) { jsonObject.put(param.getKey(), param.getValue()); } StringEntity entity = new StringEntity(jsonObject.toString(), "utf-8"); //设置请求编码 entity.setContentEncoding("utf-8"); //设置数据类型 entity.setContentType("application/json"); httpPost.setEntity(entity); } httpPost.setConfig(builderRequestConfig()); // 执行http请求 response = httpClient.execute(httpPost); resultString = EntityUtils.toString(response.getEntity(), "UTF-8"); } catch (Exception e) { throw e; } finally { try { response.close(); } catch (IOException e) { e.printStackTrace(); } } return resultString; } private static RequestConfig builderRequestConfig() { return RequestConfig.custom() .setConnectTimeout(TIMEOUT_MSEC) .setConnectionRequestTimeout(TIMEOUT_MSEC) .setSocketTimeout(TIMEOUT_MSEC).build(); } }로그인 후 복사
package com.sky.entity; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; /** * @author : Cookie * date : 2023/4/20 9:20 * explain : */ @Data @Builder @NoArgsConstructor @AllArgsConstructor public class Location { /** * 纬度值 */ private double lat; /** * 经度值 */ private double lng; }
참고: 도구 모음이 있기 때문에 제가 작성한 내용에 부적절한 내용이 많이 있을 수 있습니다. , 지적해 주세요그리고 일부 예외 클래스도 사용자 정의되어 있습니다. 그렇지 않은 경우 RuntimeException이때 도구 클래스를 호출하여 전달하면 됩니다.package com.sky.utils; import com.sky.entity.Location; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.json.JSONException; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Value; import java.util.HashMap; /** * @author : Cookie * date : 2023/4/19 23:10 * explain : */ @AllArgsConstructor @NoArgsConstructor @Data @Slf4j public class BaiduMapUtil { // 获取配置类中的值 @Value("${sky.baidumap.shop-address}") private String myShopAddress; @Value("${sky.baidumap.ak}") private String ak; /** * 获取经纬度 * * @param userAddress * @return */ public Location getLocation(String userAddress) { String URL = "https://api.map.baidu.com/geocoding/v3"; HashMap<String, String> map = new HashMap<>(); map.put("address", userAddress); map.put("output", "json"); map.put("ak", ak); String body = HttpClientUtil.doGet(URL, map); Location location = new Location(); try { JSONObject jsonObject = new JSONObject(body); // 获取Status String status = jsonObject.getString("status"); if ("0".equals(status)) { // 解析JSON JSONObject res = jsonObject.getJSONObject("result").getJSONObject("location"); // 获取经度 String lng = res.getString("lng"); Double transferLnf = Double.parseDouble(lng); location.setLng(transferLnf); // 获取纬度 String lat = res.getString("lat"); Double transferLat = Double.parseDouble(lat); location.setLat(transferLat); } else { // 如果没有返回排除异常交给全局异常处理 throw new RuntimeException("无权限"); } } catch (Exception e) { log.info("解析JSON异常,异常信息{}", e.getMessage()); } return location; } /** * 通过两个经纬度信息判断,返回距离信息 * * @return 二者的距离 */ public String getDistance(Location userLocation) { Location myShopLocation = getLocation(myShopAddress); // 起始位置, 即我的位置 String origin = myShopLocation.getLat() + "," + myShopLocation.getLng(); // 最终位置, 即终点 String destination = userLocation.getLat() + "," + userLocation.getLng(); String url = "https://api.map.baidu.com/directionlite/v1/riding"; // 发送Get请求 HashMap<String, String> map = new HashMap<>(); map.put("origin", origin); map.put("destination", destination); map.put("ak", ak); map.put("steps_info", "0"); String result = HttpClientUtil.doGet(url, map); String distance = null; try { JSONObject jsonObject = new JSONObject(result); distance = jsonObject.getJSONObject("result").getJSONArray("routes").getJSONObject(0).getString("distance"); } catch (JSONException e) { log.info("路径异常"); } log.info("二者距离{}", distance); return distance; } }로그인 후 복사메소드 둘 사이의 거리
userAddress
用户的地址, 因为商家的地址已经配置,此时就可以通过调用getDistance
위 내용은 Java를 사용하여 Baidu 인터페이스를 호출하여 두 위치 사이의 거리를 얻는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Java의 난수 생성기 안내. 여기서는 예제를 통해 Java의 함수와 예제를 통해 두 가지 다른 생성기에 대해 설명합니다.

Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다

Java의 TimeStamp to Date 안내. 여기서는 소개와 예제와 함께 Java에서 타임스탬프를 날짜로 변환하는 방법에 대해서도 설명합니다.
