简述:通过地址解析出经纬度,以及根据经纬度解析出地址。
官方文档:https://lbs.amap.com/api/webservice/guide/api/georegeo
具体实现步骤:
1、 申请Web服务API类型Key ;
申请完key之后在yml配置文件中配置key
map:
key: 申请的key
2、注入key以及url服务地址:
@Component
@Data
public class MapClientProperties {
@Value("${map.key:key}")
private String key;
@Value("${map.geo-url:https://restapi.amap.com/v3/geocode/geo?parameters}")
private String geoUrl;
@Value("${map.re-geo-url:https://restapi.amap.com/v3/geocode/regeo?parameters}")
private String reGeoUrl;
}
3、书写返回的vo类
/**
* 地址解析经纬度
*/
@Data
public class LocationVo {
/**
* @Date: 2021/5/10
* @描述: 纬度
*/
private BigDecimal lat;
/**
* @Date: 2021/5/10
* @描述: 经度
*/
private BigDecimal lng;
public LocationVo() {
}
public LocationVo(BigDecimal lng, BigDecimal lat) {
this.lng = lng;
this.lat = lat;
}
}
/**
* 经纬度解析地址
*/
@Data
public class AddressComponentsVo {
/**
* @Date: 2021/5/18
* @描述: 国家
*/
private String country;
/**
* @Date: 2021/5/18
* @描述: 省
*/
private String province;
/**
* @Date: 2021/5/18
* @描述: 市
*/
private String city;
/**
* @Date: 2021/5/18
* @描述: 区,可能为空字串
*/
private String district;
/**
* @Date: 2021/5/18
* @描述: 街道,可能为空字串
*/
private String township;
}
/**
* 精密位置
*/
@Data
public class AddressRecommendVo {
private String formattedAddress;
}
/**
* 经纬度解析地址
*/
@Data
public class ReGeocodeVo {
/**
* @Date: 2021/5/27
* @描述: 地址部件,address不满足需求时可自行拼接
*/
private AddressComponentsVo addressComponent;
/**
* @Date: 2021/5/27
* @描述: 结合知名地点形成的描述性地址,更具人性化特点
*/
private String formattedAddress;
}
/**
* 高德地图地址解析经纬度下级回调信息
*/
@Data
public class GeocodesVo {
private String formattedAddress;
private String country;
private String province;
private String city;
private String district;
private String location;
}
/**
* 公共回调信息
*/
@Data
public class ResultVo {
private String status;
private String info;
private String infocode;
private String count;
}
/**
*
*/
@Data
public class GeoVo extends ResultVo {
private List<GeocodesVo> geocodes;
}
/**
* 高德地图经纬度解析回调
*/
@Data
public class ReGeoVo extends ResultVo {
private ReGeocodeVo regeocode;
}
4、书写控制层
/**
* 地址解析经纬度/经纬度解析地址
*/
@Api(tags = "地址解析经纬度/经纬度解析地址")
@RestController
@RequestMapping("/map")
public class MapClientController {
@Autowired
private MapClientService mapClientService;
/**
* 地址解析经纬度
* @param address 地址信息
* @return
*/
@ApiOperation("地址解析经纬度")
@PostMapping("/resolution")
public Result addressResolution(String address) {
LocationVo locationVo = mapClientService.addressResolution(address);
return Result.successResult(locationVo);
}
/**
* 经纬度解析地址
* @param lat 纬度
* @param lng 经度
* @return
*/
@ApiOperation("经纬度解析地址")
@PostMapping("/resolutionAddress")
public Result locationResolution(String lat, String lng) {
String componentsVo = mapClientService.gdLocationResolution(lat, lng);
return Result.successResult(componentsVo);
}
}
5、书写接口
/**
* 接口
*/
public interface MapClientService {
/**
* 地址解析经纬度
* @param address 地址信息
* @return
*/
LocationVo addressResolution(String address);
/**
* 经纬度解析地址
* @param lat 纬度
* @param lng 经度
* @return
*/
String locationResolution(String lat, String lng);
}
6、书写接口实现类
/**
* 接口实现类
*/
@Service
public class MapClientServiceImpl implements MapClientService {
@Autowired
MapClientProperties mapClientProperties;
/**
* 地址解析经纬度
* @param address 地址信息
* @return
*/
@Override
public LocationVo addressResolution(String address) {
HashMap<String, Object> map = new HashMap<>();
map.put("key", mapClientProperties.getKey());
map.put("address", address);
String s = HttpUtil.get(mapClientProperties.getGeoUrl(), map);
GeoVo geoVo = JSONUtil.toBean(s, GeoVo.class);
if ("10000".equals(geoVo.getInfocode()) && Integer.parseInt(geoVo.getCount()) > 0) {
GeocodesVo geocodesVo = geoVo.getGeocodes().get(0);
String[] location = geocodesVo.getLocation().split(",");
System.err.println(location[0]);
return new LocationVo(new BigDecimal(location[0]), new BigDecimal(location[1]));
}
ResultException.throwResultException(geoVo.getInfo());
return null;
}
/**
* 经纬度解析地址
* @param lat 纬度
* @param lng 经度
* @return
*/
@Override
public ReGeocodeVo locationResolution(String lat, String lng) {
HashMap<String, Object> map = new HashMap<>();
map.put("key", mapClientProperties.getKey());
map.put("location", StrUtil.concat(false, lng, ",", lat));
String s = HttpUtil.get(mapClientProperties.getReGeoUrl(), map);
ReGeoVo reGeoVo = JSONUtil.toBean(s, ReGeoVo.class);
if ("10000".equals(reGeoVo.getInfocode())) {
return reGeoVo.getRegeocode();
}
ResultException.throwResultException(reGeoVo.getInfo());
return null;
}
}