Maison  >  Article  >  Java  >  Comment utiliser Java pour appeler l’interface Baidu afin d’obtenir la distance entre deux emplacements ?

Comment utiliser Java pour appeler l’interface Baidu afin d’obtenir la distance entre deux emplacements ?

王林
王林avant
2023-05-07 23:22:061723parcourir

Exigence : Vérifiez si l'adresse de livraison est en dehors de la plage de livraison

Important :
L'idée de cette exigence est d'obtenir la longitude et la latitude du vendeur et du vendeur grâce à leurs informations d'adresse spécifiques. À ce stade, vous pouvez utiliser celles de Baidu. "Service de géocodage" ", vous pouvez obtenir la longitude et la latitude correspondantes. La deuxième étape consiste à envoyer la longitude et la latitude des deux selon les exigences de l'interface Baidu, et vous pouvez obtenir la chaîne JSON contenant la distance entre les deux . À ce stade, vous pouvez obtenir la distance en analysant le JSON. Enfin, après avoir jugé la distance, comparez-la avec la distance de votre propre livraison, vous pouvez juger si la distance est dépassée

L'enregistrement d'un compte Baidu nécessite un nom réel. authentification et remplissage de quelques informations de base. Vous devez faire attention ici.

Tout d'abord, vous devez obtenir un AK de Baidu Map

Connectez-vous à la plateforme ouverte Baidu Map : https://lbsyun.baidu.com /

Entrez dans la console, créez une application et obtenez l'AK :

Comment utiliser Java pour appeler l’interface Baidu afin d’obtenir la distance entre deux emplacements ?

Comment utiliser Java pour appeler l’interface Baidu afin d’obtenir la distance entre deux emplacements ?

Lors de la création d'une application :

Type : Sélectionnez le serveur
Liste blanche IP : 0.0.0.0/0

Pour cela exigence, deux interfaces Baidu sont utilisées. Les adresses d'interface sont les suivantes :

Service de géocodage : https://lbsyun.baidu.com/index php?title=webapi/guide/webservice-geocoding

https://lbsyun. .baidu.com/index.php?title=webapi/directionlite-v1

Écriture de code :

1. Configurer les propriétés de base

sky:
  baidumap:
    shop-address: 北京市西城区广安门内大街167号翔达大厦1层
    ak: XXXXXXXXXXXXXXXXXXXXXXXXXX
    default-distance: 5000   // 这里在本文中没有使用,

Utiliser la description de la classe d'outils pour l'envoi de requêtes

Parce que maintenant nous devons envoyer des requêtes depuis le serveur, nous devons utiliser le petit framework HttpClient pour implémenter cette fonction. La classe d'outils suivante est une encapsulation de ce framework

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();
    }
}
Définissez une classe Location pour stocker les informations de longitude et de latitude de l'adresse

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;
}

Personnalisez un classe d'outils pour encapsuler la requête dans l'interface Baidu, afin qu'elle puisse être appelée directement dans la couche Service à l'avenir.

Remarque : parce que la barre d'outils est Il peut y avoir de nombreux endroits inappropriés dans ce que j'ai écrit si vous en trouvez. , veuillez les signaler

De plus, certaines classes d'exception sont également personnalisées. Sinon, remplacez-la simplement par 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;
    }
}
À ce stade, vous pouvez la transmettre en appelant la classe d'outils

Méthode pour obtenir la méthode. distance entre les deux.userAddress用户的地址, 因为商家的地址已经配置,此时就可以通过调用getDistance

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer