精华内容
下载资源
问答
  • 最近公司要开发一个高德地图poi爬取程序。 结合网上的自己写了一个,直接放eclipse中就能跑起来的。 有不足的地图还希望朋友们多提宝贵的建议意见。 谢谢啦 。。
  • html:搜索框,搜索提示,搜索下拉菜单 JS:上下键移动提示内容,选取提示内容,ArcGIS API for JavaScript显示地图与POI信息 服务:高德地图POI服务 可用!
  • 高德地图poi 周边搜索及关键字搜索 Android 6.0系统默认为targetSdkVersion小于23的应用默认授予了所申请的所有权限,所以如果您APP设置的targetSdkVersion低于23,在运行时也不会崩溃。
  • 高德地图来讲,就是搜索完关键字之后,地图中心是我的搜索地点。 但是我写出来的Demo中,当点击搜索按钮后,搜索地点为地图中心的时间很短,然后就迅速定位到我的当前位置了。 初步判断是地图在一定的时间...
  • 自己参考高德地图API文档做的POI搜索地点的例子,显示锚点和锚点位置信息,且锚点显示的位置信息可以随着锚点在地图上位置的变化而变化
  • 高德地图POI数据下载工具是一款能够让用户在不写代码的前提下实现高德地图POI数据批量下载的工具软件。




    1 工具获取方式

    点击下面链接,即可获取地理坐标系转换工具
    地理坐标系转换工具

    2 工具介绍

    高德地图POI数据下载工具(下文称该工具)是一款能够让用户在不写代码的前提下实现高德地图POI数据批量下载的工具软件。

    该工具基于高德地图API中的搜索POI接口并引入数据结构中的四叉树编码模型来实现POI数据快速且稳定的获取。具体的原理可以参考下面这篇文章:利用Python获取全量高德POI兴趣点数据
    高德地图POI数据下载工具的特点有:

    • 高效。该工具引入数据结构中的四叉树编码模型来提高POI数据的下载效率。四叉树模型能够动态识别POI较多的区域并分配更多的计算资源,实现计算资源的动态平衡,从而实现提高下载效率的目的。
    • 抗干扰性强。该工具支持断点下载,将一个完整的POI下载动作拆分成两个独立的步骤,每个步骤完成后都会自动保存数据及日志,避免发生意外情况后需要重新开始计算。
    • 免费。该工具目前所有的功能都是免费。

    3 工具使用步骤

    利用该工具实现高德POI数据下载需要执行3个动作

    • 注册高德地图API密钥并导入工具
    • 建立四叉树索引
    • 执行高德POI下载

    3.1 注册高德地图API密钥并导入工具

    该工具利用用户自己申请的高德地图API密钥进行POI数据下载,因此使用该工具的前提就是注册成为高德地图API的开发者并成功申请密钥。高德地图API的网址是:
    高德地图API注册页面

    下图为注册界面
    2.1.1

    注册成功后,进入应用管理平台,并在我的应用中点击创建新应用按钮(下图右上角),根据需要填写应用名称以及应用类型
    2.1.2
    应用创建成功后,在该应用栏中点击添加按钮(下图红色框标识)。
    2.1.3
    根据需要输入Key名称,服务平台需要选择Web服务
    2.1.4
    双击打开高德地图POI数据下载工具,点击高德地图API密钥按钮(下图红色框标识)可以进入密钥导入界面。

    • 如果在第一个文本框中出现尚未添加高德地图API密钥字样,则说明还没有将密钥导入工具,需要将密钥导入工具。
    • 如果在第一个文本框中出现密钥值,则说明已经将密钥导入工具,不需要再次导入。
      2.2.1
      将上一步中申请的高德地图API密钥填入红色框标识的文本框中,并点击蓝色箭头标识的添加按钮完成密钥导入动作。
      2.2.2
      当出现如下图中红色框标识的弹窗则代表高德地图API密钥导入成功。另外,之后每次进入密钥导入界面,蓝色框中的文本框都会显示当前正在使用的密钥。
      2.2.3

    3.2 建立四叉树索引

    点击选项卡中的①-建立四叉树索引按钮(下图红框标识)
    3.2.1
    矩形范围文本框(下图红框标识)中输入POI数据的外接矩形的空间范围。空间范围的格式是【最小经度】+【最大经度】+【最小纬度】+【最大纬度】,输入坐标的坐标系必须是GCJ-02。
    3.2.2
    这边也提供了小工具来实现矩形范围框选的工作,点击下图红色框标识的网址打开矩形范围框选工具
    3.2.3
    下图为矩形范围框选工具
    3.2.4
    点击工具中的开始框选按钮(下图红色框标识),可以开始执行矩形范围框选动作
    3.2.5
    在地图中框选想要下载的POI数据的矩形范围,如下图所示框选了北京日坛公园周边的区域。完成框选动作后文本框(下图蓝色框标识)会出现刚刚框选范围的坐标值。
    3.2.6
    复制上面的坐标值到矩形范围文本框中(下图红色框标识)
    3.2.7
    点击执行按钮(下图红色框标识),开始四叉树索引建立。
    3.2.8
    出现下图红色框标识的弹出框,说明四叉树索引建立完毕。
    3.2.9
    四叉树索引数据自动保存在下图红色框标识的地址中
    3.2.10

    3.3 执行高德POI下载

    点击选项卡中的②-执行高德POI下载按钮(下图红框标识)
    3.3.1
    点击读取文件按钮(下图红框标识),并在弹出的文件选择对话框中选择上一步生成的四叉树索引文件
    3.3.2
    当出现如下图所示的界面时,则为成功读取四叉树索引文件
    3.3.3
    下一步需要在下图红框标识的三个单选按钮中选择POI数据下载的速度。下载速度可以分为正常速度、稳定下载(未认证)、稳定下载(已认证)三种,具体意义是:

    • 正常速度。执行速度是每1秒执行1次下载请求,适用于已经开通企业认证或POI下载任务较小的情况(较小的定义是单个任务小于100个多边形)。值得注意的是如果下载任务较大且选择了正常速度,可能会出现高德地图API密钥限额用尽的情况,最终导致下载任务出错。
    • 稳定下载(未认证)。执行速度是每54秒执行1次下载请求,适用于已注册高德地图API密钥但是未开通个人或企业认证的的情况。选择稳定下载(未认证)后即使没有开通个人或企业认证也可以平稳运行不会出现密钥限额用尽的情况。
    • 稳定下载(已认证)。执行速度是每4秒执行1次下载请求,适用于已经开通高德地图API个人开发者认证的情况。选择稳定下载(已认证)后已开通个人开发认证的可以平稳运行不会出现限额用尽的情况。
      3.3.4
      点击执行转换按钮开始POI数据下载,当出现类似下图红框标注的状态信息时,代表POI下载任务已经在进行中,需要耐心等待任务完成
      3.3.7
      当出现下图所示的POI数据下载完成弹窗,说明POI下载任务已经完成,当前任务下载的POI数据自动保存在下图红框标识的地址中。
      3.3.8
      下图为北京日坛公园周边的POI数据
      3.3.9
      下图为POI数据的地图可视化效果
      3.3.10

    3.4 如发生意外情况,支持断点下载

    如果在执行高德POI下载的过程中出现意外导致下载中断,该工具支持断点下载,具体步骤为:

    1. 输出断点之前已下载的POI数据
    2. 找到尚未执行下载的四叉树数据并完成下载
    3. 合并两份POI数据

    (1) 输出断点之前已下载的POI数据

    首先,通过状态栏找到断点之前下载任务的中间数据文件夹地址(下图红框标识)。
    3.4.4
    点击选项卡中的③-输出高德POI数据按钮(下图红框标识)。
    3.4.5
    点击读取文件按钮(下图红框标识),并在文件弹出框中找到中间数据文件夹地址
    3.4.6
    点击执行输出按钮(下图红框标识),当出现如下图的弹窗则说明POI数据输出完成。
    3.4.7
    POI数据输出的地址如下图红框标注。值得注意的是,这边输出的POI数据是断点之前已下载的POI数据
    3.4.8
    (2) 找到尚未执行下载的四叉树数据并完成下载

    通过状态栏找到断点之前尚未执行下载的四叉树数据地址(下图红框标识)。
    3.4.1
    ②-执行高德POI下载功能界面中点击读取文件按钮(下图红色框标注),并找到上一步中的尚未执行下载的四叉树数据地址。
    3.4.2
    完成上述操作之后就进入了正常的POI下载任务,这边下载的POI数据是断点之前尚未执行下载的
    3.4.3
    (3)合并两份POI数据

    待POI数据下载完成后,合并上述两份数据就得到了一份完整的POI数据。

    4 工具下一步开发计划

    1. 支持指定类别下载。部分用户可能只需要特定几个类别的POI数据并不需要全量POI数据。为满足这类用户的需求,工具下一步计划开发指定类别下载的功能,用户可以通过点选的方式来获取自己需要的POI数据。
    2. 提高断点下载的易用性。目前工具断点下载的功能操作较为复杂,下一步计划简化断点下载的操作,提高工具的易用性。
    3. 支持多密钥下载。目前工具仅支持单个高德地图API密钥的下载,这会限制下载速度以及单日下载限额。下一步计划开发支持多密钥轮询的POI下载功能,提高下载效率。
    展开全文
  • 爬取高德地图poi数据

    千次阅读 2018-09-28 13:34:26
    高德地图搜索poi的api介绍地址 当前想法是爬取目标区域(作者所在小县城)的所有poi数据,存到数据库中作为原始数据,然后供其它系统调用,因为之前爬取过百度地图的poi数据,所以这次工作就驾轻就熟了。 1、首先...

    高德地图搜索poi的api介绍地址

    当前想法是爬取目标区域(作者所在小县城)的所有poi数据,存到数据库中作为原始数据,然后供其它系统调用,因为之前爬取过百度地图的poi数据,所以这次工作就驾轻就熟了。

    1、首先注册一个高德地图的开发者账号,申请一个绑定Web服务的key,然后把刚注册的开发者账号认证一下: 申请账号、key就不赘述了,去高德地图开发平台很简单就能完成了,将账号认证是为了提高每日访问高德地图api接口的次数限制和并发请求。

    2、根据上方api地址里面的介绍,总共分为4中搜索: 关键字搜索:通过用POI的关键字进行条件搜索,例如:肯德基、朝阳公园等;同时支持设置POI类型搜索,例如:银行 周边搜索:在用户传入经纬度坐标点附近,在设定的范围内,按照关键字或POI类型搜索; 多边形搜索:在多边形区域内进行搜索 ID查询:通过POI ID,查询某个POI详情,建议可同输入提示API配合使用

    我的目标是某个区域的所有poi,所以选择的第三种:多边形搜索

    3、多边形搜索最重要的参数就是polygon-》经纬度坐标对,我在百度地图坐标拾取系统拾取了我的目标区域的经纬度坐标对,如下图: 百度地图坐标拾取系统

    3步准备工作到这里就差不多结束了,在正式开始码代码之前先做个测试吧,用浏览器直接访问接口看看返回的数据(当然,高德的api接口有返回数据说明)

    api返回数据1

    如上图,这里比较重要的一个属性是count,根据api的介绍count是搜索方案数目(最大值为1000),所以说每次请求都会返回当前所搜所包含的poi个数,而大于1000的poi是没有办法获取到的。那么我如果想查询某个区域的全部数据,可以将这个区域再划分成更小的区域(显然是个递归操作)的集合,然后把这几个可以查到所有poi的区域的所有poi数据结合起来就是我最终需要的数据。可能口述不明朗,可以见下方草图:

    划分区域草图

    好,可以开始撸代码了:

    因为,整个调用API的过程都离不开经纬度,所以首先定义一个经纬度描述的类

    //矩形块的经纬度标识, 左上角的经纬度 和右下角的经纬度
    class RectangleCoordinate {
    
        /**
         * 矩形左上角经度
         */
        private double x0;
    
        /**
         * 矩形左上角纬度
         */
        private double y0;
    
        /**
         * 矩形右下角经度
         */
        private double x1;
    
        /**
         * 矩形右下角纬度
         */
        private double y1;
    
    
        public RectangleCoordinate(double x0, double y0, double x1, double y1) {
            this.x0 = x0;
            this.y0 = y0;
            this.x1 = x1;
            this.y1 = y1;
        }
    
        /**
         * [@return](https://my.oschina.net/u/556800) 获取矩形中心线的纬度
         */
        public double getAverageY() {
            return (y0 + y1) / 2;
        }
    
        /**
         * [@return](https://my.oschina.net/u/556800) 获取矩形中心线的经度
         */
        public double getAverageX() {
            return (x0 + x1) / 2;
        }
    
        public double getX0() {
            return x0;
        }
    
        public void setX0(double x0) {
            this.x0 = x0;
        }
    
        public double getY0() {
            return y0;
        }
    
        public void setY0(double y0) {
            this.y0 = y0;
        }
    
        public double getX1() {
            return x1;
        }
    
        public void setX1(double x1) {
            this.x1 = x1;
        }
    
        public double getY1() {
            return y1;
        }
    
        public void setY1(double y1) {
            this.y1 = y1;
        }
    
        [@Override](https://my.oschina.net/u/1162528)
        public String toString() {
            return x0 + "," + y0 + "|" + x1 + "," + y1;
        }
    }`

    然后需要一个调用api,获取返回数据的方法,这个方法参数就是矩形块,当然还需要一个页数,即当前方法获取的是某个矩形区域的第X页的数据(每页上线25个poi,默认20个poi)

    /**
         * @return 获取矩形块的poi数据
         */
        private JSONObject getSearchResult(RectangleCoordinate coordinate, int page) {
            RestTemplate restTemplate = new RestTemplate();
            String url = getRequestGaodeUrl(coordinate,page);
            String result = restTemplate.getForObject(url, String.class);
            try {
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                return JSONObject.parseObject(result);
            } catch (Exception e) {
                logger.error("an error occurred when getting response of gaode map data for coordinate:[{}]", coordinate.toString());
            }
            return null;
        }

    当然,上方已经说过,如果矩形块返回数据count=1000,就说明当前矩形块需要分割,我的想法比较简单,将矩形块按照上方草图,在水平中心和垂直分心分割,1个矩形块就分割成4个小矩形块了,方法如下:

    /**
         * @return 将矩形4等分成小矩形 然后返回4个 小矩形的经纬度集合
         */
        private List<RectangleCoordinate> getSplitRectangleList(RectangleCoordinate coordinate) {
            List<RectangleCoordinate> splitRectangleList = new LinkedList<>();
            splitRectangleList.add(new RectangleCoordinate(coordinate.getX0(), coordinate.getY0(), coordinate.getAverageX(), coordinate.getAverageY()));
            splitRectangleList.add(new RectangleCoordinate(coordinate.getAverageX(), coordinate.getY0(), coordinate.getX1(), coordinate.getAverageY()));
            splitRectangleList.add(new RectangleCoordinate(coordinate.getX0(), coordinate.getAverageY(), coordinate.getAverageX(), coordinate.getY1()));
            splitRectangleList.add(new RectangleCoordinate(coordinate.getAverageX(), coordinate.getAverageY(), coordinate.getX1(), coordinate.getY1()));
            return splitRectangleList;
        }

    目前,可以获取到矩形区域经纬度对的集合了,也有获取api数据的方法了,然后就是遍历页数获取数据,自定义操作数据。 当某次分页请求返回的poi个数小于每页最大个数的时候就认为当前区域poi已经完全请求到了。

    private void startAnaMainGaode(RectangleCoordinate coordinate) throws AnalysisException {
            //当前爬取的数据的页数索引
            int page_num = 0;
            //当前爬取内容是否是最后一页
            boolean isLastPage = false;
            JSONObject searchResult;
            JSONArray datas = null;
            logger.info("ready to analysis coordinate:[{}]", coordinate.toString());
            while (!isLastPage) {
                logger.info("is going to get data for page_" + page_num);
                try {
                    searchResult = getSearchResult(coordinate, page_num);
                    datas = searchResult.getJSONArray("pois");
                } catch (Exception e) {
                    logger.error("an error occurred when getting response of gaode map data for coordinate:[{}]", coordinate.toString());
                }
                if (datas != null && datas.size() < 20) {
                    isLastPage = true;
                    logger.info("get result counts is [{}], now page index is [{}]", datas.size(), page_num);
                }
                saveIntoDbGaode(datas);
                page_num++;
            }
        }
    private void saveIntoDbGaode(JSONArray result) {
        JSONObject resultItem;
    
        for (int i = 0; i < result.size(); i++) {
            resultItem = result.getJSONObject(i);
            try {
                results.add(getInsertUnitObject(resultItem));
            } catch (Exception e) {
                logger.error("生成数据时异常,e: {}", e.getMessage());
                e.printStackTrace();
            }
        }
        if (results.size() > BATCHINSERTLIMIT || ISLAST) {
            logger.info("is ready to batch insert into unit, total count is {}", results.size());
            try {
                dao.batchAddUnitGaode(results);
            } catch (Exception e) {
                logger.error("更新数据库异常,e: {}", e.getMessage());
            }
            results = new JSONArray();
        }
    }

    到此,基本方法都介绍过了,全部代码如下(因为都是简单方法和逻辑,不明白的留言交流)

    //请求入口 
    public void GaodePoiSearch() { 
        //徐水区 final RectangleCoordinate searchAreaCoordinate = new RectangleCoordinate(115.521773, 39.106335, 115.801182, 38.943988);    
        //保定市
        //final RectangleCoordinate searchAreaCoordinate = new RectangleCoordinate(114.332719,39.574064, 116.588688,38.179144);
    
        List<RectangleCoordinate> validCoordinate = getValidCoordinate(searchAreaCoordinate);
        logger.info("get all valid coordinate,size is [{}]", validCoordinate.size());
        /**
         * 获取到所有的小方块之后可以做一些处理, 比如存储到某个地方,以防发生异常,方便后面重新遍历,我这里暂未做处理
         */
        validCoordinate.forEach(coor -> {
            try {
                startAnaMainGaode(coor);
            } catch (AnalysisException e) {
                e.printStackTrace();
            }
        });
    
        ISLAST = true;
        saveIntoDbGaode(new JSONArray());
    }
    
    /**
     * [@return](https://my.oschina.net/u/556800) 获取矩形块中 符合 调用api的 小矩形块的集合
     * 因为高德地图某个矩形块只能获取前1000条,所以要将矩形块分割成可以获取到全部数据的矩形块
     * 如果当前矩形块请求数据返回的count<1000 即为符合条件的,否则将矩形块4等分 然后递归
     */
    private List<RectangleCoordinate> getValidCoordinate(RectangleCoordinate coordinate) {
        List<RectangleCoordinate> validCoordinate = new LinkedList<>();
        JSONObject searchResult = getSearchResult(coordinate, 0);
        if (searchResult.getIntValue("count") >= 1000) {
            List<RectangleCoordinate> splitRectangleList = getSplitRectangleList(coordinate);
            splitRectangleList.forEach(coor -> validCoordinate.addAll(getValidCoordinate(coor)));
        } else {
            logger.info("add a valid coordinate [{}]", coordinate.toString());
            validCoordinate.add(coordinate);
        }
        return validCoordinate;
    }
    
    /**
     * [@return](https://my.oschina.net/u/556800) 将矩形4等分成小矩形 然后返回4个 小矩形的经纬度集合
     */
    private List<RectangleCoordinate> getSplitRectangleList(RectangleCoordinate coordinate) {
        List<RectangleCoordinate> splitRectangleList = new LinkedList<>();
        splitRectangleList.add(new RectangleCoordinate(coordinate.getX0(), coordinate.getY0(), coordinate.getAverageX(), coordinate.getAverageY()));
        splitRectangleList.add(new RectangleCoordinate(coordinate.getAverageX(), coordinate.getY0(), coordinate.getX1(), coordinate.getAverageY()));
        splitRectangleList.add(new RectangleCoordinate(coordinate.getX0(), coordinate.getAverageY(), coordinate.getAverageX(), coordinate.getY1()));
        splitRectangleList.add(new RectangleCoordinate(coordinate.getAverageX(), coordinate.getAverageY(), coordinate.getX1(), coordinate.getY1()));
        return splitRectangleList;
    }
    
    /**
     * @return 获取矩形块的poi数据
     */
    private JSONObject getSearchResult(RectangleCoordinate coordinate, int page) {
        RestTemplate restTemplate = new RestTemplate();
        String url = getRequestGaodeUrl(coordinate,page);
        String result = restTemplate.getForObject(url, String.class);
        try {
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return JSONObject.parseObject(result);
        } catch (Exception e) {
            logger.error("an error occurred when getting response of gaode map data for coordinate:[{}]", coordinate.toString());
        }
        return null;
    }
    
    private void startAnaMainGaode(RectangleCoordinate coordinate) throws AnalysisException {
        //当前爬取的数据的页数索引
        int page_num = 0;
        //当前爬取内容是否是最后一页
        boolean isLastPage = false;
        JSONObject searchResult;
        JSONArray datas = null;
        logger.info("ready to analysis coordinate:[{}]", coordinate.toString());
        while (!isLastPage) {
            logger.info("is going to get data for page_" + page_num);
            try {
                searchResult = getSearchResult(coordinate, page_num);
                datas = searchResult.getJSONArray("pois");
            } catch (Exception e) {
                logger.error("an error occurred when getting response of gaode map data for coordinate:[{}]", coordinate.toString());
            }
            if (datas != null && datas.size() < 20) {
                isLastPage = true;
                logger.info("get result counts is [{}], now page index is [{}]", datas.size(), page_num);
            }
            saveIntoDbGaode(datas);
            page_num++;
        }
    }
    
    private void saveIntoDbGaode(JSONArray result) {
        JSONObject resultItem;
    
        for (int i = 0; i < result.size(); i++) {
            resultItem = result.getJSONObject(i);
            try {
                results.add(getInsertUnitObject(resultItem));
            } catch (Exception e) {
                logger.error("生成数据时异常,e: {}", e.getMessage());
                e.printStackTrace();
            }
        }
        if (results.size() > BATCHINSERTLIMIT || ISLAST) {
            logger.info("is ready to batch insert into unit, total count is {}", results.size());
            try {
                dao.batchAddUnitGaode(results);
            } catch (Exception e) {
                logger.error("更新数据库异常,e: {}", e.getMessage());
            }
            results = new JSONArray();
        }
    }
    
    private JSONObject getInsertUnitObject(JSONObject resultItem) {
        JSONObject unitDataObject = new JSONObject();
        unitDataObject.put("uid", resultItem.getString("id"));
        unitDataObject.put("name", resultItem.getString("name"));
        unitDataObject.put("type", resultItem.getString("type"));
        unitDataObject.put("tag", resultItem.getString("type"));
        unitDataObject.put("address", resultItem.getString("address"));
        unitDataObject.put("province", resultItem.getString("pname"));
        unitDataObject.put("city", resultItem.getString("cityname"));
        unitDataObject.put("area", resultItem.getString("adname"));
    
        String tel = resultItem.getString("tel");
        if (tel != null && !"[]".equals(tel)) {
            unitDataObject.put("telephone", tel);
        }
    
        try {
            JSONArray url = resultItem.getJSONArray("website");
            if (url != null && url.size() > 0) {
                unitDataObject.put("detail_url", url.getString(0));
            }
        } catch (Exception e) {
            unitDataObject.put("detail_url", resultItem.getString("website"));
        }
    
        JSONArray photos = resultItem.getJSONArray("photos");
        if (photos != null && photos.size() > 0) {
            StringBuilder images = new StringBuilder();
            for (int j = 0; j < photos.size(); j++) {
                images.append(j == 0 ? "" : ";").append(photos.getJSONObject(j).getString("url"));
            }
            unitDataObject.put("images", images.toString());
        }
    
        String entr_location = resultItem.getString("location");
        if (StringUtils.isEmpty(entr_location)) {
            entr_location = resultItem.getString("entr_location");
        }
    
        if (!StringUtils.isEmpty(entr_location)) {
            unitDataObject.put("lng", entr_location.split(",")[0]);
            unitDataObject.put("lat", entr_location.split(",")[1]);
        }
        return unitDataObject;
    }
    
    private String getRequestGaodeUrl(RectangleCoordinate coordinate, int page) {
        return "https://restapi.amap.com/v3/place/polygon?" +
                "key=xxxxxxxxxxxxxxxxxxxxxxx&polygon=" + coordinate.toString() + "&page=" + page + "&types=010000|" +
                "010100|010101|010102|010103|010104|010105|010107|010108|010109|010110|010111|010112|010200|010300|010400|" +
                "010401|010500|010600|010700|010800|010900|010901|011000|011100|020000|020100|020101|020102|020103|020104|" +
                "020105|020106|020200|020201|020202|020203|020300|020301|020400|020401|020402|020403|020404|020405|020406|" +
                "020407|020408|020600|020601|020602|020700|020701|020702|020703|020800|020900|020904|020905|021000|021001|" +
                "021002|021003|021004|021100|021200|021201|021202|021203|021300|021301|021400|021401|021500|021501|021600|" +
                "021601|021602|021700|021701|021702|021800|021802|021803|021804|021900|022000|022100|022200|022300|022301|" +
                "022400|022500|022501|022502|022600|022700|022800|022900|023000|023100|023200|023300|023301|023400|023500|" +
                "025000|025100|025200|025300|025400|025500|025600|025700|025800|025900|026000|026100|026200|026300|029900|" +
                "030000|030100|030200|030201|030202|030203|030204|030205|030206|030300|030301|030302|030303|030400|030401|" +
                "030500|030501|030502|030503|030504|030505|030506|030507|030508|030700|030701|030702|030800|030801|030802|" +
                "030803|030900|031000|031004|031005|031100|031101|031102|031103|031104|031200|031300|031301|031302|031303|" +
                "031400|031401|031500|031501|031600|031601|031700|031701|031702|031800|031801|031802|031900|031902|031903|" +
                "031904|032000|032100|032200|032300|032400|032401|032500|032600|032601|032602|032700|032800|032900|033000|" +
                "033100|033200|033300|033400|033401|033500|033600|035000|035100|035200|035300|035400|035500|035600|035700|" +
                "035800|035900|036000|036100|036200|036300|039900|040000|040100|040101|040200|040201|050000|050100|050101|" +
                "050102|050103|050104|050105|050106|050107|050108|050109|050110|050111|050112|050113|050114|050115|050116|" +
                "050117|050118|050119|050120|050121|050122|050123|050200|050201|050202|050203|050204|050205|050206|050207|" +
                "050208|050209|050210|050211|050212|050213|050214|050215|050216|050217|050300|050301|050302|050303|050304|" +
                "050305|050306|050307|050308|050309|050310|050311|050400|050500|050501|050502|050503|050504|050600|050700|" +
                "050800|050900|060000|060100|060101|060102|060103|060200|060201|060202|060300|060301|060302|060303|060304|" +
                "060305|060306|060307|060308|060400|060401|060402|060403|060404|060405|060406|060407|060408|060409|060411|" +
                "060413|060414|060415|060500|060501|060502|060600|060601|060602|060603|060604|060605|060606|060700|060701|" +
                "060702|060703|060704|060705|060706|060800|060900|060901|060902|060903|060904|060905|060906|060907|061000|" +
                "061001|061100|061101|061102|061103|061104|061200|061201|061202|061203|061204|061205|061206|061207|061208|" +
                "061209|061210|061211|061212|061213|061214|061300|061301|061302|061400|061401|070000|070100|070200|070201|" +
                "070202|070203|070300|070301|070302|070303|070304|070305|070306|070400|070401|070500|070501|070600|070601|" +
                "070603|070604|070605|070606|070607|070608|070609|070610|070700|070701|070702|070703|070704|070705|070706|" +
                "070800|070900|071000|071100|071200|071300|071400|071500|071600|071700|071800|071801|071900|071901|071902|" +
                "071903|072000|072001|080000|080100|080101|080102|080103|080104|080105|080106|080107|080108|080109|080110|" +
                "080111|080112|080113|080114|080115|080116|080117|080118|080119|080200|080201|080202|080300|080301|080302|" +
                "080303|080304|080305|080306|080307|080308|080400|080401|080402|080500|080501|080502|080503|080504|080505|" +
                "080600|080601|080602|080603|090000|090100|090101|090102|090200|090201|090202|090203|090204|090205|090206|" +
                "090207|090208|090209|090210|090211|090300|090400|090500|090600|090601|090602|090700|090701|090702|100000|" +
                "100100|100101|100102|100103|100104|100105|100200|100201|110000|110100|110101|110102|110103|110104|110105|" +
                "110106|110200|110201|110202|110203|110204|110205|110206|110207|110208|110209|120000|120100|120200|120201|" +
                "120202|120203|120300|120301|120302|120303|120304|130000|130100|130101|130102|130103|130104|130105|130106|" +
                "130107|130200|130201|130202|130300|130400|130401|130402|130403|130404|130405|130406|130407|130408|130409|" +
                "130500|130501|130502|130503|130504|130505|130506|130600|130601|130602|130603|130604|130605|130606|130700|" +
                "130701|130702|130703|140000|140100|140101|140102|140200|140201|140300|140400|140500|140600|140700|140800|" +
                "140900|141000|141100|141101|141102|141103|141104|141105|141200|141201|141202|141203|141204|141205|141206|" +
                "141207|141300|141400|141500|150000|150100|150101|150102|150104|150105|150106|150107|150200|150201|150202|" +
                "150203|150204|150205|150206|150207|150208|150209|150210|150300|150301|150302|150303|150304|150400|150500|" +
                "150501|150600|150700|150701|150702|150703|150800|150900|150903|150904|150905|150906|150907|150908|150909|" +
                "151000|151100|151200|151300|160000|160100|160101|160102|160103|160104|160105|160106|160107|160108|160109|" +
                "160110|160111|160112|160113|160114|160115|160117|160118|160119|160120|160121|160122|160123|160124|160125|" +
                "160126|160127|160128|160129|160130|160131|160132|160133|160134|160135|160136|160137|160138|160139|160140|" +
                "160141|160142|160143|160144|160145|160146|160147|160148|160149|160150|160151|160152|160200|160300|160301|" +
                "160302|160303|160304|160305|160306|160307|160308|160309|160310|160311|160312|160314|160315|160316|160317|" +
                "160318|160319|160320|160321|160322|160323|160324|160325|160326|160327|160328|160329|160330|160331|160332|" +
                "160333|160334|160335|160336|160337|160338|160339|160340|160341|160342|160343|160344|160345|160346|160347|" +
                "160348|160349|160400|160401|160402|160403|160404|160405|160406|160407|160408|160500|160501|160600|170000|" +
                "170100|170200|170201|170202|170203|170204|170205|170206|170207|170208|170209|170300|170400|170401|170402|" +
                "170403|170404|170405|170406|170407|170408|180000|180100|180101|180102|180103|180104|180200|180201|180202|" +
                "180203|180300|180301|180302|180400|180500|190000|190100|190101|190102|190103|190104|190105|190106|190107|" +
                "190108|190109|190200|190201|190202|190203|190204|190205|190300|190301|190302|190303|190304|190305|190306|" +
                "190307|190308|190309|190310|190311|190400|190401|190402|190403|190500|190600|190700|200000|200100|200200|" +
                "200300|200301|200302|200303|200304|200400|220000|220100|220101|220102|220103|220104|220105|220106|220107|" +
                "220200|220201|220202|220203|220204|220205|970000|990000|991000|991001|991400|991401|991500&extensions=all";
    }
    
    /**
     * 矩形块的经纬度标识, 左上角的经纬度 和右下角的经纬度
     */
    class RectangleCoordinate {
    
        /**
         * 矩形左上角经度
         */
        private double x0;
    
        /**
         * 矩形左上角纬度
         */
        private double y0;
    
        /**
         * 矩形右下角经度
         */
        private double x1;
    
        /**
         * 矩形右下角纬度
         */
        private double y1;
    
    
        public RectangleCoordinate(double x0, double y0, double x1, double y1) {
            this.x0 = x0;
            this.y0 = y0;
            this.x1 = x1;
            this.y1 = y1;
        }
    
        /**
         * @return 获取矩形中心线的纬度
         */
        public double getAverageY() {
            return (y0 + y1) / 2;
        }
    
        /**
         * @return 获取矩形中心线的经度
         */
        public double getAverageX() {
            return (x0 + x1) / 2;
        }
    
        public double getX0() {
            return x0;
        }
    
        public void setX0(double x0) {
            this.x0 = x0;
        }
    
        public double getY0() {
            return y0;
        }
    
        public void setY0(double y0) {
            this.y0 = y0;
        }
    
        public double getX1() {
            return x1;
        }
    
        public void setX1(double x1) {
            this.x1 = x1;
        }
    
        public double getY1() {
            return y1;
        }
    
        public void setY1(double y1) {
            this.y1 = y1;
        }
    
        @Override
        public String toString() {
            return x0 + "," + y0 + "|" + x1 + "," + y1;
        }
    }

    更新(2018-09-20):

    1、时间问题,当前50ms请求一次api接口,跑完小县城的数据(几万条)大概需要十分钟左右吧,把整个市区主要数据跑完断断续续的用了一天吧,最后跑了近27W数据

    2、应用问题,原本的想法就是做个简单的小程序,把跑来的数据加以利用,做个电话本类似的应用,具体可以扫下方小程序码体验

      


    本文来自云栖社区合作伙伴“开源中国”

    本文作者:王练

    原文链接

     

     

     

    展开全文
  • 最近项目需求把发送定位模块改成类似微信发送位置给好友的效果,我使用了高德地图实现了一个demo,效果图如下: 从主界面中我们可以看到中心标记上面显示的就是我们定位的地址,下面是一个listview列表,第一条item...
  • CSDN有很多关于高德地图poi爬取的文章,python代码也是无数,真正能实现我们需要的功能的代码和文章却寥寥无几。本文将从高德地图api获取开始讲起,希望能帮助大家真正理解高德地图到底能为我们的工作和学习做些什么...

    一、关于高德地图

    高德是中国领先的数字地图内容、导航和位置服务解决方案提供商。高德地图产品更多的还是我们查找位置和路线的一个工具,但实际上地图能够实现的层面还有很多,甚至是将现实的商家店铺以及场所搬至虚拟的地图上,然后每个地理位置对应的是一个POI点。这样一来,地图呈现的将不再是一张标有地理位置的图片,而是一个虚拟的现实世界。POI编码表
    poi编码表(更新时间2017年8月10日)

    二、简述爬虫原理

    这个世界上最大的网络爬虫是搜索引擎(百度、谷歌等),通过网址、关键词模糊查询等方式就可以返回一个网页或者众多的词条数据。只不过我们需要通过机器语言(python、java等)对这些数据的源码进行解析才能使其成为结构化的数据(csv、xlsx等格式),便于我们分析和处理。(如果有需要爬虫一般网页(淘宝、链家网)数据的同学,后期我会更新这方面的内容)
    地图和一般的网页数据有一点区别,是因为地图和有道词典在线翻译类似,使用了一种非常简便的网页开发技术–Ajax。
    高德地图中整合了众多深度POI点,这些POI点也就是高德地图搜索内容中的23个关键词类别。当我们需要在高德地图上搜索某个地点(poi)时,需要输入这个地点关键词。然后高德地图就会返回与这个关键词匹配的地点(poi),这是一种最简单的爬虫,既不能以某种格式(csv或xlsx)储存在我们的电脑中(只能在浏览器或app中查看),返回的poi数量也非常有限。
    高德地图已开放地图基础服务API接口,我们可以从这个接口获取高德地图的各种数据,今天我们只对poi数据爬取进行讲解。

    三、申请高德地图开发者账户

    地址:https://lbs.amap.com/
    一般情况下,申请成为个人开发者:填写个人信息(包括:姓名、手机、邮箱等),信息验证成功后,即可成为高德个人开发者。

    四、申请key

    控制台→应用管理→我的应用→创建新应用→添加key(非常简单,不赘述)基础服务API调用量

    五、通过python实现高德地图poi数据的爬虫

    1、查阅高德城市编码表(地址:https://lbs.amap.com/api/webservice/download)
    2、找到需要的城市,复制adcode,比如北京市;
    城市编码(北京)
    3、代码:

    import requests
    import pandas as pd
    import json
    import time
    import math
    
    ad = input("请输入需要爬取的城市名称:")
    #感谢郑允豪@Smart3S的基础代码和思路,划分城市行政区的方式,帮我们实现了突破高德地图20*45条限制。
    #由于篇幅限制,下述其他城市行政区代码,读者可自行根据高德地图官方提供的城市编码进行添加。
    if ad == "天津市":
    	arr=['120101','120102','120103','120104''120105','120106','120110','120111','120112','120113','120114','120115','120116','120117','120118','120119']
    elif ad == "北京市":
        arr=['110101','110102','110105','110106','110107','110108','110109','110111','110112','110113','110114','110115','110116','110117','110118','110119']
    
    
    key_word = input("请输入需要爬取的关键词:")
    key_=input("请输入高德地图控制台key密钥(数据量大时需申请多个密钥):")
    url1="https://restapi.amap.com/v3/place/text?keywords="+str(key_word)+"&city="
    url2="&output=JSON&offset=20&key="+str(key_)+"&extensions=all&page="
    x=[]
    num=0
    for i in range(0,len(arr)):
            city=arr[i]
            for page in range(1,46):
                if page==45:
                    print("警告!!POI检索可能受到限制!!")
                thisUrl=url1+city+url2+str(page)
                data=requests.get(thisUrl)
                s=data.json()
                aa=s["pois"]
                if len(aa)==0:
                    break
                for k in range(0,len(aa)):
                        s1=aa[k]["name"]
                        s2=aa[k]["type"]
                        s3=aa[k]["address"]
                        s4=aa[k]["adname"]
                        s5=aa[k]["location"].split(",")
                        x.append([s1,s2,s3,s4,float(s5[0]),float(s5[1])])
                        num+=1
                        print("爬取了 "+str(num)+" 条数据")
     
    c = pd.DataFrame(x)
    #可更换存储路径
    c.to_csv('**E:/高德地图爬取/**'+str(key_word)+'('+str(ad)+')'+'.csv',encoding='utf-8-sig')
    
    print(str(key_word)+'('+str(ad)+')'+'数据爬取完毕!')
    print('100秒后,将关闭此窗口!')
    time.sleep(100)
    

    六、pyinstaller打包.py文件成.exe可执行文件

    安装pyinstaller

    .py文件只能在装有python环境的设备上运行,如果一个设备没有安装python及需要的第三方库,是无法运行.py文件的。
    如果你编写了一个python程序,需要分享给你的一个朋友,恰巧你朋友的设备没有安装python,这是就需要用到pyinstaller了,打包成exe文件后可在同类型的系统中运行。
    方法一:打开CMD,运行pip install pyinstaller
    不行?试试第二种方法,设置延迟,添加国内源
    方法二:打开CMD,运行pip install pyinstaller --default-timeout=100 -i https://pypi.tuna.tsinghua.edu.cn/simple
    不行?试试第三种方式,下载pyinstaller
    方法三:1、下载pyinstaller,地址:http://www.pyinstaller.org/downloads.html
    2、将其解压至python安装目录下
    3、打开CMD,运行cd C:\Program Files\Python37-32\PyInstaller-3.5
    python setup.py install

    pyinstaller打包.py

    方法一:在xxx.py同目录下按住shift右键打开CMD(命令窗口),运行pyinstaller -F xxx.py
    如果你这样能打包成功并且能够成功运行,那么恭喜你,hin优秀!
    如果不行,我说一下我遇到的坑。。。。。。
    1、递归深度问题
    Python默认的递归深度是有限制的,当递归深度超过默认值的时候,用pyinstaller打包时
    就会引发RecursionError:maximum recursion depth exceeded while calling a python object。
    这个问题一般会出现在执行“方法一”后出现下图的情况:递归错误
    解决方法:最大递归层次的重新调整,解决方式是手工设置递归调用深度。
    我的解决方式需要用到执行“方法一”后生成在同目录下的一个文件——xxx.spec,用记事本打开添加下列语句:
    import sys
    sys.setrecursionlimit(10000)递归错误解决方式
    之后,我们需要对xxx.spec文件进行打包操作。
    2、lib not found
    在同目录下右键打开CMD,执行pyinstaller -F xxx.spec
    出现了这个问题:缺乏依赖
    解决方法:上图(1)libzmq.cp37-win32.pyd;
    (2)C:\Program Files\Python37-32\Lib\site-packages\zmq\backend\cython,
    一个文件,一个路径,这代表什么呢?
    教大家一个出现类似问题的解决方式:在路径中没有找到该文件,很简单,我们在python安装路径下查找一下该文件,发现它在C:\Program Files\Python37-32\Lib\site-packages\zmq中,我们把这个文件复制到C:\Program Files\Python37-32\Lib\site-packages\zmq\backend\cython中就ok了。依赖缺乏解决
    3、缺乏numpy模块
    终于生成了xxx.exe文件,运行一下,又出现了一个问题:numpy缺乏
    解决方法:缺乏numpy模块,不一定是你没有安装,如果是,请安装;下面我说说安装了numpy也出现问题的情况,问题可能在版本上;
    打开CMD,执行两行代码:(1)pip uninstall numpy (2)pip install numpy==1.16.2

    完美解决!!!!!!!!!!

    七、POI.exe功能简述

    此程序要实现的功能是输入城市名称(市级)、关键词、key,3个参数,获取城市范围内所有区(县)的“关键词”poi数据。
    思路:1、由于高德地图有20*45条poi的限制,所以每次能爬取45页,需要尽可能的缩小爬取范围,才能尽可能多的获取poi数据;
    2、所以我们最应该考虑的问题是缩小范围,利用程序对城市内每一个区县行政区分别进行爬虫,以获取最大poi数量;

    八、运行POI.exe

    1、双击POI.exe
    2、由于key的输入有点困难,我们通常需要复制,在打开程序后需要右击程序上边缘→属性→勾选“快速编辑模式”(定位好光标,右键即可粘贴)快速编辑模式
    3、输入城市名称(例如广州市):
    输入城市名称
    4、输入关键词(例如学校)、key(前面有申请方式):
    输入关键词、key
    5、爬虫结束
    爬虫结束
    6、查看爬虫结果(注:存储为.csv文件,在E:/高德地图爬取/文件中(可在程序中更改存储路径),此数据可利用后两列(4、5)坐标–火星坐标系,在gis中进行可视化)
    爬虫结果

    九、总结

    1、利用python编写爬虫程序,优点就是语句简洁,上手简单;
    2、python依赖的第三方库非常多,下载安装常常会出现问题,需多在百度、CSDN上查找类似问题的解决方式;
    3、python非常不适合可执行文件.exe的编写,打包问题非常多,所以还是尽量在python环境中直接运行;
    4、本文编写的POI.exe程序在win32系统中打包,所以可能只能在类似环境中运行;
    5、爬虫结果可在gis中进行可视化,如需坐标转换,请自行研究。

    展开全文
  • 获取高德地图POI数据

    2021-05-22 15:10:37
    完整代码如下,需要先行申请开发者KEY,代码先放在这里,开发思路以后有时间再详细写。 需要使用的话,可以下载下面编译好的程序 ...

    完整代码如下,需要先行申请开发者KEY,代码先放在这里,开发思路以后有时间再详细写。
    需要使用的话,可以下载下面编译好的程序
    https://download.csdn.net/download/ashtyukjhf/18860618

    import requests
    
    class getPOI():
        def getPOIcore(self):
            url=u"https://restapi.amap.com/v3/place/text?parameters"
            r=requests.get(url, params=self.params)
            data=eval(r.text)
            self.count=int(data['count'])
            
            for poi in data['pois']:
                try:
                    print(poi['id'],poi['name'],poi['adname'],poi['business_area'],poi['address'],poi['location'],poi['type'],sep=',',file=self.outfile)
                except :pass
    
        def __init__(self,region:str,keywords='',types=''):
            if keywords==types=='':
                print("类型和关键字不能同时为空")
            self.params={
                'key': '######请到高德开放平台申请#####',
                'keywords': keywords,
                'types':types,
                'region':region,
                'page':1,
                'city_limit':'true',
                'extensions':'all'
            }
    
            filename=region+keywords+types+'POI数据.csv'
    
            headers=['id','名称','区县','商圈','地址','经度,纬度','类型']
    
            with open(filename, mode='w+', encoding='utf-8') as self.outfile:
                print(*headers, sep=',',file=self.outfile)
                i=0
                while True:
                    i+=1;
                    self.params['page']=i
                    self.getPOIcore()
                    if i==1:
                        print(region,keywords,types,'总计数据',self.count,'条')
                    if i>int(self.count/20):
                        break
                
    
            pass
    
    
    
    
    
    
    print('使用说明:\n输入区域、关键字或类型,即可获取相应POI数据\n其中类型和关键字可有一项为空\n例如:\n区域:岳麓区\n关键字:\n类型:餐饮\n\n\n')
    region=input('请指定区域:')
    keywords=input('指定关键字:')
    types=input('指定类型:')
    
    getPOI(region=region,keywords=keywords,types=types)
    
    input('数据获取完毕')
    
    展开全文
  • Android实现高德地图POI搜索

    千次阅读 热门讨论 2015-12-08 23:55:27
    效果图如下: 导入高德地图的搜索服务包到工程的libs目录中,并配置好权限与用户KEY。 权限如下: <uses-pe
  • 这是一个爬取互联网开放的POI数据以及POI边界坐标代码集,包括高德和百度地图,可以...高德地图POI数据爬取 poi-city 划分行政区划来爬取指定城市范围内的POI数据 poi-pology 划分矩形网格来爬取指定城市的POI数据 p
  • 1.打开页面自动定位,同时搜索周边所有poi 2.点击搜索按钮,输入关键子,获取关键字搜索结果 3。选取listview中的一项即可定位到该位置,或者获取任何消息 4.文件类 1、MapActivity public class MapActivity ...
  • 具体功能业务点赞私信我
  • 找了好久的原因,查到官方调用方法,翻到版本更新日志才找到,长话短说,高德地图版本升级所致。 V7.6.0之前都是默认的EXTENSIONS_BASE,新版本中需要返回所有信息设置为 EXTENSIONS_ALL 即可。 解决方案:query....
  • 一、高德地图poi分析 1.首先点开高德地图api的官网 2.找到开发支持下的 web服务api点击进入 3.根据需求不同使用不同的api调用来获取高德地图所给的api数据 文档写的十分详细 下面我也会继续讲下面的部分 有能力看...
  • 前提:在使用Hbuilder+高德JS,开发APP的时候,希望在使用高德地图POI检索地址,并在地图上定位,当中使用了高德地图的js文件, 参考高德官网提供 demo,发现js一直报错 【 AMapUI is not defined】,按照网上搜索...
  • 因项目需要爬取XX市XX区的poi信息,上网找了很多的教程,都需要注册高德的开发控制台,通过调用高德提供的api方式获取poi信息,但是有次数限制。所以自己搞了个"爬虫"。 1、思路: 打开高德地图浏览时,拖地地图,会...
  • 认识高德地图API 打开“高德开放平台”,点击“开发文档”,在“Web服务”下寻找并点击“搜索API”。 我们使用“搜索API”,为的是爬取POI。所谓POI,即“Point of Interest”,中文名叫“兴趣点”。POI分为各种...
  • 我搜索字符串“另类公社” 高德地图里可以搜到,自己调用onPoiSearched() 却搜不到,List<PoiItem> poiItems = poiResult.getPois(); 这个poiItems.size()=0,sdk已经是最新的了。
  • 手机高德地图poi搜索有两种方式:1、关键字自动提示。2、输入关键字后点击搜索,显示出poi以距离排序的列表展示。 首先,我们来看第一种方式。但凡你多浏览了开发文档,不难找到有介绍实现该功能的方法——输入内容...
  • 废话不多说,先看效果,如果大家感觉不错,请参考实现代码 这个功能我是用Fragmentdialog里面做的,也遇到不少坑 第一,就是设置背景的drawable为纯白色导致键盘弹出的时候,recyclerview的布局被顶上去导致出现白色...
  • 以前给大家写了一篇高德地图定位功能实现,今天给大家带来如何实现高德地图POI周边位置检索。 配置高德地图API 首先登陆高德地图API官网(https://lbs.amap.com/),点击右上角控制台: 点击右上角创建应用,...
  • 前几天高德POI Search库版本更新到了7.6.0,然后开发的是否突然发现我的poi搜索没有省市县信息了。 解决办法: PoiSearch.Query需要设置一个参数:PoiSearch.EXTENSIONS_ALL kotlin: query.extensions=PoiSearch....
  • 高德地图——关键字检索POI

    万次阅读 2018-09-20 18:44:46
    如何你想集成高德地图SDK:跳转这儿 如何你想获取定位信息:跳转这儿 下面我们介绍下:根据关键字检索适用于在某个城市搜索某个名称相关的POI 即类似于 朋友圈获取附近位置功能 先看下效果图: 下面介绍怎么...
  • 高德地图自定义POI的样式

    万次阅读 热门讨论 2014-10-09 16:07:30
    前段时间在开发一个地图相关的软件,本来
  • 高德地图API POI分类编码表(mysql版) 编码表更新时间:2017年8月10日 注意:本编码表为高德地图自定义编码格式,数据会根据行政区划变动不定期进行更新。SET FOREIGN_KEY_CHECKS=0;-- -------------------------...
  • 高德地图开发

    2017-10-17 08:56:15
    一、 要实现高德地图定位呢,首先需要做好以下几步准备: 1. 在高德开放平台注册帐号 注册地址:http://lbs.amap.com 2. 在开发中下载Android平台下的地图SDK和定位SDK文件 进入相关下载下载自己想要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,025
精华内容 410
关键字:

高德地图poi开发