高德地图地址解析经纬度以及经纬度解析地址

简述:通过地址解析出经纬度,以及根据经纬度解析出地址。

官方文档: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;
    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值