116 lines
3.9 KiB
Java
116 lines
3.9 KiB
Java
package com.cdzy.ebikemaintenance.utils;
|
|
|
|
import com.alibaba.fastjson2.JSONObject;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import okhttp3.OkHttpClient;
|
|
import okhttp3.Request;
|
|
import okhttp3.Response;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import java.io.IOException;
|
|
import java.util.Arrays;
|
|
|
|
/**
|
|
* 地址解析、反解析工具类。
|
|
*
|
|
* @author dingchao
|
|
* @date 2025/4/3
|
|
* @modified by:
|
|
*/
|
|
@Slf4j
|
|
@Service
|
|
public class GeoCodingUtil {
|
|
private final static String LOCATION_TO_ADDRESS = "location";
|
|
private final static String ADDRESS_TO_LOCATION = "address";
|
|
|
|
private final String url;
|
|
private final String accessKey;
|
|
private final OkHttpClient client;
|
|
|
|
/**
|
|
* 地理编码工具类构造函数。
|
|
* 目前实现的腾讯地图webservice
|
|
*
|
|
* @param apiUrl
|
|
* @param accessKey
|
|
*/
|
|
public GeoCodingUtil(String apiUrl, String accessKey) {
|
|
this.url = apiUrl;
|
|
this.accessKey = accessKey;
|
|
this.client = new OkHttpClient();
|
|
}
|
|
|
|
/**
|
|
* 输入经纬度,返回地址。
|
|
*
|
|
* @param location 经纬度
|
|
* @return 地址
|
|
*/
|
|
public String getLocationToaddress(JSONObject location) {
|
|
Request request = new Request.Builder()
|
|
.url(url + "/?"+LOCATION_TO_ADDRESS+"=" + String.format("%f,%f", location.getDouble("lat"), location.getDouble("lng")) + "&key=" + accessKey)
|
|
.build();
|
|
try(Response response = client.newCall(request).execute()) {
|
|
if(response.isSuccessful()) {
|
|
if (response.body()!= null) {
|
|
String result = response.body().string();
|
|
JSONObject jsonObject = JSONObject.parseObject(result);
|
|
if (jsonObject.getInteger("status") == 0) {
|
|
return jsonObject.getJSONObject("result").getJSONObject("formatted_addresses").getString("standard_address");
|
|
}
|
|
logError("地址解析失败==>{}", jsonObject.getString("message"));
|
|
return null;
|
|
}
|
|
logError("地址解析失败==>{}", response.message());
|
|
return null;
|
|
}
|
|
logError("地址解析失败==>{}", response.message());
|
|
return null;
|
|
} catch (Exception e) {
|
|
logError("地址解析失败==>{}", e.getMessage() + Arrays.toString(e.getStackTrace()));
|
|
return null;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 输入地址,返回经纬度(GCJ02)。
|
|
*
|
|
* @param address 地址
|
|
* @return 经纬度
|
|
*/
|
|
public JSONObject getAddressToLocation(String address) {
|
|
Request request = new Request.Builder()
|
|
.url(url + "/?"+ADDRESS_TO_LOCATION+"=" + address + "&key=" + accessKey)
|
|
.build();
|
|
try(Response response = client.newCall(request).execute()) {
|
|
if(response.isSuccessful()) {
|
|
if (response.body() != null) {
|
|
String result = response.body().string();
|
|
JSONObject jsonObject = JSONObject.parseObject(result);
|
|
if (jsonObject.getInteger("status") == 0) {
|
|
return jsonObject.getJSONObject("result").getJSONObject("location");
|
|
}else{
|
|
logError("位置解析失败==>{}", jsonObject.getString("message"));
|
|
return null;
|
|
}
|
|
}else{
|
|
logError("位置解析失败==>{}", response.message());
|
|
return null;
|
|
}
|
|
}else{
|
|
logError("位置解析失败==>{}", response.message());
|
|
return null;
|
|
}
|
|
} catch (Exception e) {
|
|
logError("位置解析失败==>{}", e.getMessage() + Arrays.toString(e.getStackTrace()));
|
|
return null;
|
|
}
|
|
}
|
|
|
|
|
|
private void logError(String errDesc, String errorMessage) {
|
|
log.error(errDesc, errorMessage);
|
|
}
|
|
}
|