调用高德的接口,地理位置和经纬度相互转换

高德官方有详细的接口调用文档:http://lbs.amap.com/api/webservice/guide/api/georegeo

我是在java项目中使用,下面以地理位置得到经纬度来举例。

首先,你需要注册高德的账号,并且获取一个key:http://lbs.amap.com/dev/key/app;

package com.yangfong.task.service;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.MutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.log4j.Logger;

import com.dz.utils.HttpclientUtil;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class AddressLngLatExchange {
	
	//写到配置文件中
	private static final String KEY = "123456789satawetfbsdrtsg4ts4y46";
	private static final String OUTPUT = "JSON";
	private static final String GET_LNG_LAT_URL = "http://restapi.amap.com/v3/geocode/geo";
	private static final String GET_ADDR_FROM_LNG_LAT = "http://restapi.amap.com/v3/geocode/regeo";
	private static final String EXTENSIONS_ALL = "all";
	
	private static final Logger LOGGER = Logger.getLogger(AddressLngLatExchange.class);
	/**
	 * 
	 * @description 根据传进来的一个地址,查询对应的经纬度
	 * @param 
	 * @return Pair 左节点值为经度,右节点值为纬度
	 * @author jxp
	 * @date 2017年7月12日
	 */
	public static Pair getLngLatFromOneAddr(String address) {

		if (StringUtils.isBlank(address)) {
			LOGGER.error("地址(" + address + ")为null或者空");
			return null;
		}

		Map params = new HashMap();
		params.put("address", address);
		params.put("output", OUTPUT);
		params.put("key", KEY);

		String result = HttpclientUtil.post(params, GET_LNG_LAT_URL);
		Pair pair = null;

		// 解析返回的xml格式的字符串result,从中拿到经纬度
		// 调用高德API,拿到json格式的字符串结果
		JSONObject jsonObject = JSONObject.fromObject(result);
		// 拿到返回报文的status值,高德的该接口返回值有两个:0-请求失败,1-请求成功;
		int status = Integer.valueOf(jsonObject.getString("status"));

		if (status == 1) {
			JSONArray jsonArray = jsonObject.getJSONArray("geocodes");
			for (int i = 0; i < jsonArray.size(); i++) {
				JSONObject json = jsonArray.getJSONObject(i);
				String lngLat = json.getString("location");
				String[] lngLatArr = lngLat.split(",");
				// 经度
				BigDecimal longitude = new BigDecimal(lngLatArr[0]);
				// System.out.println("经度" + longitude);
				// 纬度
				BigDecimal latitude = new BigDecimal(lngLatArr[1]);
				// System.out.println("纬度" + latitude);
				pair = new MutablePair(longitude, latitude);
			}

		} else {
			String errorMsg = jsonObject.getString("info");
			LOGGER.error("地址(" + address + ")" + errorMsg);
		}

		return pair;
	}
	
	
	/**
	 * 
	 * @description 根据经纬度查地址
	 * @param lng:经度,lat:纬度
	 * @return 地址
	 * @author jxp
	 * @date 2017年7月12日
	 */
	public static String getAddrFromLngLat(String lng, String lat) {
		Map params = new HashMap();
		params.put("location", lng + "," + lat);
		params.put("output", OUTPUT);
		params.put("key", KEY);
		params.put("extensions", EXTENSIONS_ALL);
		String result = HttpclientUtil.post(params, GET_ADDR_FROM_LNG_LAT);
		JSONObject json = JSONObject.fromObject(result);
		String status = json.getString("status");
		String address = null;
		if ("1".equals(status)) {
			JSONObject regeocode = JSONObject.fromObject(json.get("regeocode"));
			address = regeocode.getString("formatted_address");
		}
		return address;
	}
}

备注:1)此处用Pair类型返回值,只是个人偏好,这种返回方式无法返回高德的错误信息,不过在试验过程中,发现就算是胡乱写的地址,高德也会返回OK,只是经纬度为空,可能高德的错误信息指的是高德的程序异常,所以返回不OK的概率就比较小了,顾在此处仅记录在日志里。

2)HTTP的工具类可以在网上找,给一个参考的:http://lxy19791111.iteye.com/blog/341409

3)如有需要改进的地方,欢迎指正

你可能感兴趣的:(其他)