高德7java高德开放平台 | 高德地图API注册账号

 

 高德7java高德开放平台 | 高德地图API注册账号

https://blog.csdn.net/java_wucao/article/details/77800891

 

 

高德地图爬取杭州市全部的超市信息,放入mongodb的数据库中。做地理位置查询。(mongodb这部分有时间补上)

 

   首先去高德地图创建一个开发者账号,获取一个开发web服务的高德key.这个是必须要有的,可以用我这个从百度到的key试一下。

 

 废话不说了直接上代码

 

  1.  
    package com.pingogo.visit.service;
  2.  
     
  3.  
    import com.alibaba.fastjson.JSONArray;
  4.  
    import com.alibaba.fastjson.JSONObject;
  5.  
    import com.pingogo.api.common.HttpUtils;
  6.  
    import com.pingogo.visit.domain.Shop;
  7.  
    import jxl.Cell;
  8.  
    import jxl.Workbook;
  9.  
    import jxl.read.biff.BiffException;
  10.  
    import org.apache.commons.lang3.StringUtils;
  11.  
    import org.apache.poi.hssf.usermodel.HSSFCell;
  12.  
    import org.apache.poi.hssf.usermodel.HSSFRow;
  13.  
    import org.apache.poi.hssf.usermodel.HSSFSheet;
  14.  
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  15.  
    //import org.apache.poi.ss.usermodel.Workbook;
  16.  
    import org.slf4j.Logger;
  17.  
    import org.slf4j.LoggerFactory;
  18.  
     
  19.  
    import java.io.*;
  20.  
    import java.math.BigDecimal;
  21.  
    import java.util.ArrayList;
  22.  
    import java.util.HashMap;
  23.  
    import java.util.List;
  24.  
    import java.util.Map;
  25.  
     
  26.  
    /**
  27.  
    * Created by cw on 2017/8/29.
  28.  
    *
  29.  
    */
  30.  
    public class AddressLngLatExchange {
  31.  
    private static final String KEY = "389880a06e3f893ea46036f030c94700";
  32.  
    private static final String OUTPUT = "JSON";
  33.  
    private static final String GET_LNG_LAT_URL = "http://restapi.amap.com/v3/geocode/geo";
  34.  
     
  35.  
    private static final String GET_LNG_PIO_URL = "http://restapi.amap.com/v3/place/polygon";
  36.  
     
  37.  
    private static final Logger LOGGER = LoggerFactory.getLogger(AddressLngLatExchange.class);
  38.  
     
  39.  
     
  40.  
    //获取指定地点经纬度
  41.  
    public static String[] getLngLatFromOneAddr(String address){
  42.  
    if(StringUtils.isBlank(address)) {
  43.  
    LOGGER.error("地址(" + address + ")为null或者空");
  44.  
    return null;
  45.  
    }
  46.  
    Map<String, String> params = new HashMap<String, String>();
  47.  
    params.put("address", address);
  48.  
    params.put("output", OUTPUT);
  49.  
    params.put("key", KEY);
  50.  
    String result = HttpUtils.URLPost(GET_LNG_LAT_URL,params,"");
  51.  
    JSONObject jsonObject = JSONObject.parseObject(result);
  52.  
    String[] lngLatArr = new String[2];
  53.  
    //拿到返回报文的status值,高德的该接口返回值有两个:0-请求失败,1-请求成功;
  54.  
    int status = Integer.valueOf(jsonObject.getString("status"));
  55.  
    if(status == 1) {
  56.  
    JSONArray jsonArray = jsonObject.getJSONArray("geocodes");
  57.  
    for(int i = 0; i < jsonArray.size(); i++) {
  58.  
    JSONObject json = jsonArray.getJSONObject(i);
  59.  
    String lngLat = json.getString("location");
  60.  
    lngLatArr = lngLat.split(",");
  61.  
    }
  62.  
    } else {
  63.  
    String errorMsg = jsonObject.getString("info");
  64.  
    LOGGER.error("地址(" + address + ")" + errorMsg);
  65.  
    }
  66.  
    return lngLatArr;
  67.  
    }
  68.  
     
  69.  
    public static List<Shop> initialData(String lonLat, String keyword, List<Shop> shopListSon){
  70.  
    if(StringUtils.isBlank(keyword)) {
  71.  
    LOGGER.error("地址(" + keyword + ")为null或者空");
  72.  
    }
  73.  
    Map<String, String> params = new HashMap<String, String>();
  74.  
    try {
  75.  
    Thread.sleep(5000);
  76.  
    } catch (InterruptedException e1) {
  77.  
    e1.printStackTrace();
  78.  
    }
  79.  
    params.put("polygon", lonLat);//"118.21,29.11;120.30,30.33"
  80.  
    params.put("output", OUTPUT);
  81.  
    params.put("keywords", keyword);
  82.  
    params.put("offset", "20");
  83.  
    params.put("page", "1");
  84.  
    params.put("key", KEY);
  85.  
    String result = HttpUtils.URLGet(GET_LNG_PIO_URL,params,"UTF-8");
  86.  
    JSONObject jsonObject = JSONObject.parseObject(result);
  87.  
    int statusOne = Integer.valueOf(jsonObject.getString("status"));
  88.  
    //第一次获取数据时做的判断
  89.  
    if(statusOne==1){
  90.  
    int count=Integer.valueOf(jsonObject.getString("count"));
  91.  
    int pageNumber=count/20;
  92.  
    int remainder=count%20;
  93.  
    if(remainder>0)pageNumber=pageNumber+1;
  94.  
    for(int i=1;i<=pageNumber;i++){
  95.  
    params.put("page", String.valueOf(i));
  96.  
    result = HttpUtils.URLGet(GET_LNG_PIO_URL,params,"UTF-8");
  97.  
    JSONObject jsonObject2 = JSONObject.parseObject(result);
  98.  
    System.out.println("+++++++++"+result);
  99.  
    //拿到返回报文的status值,高德的该接口返回值有两个:0-请求失败,1-请求成功;
  100.  
    int status = Integer.valueOf(jsonObject2.getString("status"));
  101.  
    if(status == 1) {
  102.  
    JSONArray jsonArray = jsonObject2.getJSONArray("pois");
  103.  
    if(jsonArray.size()>0){
  104.  
    for(int j =0;j<jsonArray.size();j++){
  105.  
    Shop shop =new Shop();
  106.  
    JSONObject jsonObject1 =jsonArray.getJSONObject(j);
  107.  
    shop.setShopName(jsonObject1.getString("name"));
  108.  
    shop.setSpecificAddress(jsonObject1.getString("address"));
  109.  
    shop.setId(jsonObject1.getString("id"));
  110.  
    String [] initLonLat =jsonObject1.getString("location").split(",");
  111.  
    shop.setLongitude(initLonLat[0]);
  112.  
    shop.setLatitude(initLonLat[1]);
  113.  
    shopListSon.add(shop);
  114.  
    //DBObject doci = new BasicDBObject("shopId", "300"+i).append("shopName", "人生得意"+i).append("shopStatus",0).append("specificAddress","天堂"+i).append("gps", new Point(new Position(lon, lat)));
  115.  
     
  116.  
    }
  117.  
    }
  118.  
     
  119.  
    } else {
  120.  
    String errorMsg = jsonObject.getString("info");
  121.  
    LOGGER.error("地址(" + keyword + ")" + errorMsg);
  122.  
    }
  123.  
    }
  124.  
     
  125.  
    }
  126.  
    return shopListSon;
  127.  
     
  128.  
    }
  129.  
     
  130.  
    //从高德地图上取数据
  131.  
    // public static void main(String[] args) {
  132.  
    // List<Shop> listShop =new ArrayList<>();
  133.  
    // //东经118°21′-120°30′,北纬29°11′-30°33′。杭州位置
  134.  
    // for(double i=118.20;i<=120.31;i=i+0.1){
  135.  
    // for(double j=29.10;j<=30.33;j=j+0.1){
  136.  
    // List<Shop> listShopSon =new ArrayList<>();
  137.  
    // double lonHead=i;
  138.  
    // double latHead=j;
  139.  
    // double lonTail=i+0.1;
  140.  
    // double latTail=j+0.1;
  141.  
    // String LonLat=lonHead+","+latHead+";"+lonTail+","+latTail;
  142.  
    // listShopSon =initialData(LonLat,"便利店",listShopSon);
  143.  
    // for(int n=0;n<listShopSon.size();n++){
  144.  
    // System.out.println("店铺地址:"+listShopSon.get(n).getSpecificAddress());
  145.  
    // }
  146.  
    // if(listShopSon.size()>0){
  147.  
    // listShop.addAll(listShopSon);
  148.  
    // }
  149.  
    // System.out.println("ListShop的大小:"+listShop.size());
  150.  
    // double d =Distance(lonHead,latHead,lonTail,latTail);
  151.  
    // System.out.println("两点距离"+d);
  152.  
    //
  153.  
    // }
  154.  
    //
  155.  
    // }
  156.  
    //
  157.  
    // System.out.println("ListShop的大小:"+listShop.size());
  158.  
    // creatExcel(listShop);
  159.  
    // }
  160.  
     
  161.  
    public static void main(String[] args) {
  162.  
    readFile("D:\\geode\\222.xls");
  163.  
    }
  164.  
     
  165.  
     
  166.  
    //写入excel中
  167.  
    public static void creatExcel(List<Shop> shopList){
  168.  
    HSSFWorkbook workbook = new HSSFWorkbook();
  169.  
    //第二部,在workbook中创建一个sheet对应excel中的sheet
  170.  
    HSSFSheet sheet = workbook.createSheet("高德地图数据");
  171.  
    //第三部,在sheet表中添加表头第0行,老版本的poi对sheet的行列有限制
  172.  
    HSSFRow row = sheet.createRow(0);
  173.  
    //第四步,创建单元格,设置表头
  174.  
    HSSFCell cell = row.createCell(0);
  175.  
    cell.setCellValue("店铺id");
  176.  
    cell = row.createCell(1);
  177.  
    cell.setCellValue("店铺名称");
  178.  
    cell = row.createCell(2);
  179.  
    cell.setCellValue("店铺地址");
  180.  
    cell = row.createCell(3);
  181.  
    cell.setCellValue("经度");
  182.  
    cell = row.createCell(4);
  183.  
    cell.setCellValue("纬度");
  184.  
     
  185.  
    //第五步,写入实体数据,实际应用中这些数据从数据库得到,对象封装数据,集合包对象。对象的属性值对应表的每行的值
  186.  
    for (int i = 0; i < shopList.size(); i++) {
  187.  
    HSSFRow row1 = sheet.createRow(i + 1);
  188.  
    Shop shop = shopList.get(i);
  189.  
    //创建单元格设值
  190.  
    row1.createCell(0).setCellValue(shop.getId());
  191.  
    row1.createCell(1).setCellValue(shop.getShopName());
  192.  
    row1.createCell(2).setCellValue(shop.getSpecificAddress());
  193.  
    row1.createCell(3).setCellValue(shop.getLongitude());
  194.  
    row1.createCell(4).setCellValue(shop.getLatitude());
  195.  
    }
  196.  
     
  197.  
    //将文件保存到指定的位置
  198.  
    try {
  199.  
    FileOutputStream fos = new FileOutputStream("D:\\geode\\高德便利店地图数据.xls");
  200.  
    workbook.write(fos);
  201.  
    System.out.println("写入成功");
  202.  
    fos.close();
  203.  
    } catch (IOException e) {
  204.  
    e.printStackTrace();
  205.  
    }
  206.  
    }
  207.  
     
  208.  
    public static double Distance(double long1, double lat1, double long2, double lat2) {
  209.  
    double a, b, R;
  210.  
    R =6371; // 地球半径 6371km
  211.  
    lat1 = lat1 * Math.PI / 180.0;
  212.  
    lat2 = lat2 * Math.PI / 180.0;
  213.  
    a = lat1 - lat2;
  214.  
    b = (long1 - long2) * Math.PI / 180.0;
  215.  
    double d;
  216.  
    double sa2, sb2;
  217.  
    sa2 = Math.sin(a / 2.0);
  218.  
    sb2 = Math.sin(b / 2.0);
  219.  
    d = 2
  220.  
    * R
  221.  
    * Math.asin(Math.sqrt(sa2 * sa2 + Math.cos(lat1)
  222.  
    * Math.cos(lat2) * sb2 * sb2));
  223.  
    BigDecimal bigDecimal = new BigDecimal(d*1000);
  224.  
    Double din = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
  225.  
    return din ;
  226.  
    }
  227.  
     
  228.  
    public static List<Shop> readFile(String filename){
  229.  
    List<Shop> shopList =new ArrayList<>();
  230.  
    Workbook wb=null;
  231.  
    Cell cell=null;
  232.  
    try {
  233.  
    File f=new File(filename);
  234.  
    InputStream in=new FileInputStream(f); //创建输入流
  235.  
    wb= Workbook.getWorkbook(in); //获取Excel文件对象
  236.  
    jxl.Sheet s=wb.getSheet(0); //获取文件的指定工作表,默认为第一个
  237.  
    String value=null;
  238.  
    for(int i=1;i<s.getRows();i++){//表头目录不需要,从第一行开始
  239.  
    Shop shop =new Shop();
  240.  
    for(int j=0;j<s.getColumns();j++){
  241.  
    cell=s.getCell(j, i);
  242.  
    value=cell.getContents();
  243.  
    if(j==0){
  244.  
    shop.setId(value);
  245.  
    }else if(j==1){
  246.  
    shop.setShopName(value);
  247.  
    }else if(j==2){
  248.  
    shop.setSpecificAddress(value);
  249.  
    }else if(j==3){
  250.  
    shop.setLongitude(value);
  251.  
    }else if(j==4){
  252.  
    shop.setLatitude(value);
  253.  
    }
  254.  
    // System.out.println("value:"+value);
  255.  
    }
  256.  
    shopList.add(shop);
  257.  
    }
  258.  
     
  259.  
    } catch (FileNotFoundException e) {
  260.  
    // TODO Auto-generated catch block
  261.  
    e.printStackTrace();
  262.  
    } catch (BiffException e) {
  263.  
    // TODO Auto-generated catch block
  264.  
    e.printStackTrace();
  265.  
    } catch (IOException e) {
  266.  
    // TODO Auto-generated catch block
  267.  
    e.printStackTrace();
  268.  
    }
  269.  
    return shopList;
  270.  
    }
  271.  
    }

 

由于高德地图对他的数据做了保护,我这边采用的是矩形搜索。 百度到杭州的经纬度划分成多个小矩形,然后调用高德地图的API服务。我这边将爬取的数据写入excel表格中,一是为了展示验证数据是否准确,二是怕直接写入会不会有内存泄漏问题。我上面的代码有写入excel和读取excel的代码。不过要注意一下 我用得jar包不同。写入用的poi,读取用的是jxl.

 

这边调用http请求是客户端,代码如下。是在网上找到的,首先谢谢分享的人。因为有段时间,原文地址忘记了。一开始用的是

 

URL myURL = null;
URLConnection httpsConn = null;
try {
    myURL = new URL(url);
} catch (MalformedURLException e) {
    e.printStackTrace();
}
InputStreamReader insr = null;
BufferedReader br = null;
httpsConn = (URLConnection) myURL.openConnection();// 不使用代理

然后在tomcat项目中调用时,报错了,原因现在还没有弄清楚,知道原因的告诉我一二。

 

 

  1.  
    package com.pingogo.api.common;
  2.  
     
  3.  
    import java.io.IOException;
  4.  
    import java.io.UnsupportedEncodingException;
  5.  
    import java.net.URLEncoder;
  6.  
    import java.util.Iterator;
  7.  
    import java.util.Map;
  8.  
    import java.util.Set;
  9.  
     
  10.  
    import org.apache.commons.httpclient.HttpClient;
  11.  
    import org.apache.commons.httpclient.HttpException;
  12.  
    import org.apache.commons.httpclient.HttpStatus;
  13.  
    import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
  14.  
    import org.apache.commons.httpclient.methods.GetMethod;
  15.  
    import org.apache.commons.httpclient.methods.PostMethod;
  16.  
    import org.apache.commons.logging.Log;
  17.  
    import org.apache.commons.logging.LogFactory;
  18.  
     
  19.  
    /**
  20.  
    * HTTP工具类
  21.  
    *
  22.  
    * @author lixiangyang
  23.  
    *
  24.  
    */
  25.  
    public class HttpUtils {
  26.  
     
  27.  
    private static Log log = LogFactory.getLog(HttpUtils.class);
  28.  
     
  29.  
    /**
  30.  
    * 定义编码格式 UTF-8
  31.  
    */
  32.  
    public static final String URL_PARAM_DECODECHARSET_UTF8 = "UTF-8";
  33.  
     
  34.  
    /**
  35.  
    * 定义编码格式 GBK
  36.  
    */
  37.  
    public static final String URL_PARAM_DECODECHARSET_GBK = "GBK";
  38.  
     
  39.  
    private static final String URL_PARAM_CONNECT_FLAG = "&";
  40.  
     
  41.  
    private static final String EMPTY = "";
  42.  
     
  43.  
    private static MultiThreadedHttpConnectionManager connectionManager = null;
  44.  
     
  45.  
    private static int connectionTimeOut = 25000;
  46.  
     
  47.  
    private static int socketTimeOut = 25000;
  48.  
     
  49.  
    private static int maxConnectionPerHost = 20;
  50.  
     
  51.  
    private static int maxTotalConnections = 20;
  52.  
     
  53.  
    private static HttpClient client;
  54.  
     
  55.  
    static{
  56.  
    connectionManager = new MultiThreadedHttpConnectionManager();
  57.  
    connectionManager.getParams().setConnectionTimeout(connectionTimeOut);
  58.  
    connectionManager.getParams().setSoTimeout(socketTimeOut);
  59.  
    connectionManager.getParams().setDefaultMaxConnectionsPerHost(maxConnectionPerHost);
  60.  
    connectionManager.getParams().setMaxTotalConnections(maxTotalConnections);
  61.  
    client = new HttpClient(connectionManager);
  62.  
    }
  63.  
     
  64.  
    /**
  65.  
    * POST方式提交数据
  66.  
    * @param url
  67.  
    * 待请求的URL
  68.  
    * @param params
  69.  
    * 要提交的数据
  70.  
    * @param enc
  71.  
    * 编码
  72.  
    * @return
  73.  
    * 响应结果
  74.  
    * @throws IOException
  75.  
    * IO异常
  76.  
    */
  77.  
    public static String URLPost(String url, Map<String, String> params, String enc){
  78.  
    enc=URL_PARAM_DECODECHARSET_UTF8;
  79.  
    String response = EMPTY;
  80.  
    PostMethod postMethod = null;
  81.  
    try {
  82.  
    postMethod = new PostMethod(url);
  83.  
    postMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + enc);
  84.  
    //将表单的值放入postMethod中
  85.  
    Set<String> keySet = params.keySet();
  86.  
    for(String key : keySet){
  87.  
    String value = params.get(key);
  88.  
    postMethod.addParameter(key, value);
  89.  
    }
  90.  
    //执行postMethod
  91.  
    int statusCode = client.executeMethod(postMethod);
  92.  
    if(statusCode == HttpStatus.SC_OK) {
  93.  
    response = postMethod.getResponseBodyAsString();
  94.  
    }else{
  95.  
    log.error("响应状态码 = " + postMethod.getStatusCode());
  96.  
    }
  97.  
    }catch(HttpException e){
  98.  
    log.error("发生致命的异常,可能是协议不对或者返回的内容有问题", e);
  99.  
    e.printStackTrace();
  100.  
    }catch(IOException e){
  101.  
    log.error("发生网络异常", e);
  102.  
    e.printStackTrace();
  103.  
    }finally{
  104.  
    if(postMethod != null){
  105.  
    postMethod.releaseConnection();
  106.  
    postMethod = null;
  107.  
    }
  108.  
    }
  109.  
     
  110.  
    return response;
  111.  
    }
  112.  
     
  113.  
    /**
  114.  
    * GET方式提交数据
  115.  
    * @param url
  116.  
    * 待请求的URL
  117.  
    * @param params
  118.  
    * 要提交的数据
  119.  
    * @param enc
  120.  
    * 编码
  121.  
    * @return
  122.  
    * 响应结果
  123.  
    * @throws IOException
  124.  
    * IO异常
  125.  
    */
  126.  
    public static String URLGet(String url, Map<String, String> params, String enc){
  127.  
     
  128.  
    String response = EMPTY;
  129.  
    GetMethod getMethod = null;
  130.  
    StringBuffer strtTotalURL = new StringBuffer(EMPTY);
  131.  
     
  132.  
    if(strtTotalURL.indexOf("?") == -1) {
  133.  
    strtTotalURL.append(url).append("?").append(getUrl(params, enc));
  134.  
    } else {
  135.  
    strtTotalURL.append(url).append("&").append(getUrl(params, enc));
  136.  
    }
  137.  
    log.debug("GET请求URL = \n" + strtTotalURL.toString());
  138.  
     
  139.  
    try {
  140.  
    getMethod = new GetMethod(strtTotalURL.toString());
  141.  
    getMethod.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=" + enc);
  142.  
    //执行getMethod
  143.  
    int statusCode = client.executeMethod(getMethod);
  144.  
    if(statusCode == HttpStatus.SC_OK) {
  145.  
    response = getMethod.getResponseBodyAsString();
  146.  
    }else{
  147.  
    log.debug("响应状态码 = " + getMethod.getStatusCode());
  148.  
    }
  149.  
    }catch(HttpException e){
  150.  
    log.error("发生致命的异常,可能是协议不对或者返回的内容有问题", e);
  151.  
    e.printStackTrace();
  152.  
    }catch(IOException e){
  153.  
    log.error("发生网络异常", e);
  154.  
    e.printStackTrace();
  155.  
    }finally{
  156.  
    if(getMethod != null){
  157.  
    getMethod.releaseConnection();
  158.  
    getMethod = null;
  159.  
    }
  160.  
    }
  161.  
     
  162.  
    return response;
  163.  
    }
  164.  
     
  165.  
    /**
  166.  
    * 据Map生成URL字符串
  167.  
    * @param map
  168.  
    * Map
  169.  
    * @param valueEnc
  170.  
    * URL编码
  171.  
    * @return
  172.  
    * URL
  173.  
    */
  174.  
    private static String getUrl(Map<String, String> map, String valueEnc) {
  175.  
     
  176.  
    if (null == map || map.keySet().size() == 0) {
  177.  
    return (EMPTY);
  178.  
    }
  179.  
    StringBuffer url = new StringBuffer();
  180.  
    Set<String> keys = map.keySet();
  181.  
    for (Iterator<String> it = keys.iterator(); it.hasNext();) {
  182.  
    String key = it.next();
  183.  
    if (map.containsKey(key)) {
  184.  
    String val = map.get(key);
  185.  
    String str = val != null ? val : EMPTY;
  186.  
    try {
  187.  
    str = URLEncoder.encode(str, valueEnc);
  188.  
    } catch (UnsupportedEncodingException e) {
  189.  
    e.printStackTrace();
  190.  
    }
  191.  
    url.append(key).append("=").append(str).append(URL_PARAM_CONNECT_FLAG);
  192.  
    }
  193.  
    }
  194.  
    String strURL = EMPTY;
  195.  
    strURL = url.toString();
  196.  
    if (URL_PARAM_CONNECT_FLAG.equals(EMPTY + strURL.charAt(strURL.length() - 1))) {
  197.  
    strURL = strURL.substring(0, strURL.length() - 1);
  198.  
    }
  199.  
     
  200.  
    return (strURL);
  201.  
    }
  202.  
    }

 

 

maven里的配置

 

<dependency>
    <groupId>commons-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
</dependency

 

 

最后给大家看一下我爬取出来的数据

 

 

如果有什么不对的地方,希望大家指点。

 

 

 

 

 

 

  1. java高德开放平台 | 高德地图API注册账号,并且申请web服务的AK密钥,每次发送请求需要带着这个key去认证。注册账号登陆后点击右上角的控制台 ->应用管理 -> 创建应用 -> 添加新key,注意选择web api,就得到了一个可以使用web服务的key密钥。

  2. 查找高德地图提供的web api下的搜索模块使用API文档开发指南

    http://lbs.amap.com/api/webservice/guide/api/search

 

之前本人试过通过高德地图中的搜索页面搜索功能,不输入key,但是访问次数有一定的限制,就会让输入拼图验证

这种方法不可取只能去注册key,然后去获得需要的数据

关于高德地图信息抓取,我们根据高德地图搜索POI文档 ,简单的说下两种比较实用的方法

第一种  多边形搜索

多边形搜索需要在地图上绘制经度和纬度用","分割,经度在前,纬度在后,坐标对用"|"分割。经纬度小数点后不得超过6位。         多边形为矩形时,可传入左上右下两顶点坐标对;其他情况下首尾坐标对需相同

示例:

如上图四个marker点,调用高德地图POI搜索功能即可搜索这个片区内的数据信息

测试接口:

https://restapi.amap.com/v3/place/polygon?polygon=108.875542,34.193769|108.880032,34.193724|108.880038,34.191466|108.875633,34.191399|108.875542,34.193769&key=<自己的Key>

可传入keywords和types,当keywords和types为空的时候, 会默认指定types为120000(商务住宅)&150000(交通设施服务) 

查询POI类型下载POI分类编码和城市编码表  

https://lbs.amap.com/api/webservice/download

 

POI分类编码部分截图

 

由此可见,可以根据需要的菜系类型查找某一地区菜系的分布效果

返回数据格式:

           

名称

含义

规则说明

status

结果状态值,值为0或1

0:请求失败;1:请求成功

info

返回状态说明

status为0时,info返回错误原因,否则返回“OK”。详情参阅info状态表

count

搜索方案数目(最大值为1000)

 

suggestion

城市建议列表

当用户输入的词语为泛搜索词的时候,将显示城市列表

 

keywords

唯一ID

 
 

cities

城市列表

 
 

name

名称

 

num

该城市包含此关键字的个数

 

citycode

该城市的citycode

 

adcode

该城市的adcode

 

pois

搜索POI信息列表

 
 

poi

POI信息

 
 

id

唯一ID

 

parent

父POI的ID

当前POI如果有父POI,则返回父POI的ID。可能为空

name

名称

 

type

兴趣点类型

顺序为大类、中类、小类

例如:餐饮服务;中餐厅;特色/地方风味餐厅

typecode

兴趣点类型编码

例如:050118

biz_type

行业类型

 

address

地址

东四环中路189号百盛北门

location

经纬度

格式:X,Y

distance

离中心点距离

单位:米

必须说明, 此结果仅在周边搜索的时候有值

tel

该POI的电话

 

postcode

邮编

 extensions=all的时候显示 

website

该POI的网址

 extensions=all的时候显示 

email

该POI的电子邮箱

 extensions=all的时候显示 

pcode

poi所在省份编码

 extensions=all的时候显示 

pname

poi所在省份名称

若是直辖市的时候,此处直接显示市名,例如北京市

citycode

城市编码

 extensions=all的时候显示 

cityname

城市名

 若是直辖市的时候,此处直接显示市名,例如北京市 

adcode

区域编码

 extensions=all的时候显示 

adname

区域名称

区县级别的返回,例如朝阳区

entr_location

入口经纬度

 extensions=all的时候显示 

exit_location

出口经纬度

 extensions=all的时候显示 

navi_poiid

地图编号

 extensions=all的时候显示 

gridcode

地理格ID

 extensions=all的时候显示 

alias

别名

 extensions=all的时候显示 

business_area

所在商圈

 extensions=all的时候显示 

parking_type

停车场类型

仅在停车场类型POI的时候显示该字段

展示停车场类型,包括:地下、地面、路边

 extensions=all的时候显示 

 tag 

 该POI的特色内容

 主要出现在POI为美食类的POI之中出现,此时代表特色菜

例如“烤鱼,麻辣香锅,老干妈回锅肉”

 

在其余POI类别的时候,会有小概率出现,此时代表此POI的特色内容

例如北京-第五季花艺 之中的“岁月静好,定情,如意花卡,圣诞之爱”

 

仅在extensions=all

indoor_map

是否有室内地图标志

1,表示有室内相关数据

0,代表没有室内相关数据

 extensions=all的时候显示 

indoor_data

室内地图相关数据

当indoor_map=0时,字段为空

 extensions=all的时候显示 

 

cpid

当前POI的父级POI

如果当前POI为建筑物类POI,则cpid为自身POI ID;如果当前POI为商铺类POI,则cpid为其所在建筑物的POI ID

floor

楼层索引

一般会用数字表示,例如8

truefloor

所在楼层

一般会带有字母,例如F8

groupbuy_num

团购数据

此字段逐渐废弃

business_area

所属商圈

 extensions=all的时候显示 

discount_num

优惠信息数目

此字段逐渐废弃 

biz_ext

深度信息

 extensions=all的时候显示 

 

rating

评分

仅存在于餐饮、酒店、景点、影院类POI之下

 

cost

人均消费

仅存在于餐饮、酒店、景点、影院类POI之下 

 

meal_ordering

是否可订餐

仅存在于餐饮相关POI之下(此字段逐渐废弃)

 

seat_ordering

是否可选座

仅存在于影院相关POI之下(此字段逐渐废弃) 

 

ticket_ordering    

是否可订票

仅存在于景点相关POI之下(此字段逐渐废弃) 

 

hotel_ordering

是否可以订房

仅存在于酒店相关POI之下(此字段逐渐废弃) 

photos

照片相关信息

extensions=all的时候显示

 

titile

图片介绍

 
     

url

具体链接

 

弊端:

调用次数有限制,只有2000次免费调用次数,可以购买次数

 

第二种:关键字搜索

 

通过用POI的关键字进行条件搜索,例如:肯德基、朝阳公园等;同时支持设置POI类型搜索,例如:银行查询城市

可选值:城市中文、中文全拼、citycode、adcode

如:北京/beijing/010/110000

填入此参数后,会尽量优先返回此城市数据,但是不一定仅局限此城市结果,若仅需要某个城市数据请调用citylimit参数。

如:在深圳市搜天安门,返回北京天安门结果。

 

规则:只支持单个关键词语搜索关键词支持:行政区名称、citycode、adcode

例如,在subdistrict=2,搜索省份(例如山东),能够显示市(例如济南),区(例如历下区)

例子:

https://restapi.amap.com/v3/place/text?keywords=&city=610115000000&offset=20&page=1&key=<自己的key>

部分数据存储:

 

这两个方法的实现大致相同,只是请求不同的URL地址

posted on 2021-02-08 20:42  shuzihua  阅读(1522)  评论(0编辑  收藏  举报

导航