登录高德开放平台,成为开发者,这个过程需要绑定邮箱。

成功后进入控制台。点击应用管理。并创建新应用。应用名称都可以自己看着填。

成功后就可以添加key了,当然,也要有名称等信息。

------------------到这里完成了第一步,你可以通过高德给你的key来调用地图API了。

接下来,如何调用呢?

在高德官网的开发文档中有详细的教程,但是我献上我项目的调用经验代码给新手:

1:创建一个工具类MapUtil,导入一些需要的包:

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.collections.MapUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;

2:定义你在高德官网获取的key

private static String key = "xxxxxxxxxxxxxxxxxxxxxxxxx";

3:接下来,是主角了,api如下:

/**
 * 阿里云api 根据经纬度获取地址
 *
 * @param log
 * @param lat
 * @return
 */
public static String getAdd(String log, String lat) {
    StringBuffer s = new StringBuffer();
    s.append("key=").append(key).append("&location=").append(log).append(",").append(lat);
    String res = sendPost("http://restapi.amap.com/v3/geocode/regeo", s.toString());
    logger.info(res);
    JSONObject jsonObject = JSONObject.fromObject(res);
    JSONObject jsonObject1 = JSONObject.fromObject(jsonObject.get("regeocode"));
    String add = jsonObject1.get("formatted_address").toString();
    return add;
}

/**
 * 阿里云api 根据经纬度获取所在城市
 *
 * @param log
 * @param lat
 * @return
 */
public static String getCity(String log, String lat) {
    // log 大 lat 小
    // 参数解释: 纬度,经度 type 001 (100代表道路,010代表POI,001代表门址,111可以同时显示前三项)
    String urlString = "http://gc.ditu.aliyun.com/regeocoding?l=" + lat + "," + log + "&type=010";
    String res = "";
    try {
        URL url = new URL(urlString);
        java.net.HttpURLConnection conn = (java.net.HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setRequestMethod("POST");
        java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(conn.getInputStream
                (), "UTF-8"));
        String line;
        while ((line = in.readLine()) != null) {
            res += line + "\n";
        }
        in.close();
        JSONObject jsonObject = JSONObject.fromObject(res);
        JSONArray jsonArray = JSONArray.fromObject(jsonObject.getString("addrList"));
        JSONObject j_2 = JSONObject.fromObject(jsonArray.get(0));
        String allAdd = j_2.getString("admName");
        String arr[] = allAdd.split(",");
        res = arr[1];
    } catch (Exception e) {
        logger.info("error in wapaction,and e is " + e.getMessage());
    }
    logger.info(res);
    return res;
}

/**
 * 高德api 根据地址获取经纬度
 *
 * @param name
 * @return
 */
public static String getLatAndLogByName(String name) {
    StringBuffer s = new StringBuffer();
    s.append("key=" + key + "&address=" + name);
    String res = sendPost("http://restapi.amap.com/v3/geocode/geo", s.toString());
    logger.info(res);
    JSONObject jsonObject = JSONObject.fromObject(res);
    JSONArray jsonArray = JSONArray.fromObject(jsonObject.getString("geocodes"));
    JSONObject location = (JSONObject) jsonArray.get(0);
    String add = location.get("location").toString();
    return add;
}

/**
 * 高德api 根据地址获取经纬度
 *
 * @param name
 * @return
 */
public static String getAddByAMAP(String log, String lat) {
    StringBuffer s = new StringBuffer();
    s.append("key=").append(key).append("&location=").append(log).append(",").append(lat);
    String res = sendPost("http://restapi.amap.com/v3/geocode/regeo", s.toString());
    logger.info(res);
    JSONObject jsonObject = JSONObject.fromObject(res);
    JSONObject jsonObject1 = JSONObject.fromObject(jsonObject.get("regeocode"));
    String add = jsonObject1.get("formatted_address").toString();
    return add;
}


/**
 * 高德api 坐标转换---转换至高德经纬度
 *
 * @param name
 * @return
 */
public static String convertLocations(String log, String lat, String type) {
    StringBuffer s = new StringBuffer();
    s.append("key=").append(key).append("&locations=").append(log).append(",").append(lat).append("&coordsys=");
    if (type == null) {
        s.append("gps");
    } else {
        s.append(type);
    }
    String res = sendPost("http://restapi.amap.com/v3/assistant/coordinate/convert", s.toString());
    logger.info(res);
    JSONObject jsonObject = JSONObject.fromObject(res);
    String add = jsonObject.get("locations").toString();
    return add;
}


public static String getAddByName(String name) {
    // log 大 lat 小
    // 参数解释: 纬度,经度 type 001 (100代表道路,010代表POI,001代表门址,111可以同时显示前三项)
    String urlString = "http://gc.ditu.aliyun.com/geocoding?a=" + name;
    String res = "";
    try {
        URL url = new URL(urlString);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setDoOutput(true);
        conn.setRequestMethod("POST");
        BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
        String line;
        while ((line = in.readLine()) != null) {
            res += line + "\n";
        }
        in.close();
        JSONObject jsonObject = JSONObject.fromObject(res);
        String lon = jsonObject.getString("lon");
        String lat = jsonObject.getString("lat");
        System.err.println(jsonObject);
        res = getNearbyAdd(lon, lat);
    } catch (Exception e) {
        logger.info("error in wapaction,and e is " + e.getMessage());
        e.printStackTrace();
    }
    return res;
}

public static String getNearbyAdd(String log, String lat) {

    String add = sendGet("http://ditu.amap.com/service/regeo", "longitude=" + log + "&latitude=" + lat +
            "&type=010");

    logger.info(add);

    return add;
}

/**
 * 高德api 关键字模糊查询
 *
 * @param keyWord
 * @param city
 * @return
 */
public static String getKeywordsAddByLbs(String keyWord, String city) {
    StringBuffer s = new StringBuffer();
    s.append("key=" + key + "&keywords=");
    if (keyWord.contains(" ")) {
        String[] str = keyWord.split(" ");
        for (int i = 0; i < str.length; i++) {
            if (i == 0) {
                s.append(str[i]);
            } else {
                s.append("+" + str[i]);
            }

        }
    } else {
        s.append(keyWord);
    }
    s.append("&city=" + city);
    s.append("offset=10&page=1");
    String around = sendPost("http://restapi.amap.com/v3/place/text", s.toString());
    logger.info(around);
    return around;
}

/**
 * 高德api 经纬度/关键字 附近地标建筑及地点查询
 *
 * @param log
 * @param lat
 * @param keyWord
 * @return
 */
public static String getAroundAddByLbs(String log, String lat, String keyWord) {
    String around = sendPost("http://restapi.amap.com/v3/place/around",
            "key=" + key + "&location=" + log + "," + lat + "&keywords=" + keyWord +
                    "&radius=2000&offset=10&page=1");
    logger.info(around);
    return around;
}

4:到了这里,你还需要一些调用所需的工具方法,我页直接帮你整合在下面:

public static String sendGet(String url, String param) {
    String result = "";
    BufferedReader in = null;
    try {
        String urlNameString = url + "?" + param;
        URL realUrl = new URL(urlNameString);
        // 打开和URL之间的连接
        URLConnection connection = realUrl.openConnection();
        // 设置通用的请求属性
        connection.setRequestProperty("accept", "*/*");
        connection.setRequestProperty("connection", "Keep-Alive");
        connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
        // 建立实际的连接
        connection.connect();
        // 获取所有响应头字段
        Map<String, List<String>> map = connection.getHeaderFields();
        // 遍历所有的响应头字段
        for (String key : map.keySet()) {
            logger.info(key + "--->" + map.get(key));
        }
        // 定义 BufferedReader输入流来读取URL的响应
        in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
        String line;
        while ((line = in.readLine()) != null) {
            result += line;
        }
    } catch (Exception e) {
        logger.info("发送GET请求出现异常!" + e);
        e.printStackTrace();
    }
    // 使用finally块来关闭输入流
    finally {
        try {
            if (in != null) {
                in.close();
            }
        } catch (Exception e2) {
            e2.printStackTrace();
        }
    }
    return result;
}

/**
 * 向指定 URL 发送POST方法的请求
 *
 * @param url   发送请求的 URL
 * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
 * @return 所代表远程资源的响应结果
 */
public static String sendPost(String url, String param) {
    PrintWriter out = null;
    BufferedReader in = null;
    String result = "";
    try {
        URL realUrl = new URL(url);
        // 打开和URL之间的连接
        URLConnection conn = realUrl.openConnection();
        // 设置通用的请求属性
        conn.setRequestProperty("accept", "*/*");
        conn.setRequestProperty("connection", "Keep-Alive");
        conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
        // 发送POST请求必须设置如下两行
        conn.setDoOutput(true);
        conn.setDoInput(true);
        // 获取URLConnection对象对应的输出流
        out = new PrintWriter(conn.getOutputStream());
        // 发送请求参数
        out.print(param);
        // flush输出流的缓冲
        out.flush();
        // 定义BufferedReader输入流来读取URL的响应
        in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String line;
        while ((line = in.readLine()) != null) {
            result += line;
        }
    } catch (Exception e) {
        logger.info("发送 POST 请求出现异常!" + e);
        e.printStackTrace();
    }
    // 使用finally块来关闭输出流、输入流
    finally {
        try {
            if (out != null) {
                out.close();
            }
            if (in != null) {
                in.close();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    return result;
}

/**
 * GET请求数据
 *
 * @param get_url url地址
 * @param content key=value形式
 * @return 返回结果
 * @throws Exception
 */
public static String sendGetData(String get_url, String content) throws Exception {
    String result = "";
    URL getUrl = null;
    BufferedReader reader = null;
    String lines = "";
    HttpURLConnection connection = null;
    try {
        if (content != null && !content.equals(""))
            get_url = get_url + "?" + content;
        // get_url = get_url + "?" + URLEncoder.encode(content, "utf-8");
        getUrl = new URL(get_url);
        connection = (HttpURLConnection) getUrl.openConnection();
        connection.connect();
        // 取得输入流,并使用Reader读取
        reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));// 设置编码
        while ((lines = reader.readLine()) != null) {
            result = result + lines;
        }
        return result;
    } catch (Exception e) {
        throw e;
    } finally {
        if (reader != null) {
            reader.close();
            reader = null;
        }
        connection.disconnect();
    }
}

/**
 * @param POST_URL url地址
 * @param content  key=value形式
 * @return 返回结果
 * @throws Exception
 */
public static String sendPostData(String POST_URL, String content) throws Exception {
    HttpURLConnection connection = null;
    DataOutputStream out = null;
    BufferedReader reader = null;
    String line = "";
    String result = "";
    try {
        URL postUrl = new URL(POST_URL);
        connection = (HttpURLConnection) postUrl.openConnection();
        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setRequestMethod("POST");
        // Post 请求不能使用缓存
        connection.setUseCaches(false);
        connection.setInstanceFollowRedirects(true);
        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        connection.connect();

        out = new DataOutputStream(connection.getOutputStream());
        // content = URLEncoder.encode(content, "utf-8");
        // DataOutputStream.writeBytes将字符串中的16位的unicode字符�?8位的字符形式写道流里�?
        out.writeBytes(content);
        out.flush();
        out.close();
        // 获取结果
        reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));// 设置编码
        while ((line = reader.readLine()) != null) {
            result = result + line;
        }
        return result;
    } catch (Exception e) {
        throw e;
    } finally {
        if (out != null) {
            out.close();
            out = null;
        }
        if (reader != null) {
            reader.close();
            reader = null;
        }
        connection.disconnect();
    }
}

/*
 * 过滤掉html里不安全的标签,不允许用户输入这些标�?
 */
public static String htmlFilter(String inputString) {
    // return inputString;
    String htmlStr = inputString; // 含html标签的字符串
    String textStr = "";
    java.util.regex.Pattern p_script;
    java.util.regex.Matcher m_script;

    try {
        String regEx_script = "<[\\s]*?(script|style)[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?(script|style)[\\s]*?>";
        String regEx_onevent = "on[^\\s]+=\\s*";
        String regEx_hrefjs = "href=javascript:";
        String regEx_iframe = "<[\\s]*?(iframe|frameset)[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?(iframe|frameset)" +
                "[\\s]*?>";
        String regEx_link = "<[\\s]*?link[^>]*?/>";

        htmlStr = Pattern.compile(regEx_script, Pattern.CASE_INSENSITIVE).matcher(htmlStr).replaceAll("");
        htmlStr = Pattern.compile(regEx_onevent, Pattern.CASE_INSENSITIVE).matcher(htmlStr).replaceAll("");
        htmlStr = Pattern.compile(regEx_hrefjs, Pattern.CASE_INSENSITIVE).matcher(htmlStr).replaceAll("");
        htmlStr = Pattern.compile(regEx_iframe, Pattern.CASE_INSENSITIVE).matcher(htmlStr).replaceAll("");
        htmlStr = Pattern.compile(regEx_link, Pattern.CASE_INSENSITIVE).matcher(htmlStr).replaceAll("");

        textStr = htmlStr;

    } catch (Exception e) {
        System.err.println("Html2Text: " + e.getMessage());
    }

    return textStr;
}

5:开始你的奇幻之旅吧!