高德地图_高德地图 点击跳转高德地图导航 - CSDN
高德地图 订阅
高德是中国领先的数字地图内容、导航和位置服务解决方案提供商。拥有导航电子地图甲级测绘资质、测绘航空摄影甲级资质和互联网地图服务甲级测绘资质“三甲”资质,其优质的电子地图数据库成为公司的核心竞争力。公司2010年登陆美国纳斯达克全球精选市场(NasdaqAMAP)。2014年12月,高德发布了“出行保障”计划,宣布此项服务长期有效,而且最高赔付额度提高到了1000元。 [1]  2018年6月5日 苹果在美国时间6月4日的苹果开发者大会上,发布了最新的iOS 12操作系统,CarPlay支持高德地图。 [2] 展开全文
高德是中国领先的数字地图内容、导航和位置服务解决方案提供商。拥有导航电子地图甲级测绘资质、测绘航空摄影甲级资质和互联网地图服务甲级测绘资质“三甲”资质,其优质的电子地图数据库成为公司的核心竞争力。公司2010年登陆美国纳斯达克全球精选市场(NasdaqAMAP)。2014年12月,高德发布了“出行保障”计划,宣布此项服务长期有效,而且最高赔付额度提高到了1000元。 [1]  2018年6月5日 苹果在美国时间6月4日的苹果开发者大会上,发布了最新的iOS 12操作系统,CarPlay支持高德地图。 [2]
信息
软件大小
114.52MB [4]
开发商
高德软件有限公司 [5]
最新版本
10.05.2.2639 [4]
软件类型
旅游出行 [4]
中文名
高德地图 [3]
上市时间
2010年
官    网
http://ditu.amap.com/
外文名
Amap
高德地图功能
最新地图浏览器:最新矢量地图渲染,最高质量地图效果、最丰富数据信息、最快速操作体验、最节省数据流量。专业地图服务:实地采集、网络采集,行业领先。2000万POI信息,每年四次信息更新 高德地图(5张) 领先的地图渲染技术:性能提升10倍,所占空间降低80%,比传统地图软件节省流量超过90%专业在线导航功能:覆盖全国364个城市、全国道路里程352万公里在线导航功能:最新高德在线导航引擎,全程语音指引提示,完善偏航判定和偏航重导功能。AR虚拟实景:AR功能结合手机摄像头和用户位置、方向等信息,将信息点以更直观的方式展现给用户,为发现和目标地点指引丰富的出行查询功能:地名信息查询、分类信息查询、公交换乘、驾车路线规划、公交线路查询、位置收藏夹等丰富的基础地理信息查询工具。锁屏语音提示,即使你的手机在锁屏状态也能听到高德导航的语音提示,不用担心一直开着手机屏幕费电了。夜间导航HUD抬头提示,打开高德导航并开启HUD,把手机放到汽车挡风玻璃下,高德导航会把路线提示倒映到汽车挡风玻璃上,看起来特别方便,不用担心低头看手机影响驾驶了。动态导航交通路况实时播报智能计算到达目的地所需的时间避堵路线方案规划摄像头提醒离线下载2D、3D离线地图分地区下载地图包全国地图包、全国概要图地图搜索热门地点、线路搜索公交、自驾出行线路规划公交、火车、天气查询服务全新引擎最新3D版本,360度旋转视角矢量数据传送观看更流畅、更清晰兴趣点餐饮、住宿、优惠、演出、团购全覆盖海量兴趣点随意搜叫车服务2013年7月,高德地图更新,新增打车功能,综合快的打车、嘀嘀打车两家资源,覆盖80%市场份额。与阿里合作后,高德地图凭借高市场占有率,逐渐从单一地图向LBS工具箱转变。新版高德地图不仅增加了可预约的出租车数量,提高了打车效率,覆盖城市也扩展到26个。推出顺风车业务2018年3月27日,高德地图宣布推出顺风车业务,成都、武汉两地率先上线,同时开启北京、上海、广州、深圳、杭州等城市的车主招募,之后逐步向全国更多城市拓展。高德表示,该公益顺风车平台没有任何商业化目的,承诺对用户永不抽佣,也不会打补贴战,而是基于其长期积累的自驾出行用户及出行调度能力,在不增加城市道路压力的情况下,以科技手段提升运力,及社会出行效率,缓解城市交通拥堵。 [6]  高德智慧景区2.02018年11月1日,高德地图宣布,“一张地图游乌镇”正式上线,这是继高德智慧景区2.0建设的 “智能云台山”之后落地的人文智慧景区产品。 [7]  多方向实时路况2018年11月,高德地图宣布在业内首次推出“多方向实时路况”,它实现了路口处的车道级导航能力,能对路口车辆进行更精准引导,称每天可为用户出行节约近10万小时。 [8]  返程直通车2020年2月15日,高德地图上线“返程直通车”一站式服务,通过疫情信息提醒、防疫检查站及高速收费站实时车流信息、返程人员信息在线登记等多项功能,帮助自驾返程用户更好规划行程,减少返程途中在疫情检查站的停留和等待时间。 [9]  家人地图2020年7月14日,高德上线了“家人地图”功能。用户可以让家人随时看到彼此的位置,特别是针对空巢老人家庭,子女忙于工作,父母独自在家,老人有没有出门,外出去到了哪里,有没有偏离日常行动轨迹,都可以在地图上随时查看。 [10] 
收起全文
  • 通过本课程的学习,大家可以系统的学习高德地图各个接口如何在自己的项目中使用。以及如何进行扩展学习。 学习完本课程可以继续学习“Web前端开发仿美团/饿了吗移动App之高德地图接口对接案例”, 主要内容: ...
  • 高德地图-绘制路线

    2019-04-25 09:10:00
    高德地图-绘制路线 效果如下图: #步骤一:使用高德地图 JS API 开发地图应用之前的一些准备工作 1.1. 在页面添加 JS API 的入口脚本标签,并将其中「您申请的key值」替换为您刚刚申请的 key; HTML <...

    高德地图-绘制路线

    效果如下图:

    绘制景点之前的路线

    步骤一:使用高德地图 JS API 开发地图应用之前的一些准备工作

    1.1. 在页面添加 JS API 的入口脚本标签,并将其中「您申请的key值」替换为您刚刚申请的 key;

    HTML
    <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.14&key=您申请的key值"></script> 
    

    1.2. 添加div标签作为地图容器,同时为该div指定id属性;

    HTML
    <div id="container"></div> 
    

    1.3.为地图容器指定高度、宽度;

    CSS
    #container {width:300px; height: 180px; }  
    

    1.4. 进行移动端开发时,请在head内添加viewport设置,以达到最佳的绘制性能;

    HTML
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> 
    

    步骤二:创建地图及添加景点标记

    2.1创建地图

    JavaScript
    var map = new AMap.Map('container',{
        zoom: 10,  //设置地图显示的缩放级别
        center: [116.397428, 39.90923],//设置地图中心点坐标
        layers: [new AMap.TileLayer.Satellite()],  //设置图层,可设置成包含一个或多个图层的数组
        mapStyle: 'amap://styles/whitesmoke',  //设置地图的显示样式
        viewMode: '2D',  //设置地图模式
        lang:'zh_cn',  //设置地图语言类型
    });
    
    构造函数 说明 是否插件
    AMap.Map(container:String/HTMLDivElement, opts:MapOptions) 构造一个地图对象,参数container中传入地图容器DIV的ID值或者DIV对象,opts地图初始化参数对象
    MapOptions 类型 说明
    view View2D 地图视口,用于控制影响地图静态显示的属性,如:地图中心点“center”推荐直接使用zoom、center属性为地图指定级别和中心点
    layers Array 地图图层数组,数组可以是图层 中的一个或多个,默认为普通二维地图。当叠加多个图层时,普通二维地图需通过实例化一个TileLayer类实现
    zoom Number 地图显示的缩放级别
    center LngLat 地图中心点坐标值
    labelzIndex Number 地图标注显示顺序,大于110即可将底图上的默认标注显示在覆盖物(圆、折线、面)之上。
    zooms Array 地图显示的缩放级别范围在PC上,默认为[3,18],取值范围[3-18];在移动设备上,默认为[3,19],取值范围[3-19]
    lang String 地图语言类型可选值:zh_cn:中文简体,en:英文,zh_en:中英文对照默认为: zh_cn:中文简体注:由于图面内容限制,中文、英文 、中英文地图POI可能存在不一致的情况

    2.2.自定义景点标记

    (链接参考:https://lbs.amap.com/api/javascript-api/example/marker/adaptive-show-multiple-markers)

    JavaScript
     map.clearMap();  // 清除地图覆盖物
        //景点数据(后台数据)
        var markers = [{
            icon: '//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-1.png',
            position: [116.205467, 39.907761]
        }, {
            icon: '//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-2.png',
            position: [116.368904, 39.913423]
        }, {
            icon: '//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-3.png',
            position: [116.305467, 39.807761]
        }];
    
        // 添加一些分布不均的点到地图上,地图上添加三个点标记,作为参照
        markers.forEach(function(marker) {
            new AMap.Marker({
                map: map,
                icon: marker.icon,
                position: [marker.position[0], marker.position[1]],
                offset: new AMap.Pixel(-13, -30)
            });
        });
    
        var center = map.getCenter();
    
        var centerText = '当前中心点坐标:' + center.getLng() + ',' + center.getLat();
        document.getElementById('centerCoord').innerHTML = centerText;
        document.getElementById('tips').innerHTML = '成功添加三个点标记,其中有两个在当前地图视野外!';
    

    步骤三:用矢量图绘制路线

    (链接参考:https://lbs.amap.com/api/javascript-api/example/overlayers/polyline-draw-and-edit)

    3.1.绘制开始及结束

    HTML
       <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
       <script src="https://webapi.amap.com/maps?v=1.4.14&key=您申请的key值&plugin=AMap.PolyEditor"></script>
       <script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
    });
    
    HTML
       <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
       <script src="https://webapi.amap.com/maps?v=1.4.14&key=您申请的key值&plugin=AMap.MouseTool"></script>
       <script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
    });
    
    //开始绘制路线
    var path = [
          [116.362209, 39.887487],
          [116.422897, 39.878002],
          [116.372105, 39.90651],
          [116.428945, 39.89663]
      ];
    var mouseTool = new AMap.MouseTool(map)
    //定义线的风格
    function drawPolyline () {
       mouseTool.polyline({
           path: path,
           isOutline: true,
           outlineColor: '#ffeeff',
           borderWeight: 3,
           strokeColor: "#3366FF", 
           strokeOpacity: 1,
           strokeWeight: 6,
           // 折线样式还支持 'dashed'
           strokeStyle: "solid",
           // strokeStyle是dashed时有效
           strokeDasharray: [10, 5],
           lineJoin: 'round',
           lineCap: 'round',
           zIndex: 50,
       });
    }
    //结束绘制路线
    function closedrawPolyline () {
       mouseTool.close();
    }
    AMap.event.addListener(mouseTool,'draw',function(e){
    
       getPath_array = e.obj.getPath();
       map.clearInfoWindow(); //清除地图上的信息窗体。
    });
    
    构造函数 说明
    MouseTool(Map) MouseTool的构造函数,目前仅支持桌面浏览器
    方法 返回值 说明
    open() 打开编辑功能。功能开启后,通过编辑点可调整矩形的形状
    close() 关闭编辑功能
    事件 参数 说明
    draw {type,obj} 鼠标工具绘制覆盖物结束时触发此事件,obj对象为绘制出来的覆盖物对象。

    步骤四:编辑路线()新增或者删除

    (链接参考:https://lbs.amap.com/api/javascript-api/example/overlayers/polyline-draw-and-edit)

    效果如下图:

    在这里插入图片描述
    实现如下:

    HTML
    <script src="https://webapi.amap.com/maps?v=1.4.13&key=您申请的key值&plugin=AMap.PolyEditor"></script>
    <script src="${ctxPath}/static/backend/lib/amap/amap-ui-main.js"></script>
    });
    
     var path = [
          [116.362209, 39.887487],
          [116.422897, 39.878002],
          [116.372105, 39.90651],
          [116.428945, 39.89663]
      ];
       var polyline = new AMap.Polyline({
           path: path,
           outlineColor: '#ffeeff',
           strokeColor: "#0071FF",
           strokeOpacity: 1,
           strokeWeight: 6,
           strokeStyle: "dashed",
           strokeDasharray: [10, 20],
           lineJoin: 'round',
           lineCap: 'round',
           zIndex: 50,
       })
    
       polyline.setMap(map)
       // 缩放地图到合适的视野级别
       map.setFitView([ polyline ])
    
       var polyEditor = new AMap.PolyEditor(map, polyline)
    });
    

    完整路线的的展示方法

    效果如下图:
    在这里插入图片描述
    实现如下:

    HTML
    <script src="https://webapi.amap.com/maps?v=1.4.13&key=您申请的key值&plugin=AMap.BezierCurveEditor"></script>
    });
    
      var path = [
          [116.362209, 39.887487],
          [116.422897, 39.878002],
          [116.372105, 39.90651],
          [116.428945, 39.89663]
      ];
    var bezierCurve = new AMap.BezierCurve({
           path: path,
           outlineColor: '#ffeeff',
           strokeColor: "#0071FF",
           strokeOpacity: 1,
           strokeWeight: 6,
           strokeStyle: "dashed",
           strokeDasharray: [10, 20],
           lineJoin: 'round',
           lineCap: 'round',
           zIndex: 50,
       })
    
       bezierCurve.setMap(map);
       //  // 缩放地图到合适的视野级别
       map.setFitView([ bezierCurve ])
    });
    

    步骤五:根据绘制路线飞行

    (链接参考:https://lbs.amap.com/api/amap-ui/demos/amap-ui-pathsimplifier/index)
    效果如下图:
    在这里插入图片描述
    实现如下:

    function lookAMapUI(path,MARK_TYPE,Spots_arr){
       AMapUI.loadUI(['overlay/SimpleInfoWindow','misc/PathSimplifier'], function(SimpleInfoWindow,PathSimplifier) {
           // 展示路线
           if (!PathSimplifier.supportCanvas) {
               alert('当前环境不支持 Canvas!');
               return;
           }
    
           var emptyLineStyle = {
               lineWidth: 0,
               fillStyle: null,
               strokeStyle: null,
               borderStyle: null
           };
    
           var pathSimplifierIns = new PathSimplifier({
               zIndex: 110,
               //autoSetFitView:false,
               map: map, //所属的地图实例
    
               getPath: function(pathData, pathIndex) {
    
                   return pathData.path;
               },
               getHoverTitle: function(pathData, pathIndex, pointIndex) {
    
                   return null;
               },
               renderOptions: {
                   //将点、线相关的style全部置emptyLineStyle
                   pathLineStyle: emptyLineStyle,
                   pathLineSelectedStyle: emptyLineStyle,
                   pathLineHoverStyle: emptyLineStyle,
                   keyPointStyle: emptyLineStyle,
                   startPointStyle: emptyLineStyle,
                   endPointStyle: emptyLineStyle,
                   keyPointHoverStyle: emptyLineStyle,
                   keyPointOnSelectedPathLineStyle: emptyLineStyle
               }
           });
    
           window.pathSimplifierIns = pathSimplifierIns;
    
           pathSimplifierIns.setData([{
               name: '路線',
               //景点经纬度
               path: [
       			       [116.362209, 39.887487],
       			       [116.422897, 39.878002],
       			       [116.372105, 39.90651],
       			       [116.428945, 39.89663]
       			   ]
           }]);
           //initRoutesContainer(d);
    
           function onload() {
               pathSimplifierIns.renderLater();
           }
    
           function onerror(e) {
               alert('图片加载失败!');
           }
    
           navg1 = pathSimplifierIns.createPathNavigator(0, {
               speed: 3000 ,
               pathNavigatorStyle: {
                   // autoRotate: false, //禁止调整方向
                   width: 56,
                   height: 89 ,
                   initRotateDegree: 270 ,
                   content: PathSimplifier.Render.Canvas.getImageContent("../static/img/eagle.png", onload, onerror),
                   strokeStyle: null ,
                   fillStyle: null ,
                   pathLinePassedStyle: {
                       lineWidth: 6,
                       strokeStyle: '#0071FF',
                       dirArrowStyle: {
                           stepSpace: 50,
                           strokeStyle: '#fff'
                       }
                   },
               }
    
           });
           //开始飞行
           navg1.start();
           //展示飞行过程中需要操作的方法
           navg1.on('move', function(type) {
              //停止飞行
              navg1.pause();
           });
    
       });
    //    展示路线结束
    }
    

    方法

    方法名称 返回值 说明
    getZIndexOfPath(pathIndex:number) number 返回pathIndex对应的轨迹数据项的zIndex值
    setZIndexOfPath(pathIndex:number, zIndex:number) 设置pathIndex对应的轨迹数据项的zIndex值
    getPathData(pathIndex:number) {*} 返回pathIndex对应的轨迹数据项
    createPathNavigator(pathIndex:number, options:Object) PathNavigator 创建一个轨迹巡航器。pathIndex:关联的轨迹索引 ,options:巡航器的配置选项,详见下方轨迹巡航器部分。
    clearPathNavigators() 销毁现存的所有轨迹巡航器

    事件

    事件名称 参数 说明
    start event:{type:String} 事件 调用start时触发
    pause event:{type:String} 事件 调用pause时触发
    move event:{type:String} 事件 调用moveByDistance(动画过程会调用该方法), moveToPoint 时触发
    stop event:{type:String} 事件 调用stop时触发
    展开全文
  • 高德地图相关总结

    2020-06-09 22:33:03
    创建地图 new AMap.Map('id') map.getZoom()//获取地图级别 map.setZoom()//设置地图级别 map.getCenter()//获取地图的中心点 map.setCenter()//设置地图的中心点 map.setZoomAndCenter(z,[x,y])//设置地图的层级...
    1. 申请key
    2. script地址
    3. 创建容器并命名id值
    4. 创建地图 new AMap.Map('id')
    //移动端:
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no"> 
    
    map.getZoom()//获取地图级别Zoom 的数字越大 显示的越精细 越小显示的范围越大
    map.setZoom()//设置地图级别
    
    map.getCenter()//获取地图的中心点
    map.setCenter([])//设置地图的中心点 放入 坐标
    
    map.setZoomAndCenter(z,[x,y])//设置地图的层级以及中心点
    
    map.getCity(callback(info))//获取行政区---info
    map.setCity(str)//设置取行政区---
    
    on('moveend')//地图移动结束时触发
    on('zoomend')//地图级别发生改变时触发
    

    获取地图的范围

    map.getBounds().northeast//右上角坐标----json对象   toString()
    map.getBounds().southwest//左下角坐标
    

    设置地图的范围

    //首先需要生成一个Bounds对象
    var myBounds = new AMap.Bounds(左下角坐标,右上角坐标);
    map.setBounds(myBounds)
    

    限制/取消限制地图的显示范围

    var myBounds = new AMap.Bounds(左下角坐标的数组,右上角坐标的数组标);
    map.setLimitBounds(myBounds)//但是不是特别精准,会以它觉得最好的方式去显示
    

    取消地图范围限制

    map.clearLimitBounds()
    //可以通过对myBounds  对象内部的northeast southwest.p/r 赋值来更改范围,必须为Number类型;
    

    地图的平移

    panBy(x,y)  x代表向左平移多少像素  / y代表向上平移多少像素
    panTo([x坐标,y坐标]) 地图会直接平移到这个位置
    

    获取鼠标的经纬度

    利用事件对象

    e.lnglat.lng / lat 
    

    设置地图鼠标的默认样式

    setDefaultCursor('样式')
    cursor : 里面所有的样式都可以
    

    地图搜索

    //加载插件 AMap.Autocomplete  地图加载完毕触发回调函数
    AMap.plugin('AMap.Autocomplete',function(){
    	
    	new AMap.Autocomplete().search(要搜索的内容,function(status,data){
    		console.log(data 搜索出来的数据)
    	})
    })
    

    示例:(个人)

    inputSearch.oninput=function(){
       ulNode.html = '';
        AMap.plugin('AMap.Autocomplete', function () {
         new AMap.Autocomplete()
         .search(inputSearch.value, function (status, data) {
             console.log(data)
             if (data.tips.length === 0) return;
             for (var i = 0; i < data.tips.length; i++) {
                 var liNode = document.createElement('li');
                 liNode.innerHTML = data.tips[i].name;
                 liNode.q = data.tips[i].location.Q;
                 liNode.r = data.tips[i].location.R;
                 ulNode.appendChild(liNode);
                 liNode.onclick = function () {
                     map.setCenter([this.r, this.q]);
                     inputSearch.value = this.innerHTML;
                 }
             }
         })
      })
     }
    

    加载插件的方式 二

    https://webapi.amap.com/maps?v=1.4.11&key=e22196035aaa10db3b0b6eb1ab64619e&plugin=AMap.Autocomplete
    
    new AMap.Autocomplete({
        input:'searchText'//input searchText 《-》 id名
    });
    

    POI 缩写

    Point of Interest
    兴趣点

    AMap.service(['AMap.PlaceSearch'],function(){
    	new AMap.PlaceSearch({
    		pageSize:5, //当页一共显示多少条
            pageIndex:1, //当前第几页
            city:'010', //兴趣点的城市
            citylimit:true, //是否限制在设定的城内搜索
            map:map, //展示在哪个地图里
            panel:'setCenterNode' //放在哪个元素下
    	})
    })
    

    必须在服务器下 不然搜索到的 图片出不来

    给地图的元素加上事件,绑定plugin=AMap.Autocomplete,AMap.PlaceSearch

     window.onload = function () {
            var map = new AMap.Map('container', {
                zoom: 10,//初始地图级别 越大越清晰
                center: [116.65918, 39.878151]//中心位置
            });
            var searchNode=new AMap.Autocomplete({
                input:'inputSearch'//id
            })
            var placeSearch=new AMap.PlaceSearch({
                map:map//当前map
            })
            AMap.event.addListener(searchNode,'select',function (e) {
                placeSearch.search(e.poi.name)
            })
        }
        var js_Map = document.createElement('script');
        js_Map.src = "https://webapi.amap.com/maps?v=1.4.15&key=403c2522da6c56b5d0d07dd7889dbaa6&callback=onload&plugin=AMap.Autocomplete,AMap.PlaceSearch";
        document.head.appendChild(js_Map) 
    

    搜索周边
    plugin=AMap.Autocomplete,AMap.PlaceSearch

    new AMap.PlaceSearch({
        type:'住宿', //搜索的结果的过滤 结果类型
        pageSize:5,
        pageIndex:1,
        city:'010',
        citylimit:true,
        map:map, //展示在哪个地图里
        panel:'setCenterNode' //放在哪个元素下
    }).searchNearBy('北京',[116.379391,39.861536],1000,function(){});
    

    标记https://a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png

    var marker = new AMap.Marker({
        icon:'https://a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png', //标记的图标
        position:[e.lnglat.lng,e.lnglat.lat], //标记的坐标
        offset:new AMap.Pixel(-25,-25) // 像素的偏差值
    });
    
    marker.setMap(map);
    
    

    修改图标大小

    
    .amap-icon img{width:25px;height:25px}
    

    自定义标记图标

    var mk1 = new AMap.Icon({
        size:new AMap.Size(500,500), //图标大小
        image:'./1.jpg', //图片地址
        imageSize:new AMap.Size(100,100) //最终在map里面显示的大小
    //  imageOffset:new AMap.Pixel(-50,-50) //裁剪 偏差值
    });
    
    var marker = new AMap.Marker({
        position:[116.379391,39.861536],
        icon:mk1
    });
    map.add([marker])//可以放入多个marker
    

    删除标记的方法

    //方法一:
    marker.setMap(null);
    //方法二:
    map.remove([marker]);
    

    缩放比例尺控件

    //引入plugin
    plugin=AMap.scale,AMap.ToolBar;
    
    //使用
    map.addControl(new AMap.scale());
    map.addControl(new AMap.ToolBar());
    

    3d地图

    //创建对象时设置
    var map = new AMap.Map('container',{
        zoom:17,
        pitch:90,
        center:[116.379391,39.861536],
        viewMode:'3D', //变成了3d 地图了
        buildingAnimation:true // 可以让显示的建筑物变成动画现实
    });
    plugin=AMap.ControlBar;
    map.addControl(new AMap.ControlBar({
        showZoomBar:true, // 显示 zoom条控件
       // showControlButton:true,// 可以取消 倾斜旋转角度的按钮
        position:{ //控件的定位
            right:'50px',
            top:'30px'
        }
    }))
    

    驾驶导航

    //引入插件
    plugin=AMap.Driving
    
    new AMap.Driving({
        map:map,
        panel:'panel'
        }).search([
            {keyword:起点,city:'北京'},
            {keyword:终点,city:'北京'}
        ],function(status,data){
            console.log(data);
     })
    

    通过经纬度 来进行导航

    new AMap.Driving({
        map:map,
        panel:'panel'
        }).search(new AMap.LngLat(startX,startY),new AMap.LngLat(endX,endY),function(status,data){
            console.log(data);
    })
    

    步行路线的规划

    AMap.Walking
    
    new AMap.Walking({
        map:map,
        panel:'panel'
        }).search([
            {keyword:起点,city:'北京'},
            {keyword:终点,city:'北京'}
        ],function(status,data){
            console.log(data);
     })
    

    步行路线的坐标规划

    new AMap.Walking({
        map:map,
        panel:'panel'
        }).search([x,y],[x,y],function(status,data){
            console.log(data);//起点、终点
    })
    

    货车路线规划 多点

    AMap.TruckDriving 引入这个插件
    
    new AMap.TruckDriving({
            map:map,
            panel:'panel',
            city:'beijing',//城市
            size:1 //大小
        }).search([{lnglat:[116.379391,39.861536]},{lnglat:[116.979391,39.161536]},{lnglat:[116.579391,40.861536]}],function(status,data){
            console.log(data);
    });
    

    //关键字设置

    new AMap.TruckDriving({
            map:map,
            panel:'panel',
            city:'beijing',//城市
            size:1 //大小
        }).search([{
            keyword:'起点'
        },
        {
            keyword:'途径点'
        }
        {
            keyword:'途径点'
        }
        {
            keyword:'终点'
        }],function(status,data){
            console.log(data);
    });
    

    骑行路线规划

    //方法一
    new AMap.Riding({
        map:map,
        panel:'panel'
    }).search([
        {keyword:startNode.value,city:'北京'}, //起点
        {keyword:endNode.value,city:'北京'} //终点 
        //不能中间有途径
    ],function(status,data){
        console.log(data);
    })
    
    //方法二
    new AMap.Riding({
        map:map,
        panel:'panel' 	
        }).search(new AMap.LngLat(startX,startY),new AMap.LngLat(endX,endY),function(status,data){
            console.log(data);
    })
    

    地铁+公交的导航方式

    AMap.Transfer
    
    //关键字方法
    new AMap.Transfer({
        map:map,
        panel:'panel'
        }).search([
            {keyword:起始点,city:'北京'},
            {keyword:终点,city:'北京'}
            //只支持数组的前两个内容
        ],function(status,data){
            console.log(data);
    })
    
    //通过点击动态搜索
    	map.on("click",function(e){
    	var num = 0;
    	var arr=[];
    	if(num%2===1){
    	arr.push(e.lnglat.R,e.lnglat.P);
    	}
    	new AMap.Transfer({
    	    map:map,
    	    panel:'panel',
    	    city:'北京' //city 一定要加上 城市  如果咱们导航的地址比较偏僻 也不可以
    	    }).search(new AMap.LngLat(arr[0],arr[1]),new AMap.LngLat(e.lnglat.R,e.lnglat.P),function(status,data){
    	        console.log(data);
    	})
    }
    

    地图类型的切换

    AMap.MapType 引入这个插件
    map.addControl(new AMap.MapType({
        defaultType:1,//0 默认 1代表的是卫星
        showRoad:true //显示路况
    }));
    

    常用的插件
    鹰眼插件 AMap.OverView 默认在地图右下角显示缩略图
    比例尺插件 AMap.Scale
    地图类型切换插件 AMap.MapType 用来切换几个常用上午地图图层
    地图工具条插件 AMap.ToolBar用来控制地图的缩放与平移

    map.addControl(new AMap.OverView({
    	visible:false;//隐藏,默认显示
    }));
    

    控件的添加

    show()
    

    控件的删除

    hide();
    

    事件

    地图加载完成

    map.on('complete',function(){
        console.log('ok')
        //地图加载完成会触发的函数
        var text = new AMap.Text({//文字标记
        	text:'地图加载完成',
        	position:[x,y]
        })
        text.setMap(map);
    })
    

    地图显示等级改变开始

    zoomstart//可用于事件监听
    

    地图显示等级改变结束

    zoomend
    

    中心点移动中 不断触发

    map.on('mapmove',function(){
        console.log('中心点移动中.');
    });
    

    地图中心点开始移动

    map.on('movestart',function(){
        console.log('地图中心点开始移动');
    });
    

    地图中心点移动结束

    map.on('moveend',function(){
        console.log('地图中心点移动结束');
    });
    

    地图容器大小发生改变时
    需要在地图设置时开启resizeEnable:true才可以触发

    map.on('resize',function(){
        console.log('容器大小改变中');
    });
    

    覆盖物与地图的交互

    //覆盖物  Text / Marker
    var text = new AMap.Text({
        text:'覆盖物事件',
        position:[116.379391,39.861536]
    });
    
    
    //鼠标移入覆盖物
    text.on('mouseover',function(){
        console.log('覆盖物移入');
    });
    //鼠标移出覆盖物
    text.on('mouseout',function(){
        console.log('覆盖物移出');
    });
    
    //鼠标在覆盖物上移动
    text.on('mousemove',function(){
        console.log('覆盖物上移动鼠标');
    });
    

    插入矢量图

    var circle = new AMap.Circle({
        center:[116.379391,39.861536],
        raduis:1000
    });
    circle.setMap(map);
    //圆形的矢量图
    
    var rectangle = new AMap.Rectangle({
        bounds:new AMap.Bounds(new AMap.LngLat(116.379391,39.861536),new AMap.LngLat(117.379391,40.861536))
    });
    
    rectangle.setMap(map);
    //长方形的矢量图
    
    hide()隐藏
    show()显示
    

    右键菜单

    //创建一个右键菜单
    var contextmenu = new AMap.ContextMenu();
    
    
    //右键的第一个菜单
    contextmenu.addItem('放大一级',function(){
        map.zoomIn();
    },0);
    
    //右键的第二个菜单
    contextmenu.addItem('缩小一级',function(){
        map.zoomOut();
    },1);
    
    
    //给地图绑定右键
    map.on('rightclick',function(e){
        //打开右键 
        //map 在哪个地图里
        //参数2 - 位置
        contextmenu.open(map,e.lnglat);
    
        setTimeout(function(){
            contextmenu.close();
        },3000);
        // 关闭右键菜单
    });
    

    DOM事件绑定

    AMap.event.addDomListener (绑定的元素,绑定的事件名(click、mousedown),函数)
    

    DOM事件解除绑定

    AMap.event.removeListener (要解除绑定函数名)
    

    自定义事件

    addListener/on/emit
    //变量记录点击几次
    var count = 0;
    
    //点击事件
    var _onClick = function(){
        //事件派发 也可以说是变量的改变
        map.emit('count',{count:count += 1});
    };
    //监听的变量发生改变时触发的函数
    var _onCount = function(){
        console.log(count);
    };
    //监听的变量发生改变时
    map.on('count',_onCount);
    
    AMap.event.addListener(map,'click',_onClick);
    
    展开全文
  • 高德地图自定义地图apidemo,地图样式,标注样式,自定义窗体
  • 高德地图之拾取地点

    2017-04-30 16:07:59
    高德地图官方有API,有文档,但是大家懂的,有些东西并没有说明。所以,我打算将自己实现对高德地图展示、定位以及导航的功能步骤做一个总结,分享给大家。本文作为总结高德地图使用,首先总结自己对于拾取地点这样...
    高德地图官方有API,有文档,但是大家懂的,有些东西并没有说明。所以,我打算将自己实现对高德地图展示、定位以及导航的功能步骤做一个总结,分享给大家。本文作为总结高德地图使用,首先总结自己对于拾取地点这样的功能的实现。

    第一步,准备工作:

    首先,我们需要去高德地图获取key,然后下载sdk(包括jar包和so文件),本项目需要的sdk,如图:

    这里写图片描述

    当我们将key下载好以后,并且将jar包和so文件放好——建议直接将jar包放在libs文件夹,然后将so文件放在jinLibs文件夹下面,当然,我们也可以将so文件也放到libs,然后将Module的build.gradle文件修改如图:

    这里写图片描述

    接下来就是修改文件清单,这些我们可以直接将API的代码复制过来了:

    //地图包、搜索包、定位包、导航包需要的基础权限
    <!--允许程序打开网络套接字-->
    <uses-permission android:name="android.permission.INTERNET" />  
    <!--允许程序设置内置sd卡的写权限-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    
    <!--允许程序获取网络状态-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <!--允许程序访问WiFi网络信息-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <!--允许程序读写手机状态和身份-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />     
    <!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <!--用于访问GPS定位-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!--这个权限用于允许程序在手机屏幕关闭后后台进程仍然运行-->
    <user-permission android:name="android.permission.WAKE_LOCK"/>
    <application
             android:icon="@drawable/icon"
             android:label="@string/app_name" >
             <meta-data
                android:name="com.amap.api.v2.apikey"
                android:value="e969e70f8daf003d370ab982e6ba656d"/>
                ……
                <service android:name="com.amap.api.location.APSService"></service>
    </application>

    准备工作的最后一步只需要执行sync project with gradle files就完成整个项目的准备工作了!
    准备工作完成了,我们接下来就执行第二步,展示地图:
    首先,我们需要布局中有一个地图的布局,代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <com.amap.api.maps.MapView
            android:id="@+id/map"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    
    
    
    
    </LinearLayout>
    

    接下来就是对于地图的调用,这个非常简单,API里面都是现成的,代码如下:

    public class PiclocationActivity extends Activity {
    
        private MapView mMapView = null;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_piclocation);
            ActionBar actionBar = getActionBar();
            if(actionBar!=null)actionBar.hide();
            mMapView = (MapView) findViewById(R.id.map);
            mMapView.onCreate(savedInstanceState);// 此方法必须重写
    
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            //在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
            mMapView.onDestroy();
        }
        @Override
        protected void onResume() {
            super.onResume();
            //在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
            mMapView.onResume();
        }
        @Override
        protected void onPause() {
            super.onPause();
            //在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
            mMapView.onPause();
        }
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
            mMapView.onSaveInstanceState(outState);
        }
    
    
    
    }

    于是地图就展示出来了。

    这里写图片描述

    当然,如果你是你现在看到的地图是没有中间的图标,位置也应该是北京为中心点的地图。而我们今天需要实现的是拾取坐标点,所以必须要显示当前定位的。而关于地图展示的相关方法,接下来还会用的到。所以,我们接下来就实现上面的效果吧!

    第二步,开始定位:

    其实,这个也代码量也非常简单,如下:

     private AMap amap;
     private OnLocationChangedListener mListener;
     private AMapLocationClient mlocationClient;
     private AMapLocationClientOption mLocationOption;
    
     @Override
        protected void onCreate(Bundle savedInstanceState) {
           ...
            initMap();
    
        }
    
        /**
         * 地图实例化
         */
        private void initMap() {
            if (amap == null) {
                amap = mMapView.getMap();
                amap.setLocationSource(this);//设置了定位的监听,这里要实现LocationSource接口
                amap.getUiSettings().setMyLocationButtonEnabled(true); // 是否显示定位按钮
                amap.setMyLocationEnabled(true);//显示定位层并且可以触发定位,默认是flase
            }
     /**
         * 激活定位
         */
     @Override
        public void activate(OnLocationChangedListener listener) {
            mListener = listener;
            if (mlocationClient == null) {
                //初始化定位
                mlocationClient = new AMapLocationClient(this);
                //初始化定位参数
                mLocationOption = new AMapLocationClientOption();
                //设置定位回调监听
                mlocationClient.setLocationListener(this);
                //设置为高精度定位模式
                mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
                //设置为定位一次
    //            mLocationOption.setOnceLocation(true);
                //设置定位参数
                mlocationClient.setLocationOption(mLocationOption);
                // 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
                // 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求
                // 在定位结束后,在合适的生命周期调用onDestroy()方法
                // 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
                mlocationClient.startLocation();//启动定位
            }
        }
    /**
         * 注销定位
         */
        @Override
        public void deactivate() {
            mListener = null;
            if (mlocationClient != null) {
                mlocationClient.stopLocation();
                mlocationClient.onDestroy();
            }
            mlocationClient = null;
        }
    /**
         * 实现定位
         * @param amapLocation
         */
    @Override
        public void onLocationChanged(AMapLocation amapLocation) {
            if (mListener != null && amapLocation != null) {
                if (amapLocation != null
                        &&amapLocation.getErrorCode() == 0) {
                   String location = "当前地点:"+amapLocation.getProvider()+amapLocation.getCity()+amapLocation.getStreet()+amapLocation.getStreetNum();
                    Log.d(TAG, "onLocationChanged: ");
                } else {
                    String errText = "定位失败," + amapLocation.getErrorCode()+ ": " + amapLocation.getErrorInfo();
                    Log.e("AmapErr",errText);
                }
            }
        }

    接下来我们看看这个效果,首先看看日志:

    04-29 23:53:04.267 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段71204-29 23:53:06.268 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段71204-29 23:53:08.270 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段71204-29 23:53:10.277 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段71204-29 23:53:12.327 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段71204-29 23:53:14.281 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段71204-29 23:53:16.282 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段71204-29 23:53:18.288 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段71204-29 23:53:20.297 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段71204-29 23:53:22.291 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段71204-29 23:53:24.640 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段71204-29 23:53:26.295 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段71204-29 23:53:28.301 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段71204-29 23:53:30.298 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段71204-29 23:53:32.303 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段71204-29 23:53:34.304 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段71204-29 23:53:36.352 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段71204-29 23:53:38.339 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段71204-29 23:53:40.340 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段71204-29 23:53:42.341 18491-18491/cn.com.vicent.mymap D/PiclocationActivity: onLocationChanged: 当前地点:lbs成都市剑南大道南段712

    定位这么多次没有问题,但是地图并没有显示,why?

    这里写图片描述

    那我们现在将地图定位成功这个方法增加一句代码,实现地图显示当前位置:

    mListener.onLocationChanged(amapLocation);// 显示系统小蓝点

    其实上面还有一个问题,就是地图显示的缩放级别不一样,对吧?所以我们还需要在地图显示的时候预先设置缩放级别(程度).代码如下:

     /**
         * 地图实例化
         */
        private void initMap() {
            if (amap == null) {
                ...
                amap.moveCamera(CameraUpdateFactory.zoomTo(15));//设置地图缩放级别
            }
        }
    

    接下来我们看看效果:

    这里写图片描述

    这个效果已经基本成型了,但是我们还需要修改一下地图中心点的图标,我们不要圆形及边框,接下来看看代码:

    /**
         * 地图实例化
         */
        private void initMap() {
            if (amap == null) {
                ...
                MyLocationStyle myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类
                myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
                myLocationStyle.strokeColor(Color.TRANSPARENT);//设置定位蓝点精度圆圈的边框颜色
                myLocationStyle.radiusFillColor(Color.TRANSPARENT);//设置定位蓝点精度圆圈的填充颜色
                amap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style
            }
        }

    OK,搞定!接下来,就要开始放大招了!我们需要点击屏幕的时候,显示当前位置以及周边的位置,实现高德地图这样的效果:

    这里写图片描述

    需要实现上述效果,这里需要实现几点功能:

    1. 定位(已经实现)
    2. 周边搜索(下一步需要实现)
    3. 手指滑动地图停止的时候获取位置——逆地理编码(下下一步需要实现)
    4. 将结果以列表的形式展现出来

    于是我们接着上面的内容,开始进行第三步,周边搜索。

    第三步,周边搜索:

    API里面介绍周边搜索叫做“获取POI数据”,并且有六种方式,如下:

    • 根据关键字检索POI
    • 检索周边POI
    • 检索多边形内的POI
    • 根据ID检索POI
    • 根据输入自动提示
    • 获取道路沿途的POI数据

    因为我们需要的是周围的数据,所以这里我们选择第二种,这种情况比较合适。代码如下:

     /**
         * 周边数据实体封装
         */
        private class ListViewHoldier{
            String title;
            String address;
            LatLonPoint lp;
        }
    
    private List<ListViewHoldier> data = new ArrayList<>();
    //第一个位置数据,设为成员变量是因为有多个地方需要使用
        private ListViewHoldier lvHolder;
     /**
         * 地图实例化
         */
        private void initMap() {
            ...
                lvHolder = new ListViewHoldier();
            ...
        }
     /**
         * 实现定位
         * @param amapLocation
         */
        @Override
        public void onLocationChanged(AMapLocation amapLocation) {
            if (mListener != null && amapLocation != null) {
                if (amapLocation != null
                        &&amapLocation.getErrorCode() == 0) {
                    mListener.onLocationChanged(amapLocation);// 显示系统小蓝点
                    if(lvHolder.title==null){//只要第一次的数据,否则第一项的位置始终不会变。当然,也可以在这里关闭定位
    //                    mlocationClient.stopLocation();//停止定位
                        lvHolder.title = "[位置]";
                        //关于定位数据,可以查看API http://lbs.amap.com/api/android-location-sdk/guide/android-location/getlocation
                        lvHolder.address = amapLocation.getProvider()+amapLocation.getCity()+amapLocation.getStreet()+amapLocation.getStreetNum();
                        lvHolder.lp = new LatLonPoint(amapLocation.getLatitude(),amapLocation.getLongitude());
                        data.add(0,lvHolder);
                        doSearchQuery();
                    }
    
                } else {
                    String errText = "定位失败," + amapLocation.getErrorCode()+ ": " + amapLocation.getErrorInfo();
                    Log.e("AmapErr",errText);
                }
            }
        }
        /**
         * 搜查周边数据
         */
        private void doSearchQuery() {
            //搜索类型
            String type = "汽车服务|汽车销售|" +
                    "汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|体育休闲服务|医疗保健服务|" +
                    "住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务|交通设施服务|" +
                    "金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施";
            query = new PoiSearch.Query("", type, "");// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
            query.setPageSize(20);// 设置每页最多返回多少条poiitem
            query.setPageNum(0);// 设置查第一页
    
            poiSearch = new PoiSearch(this, query);
            //搜索回调
            poiSearch.setOnPoiSearchListener(this);
            //搜索位置及范围
            poiSearch.setBound(new PoiSearch.SearchBound(lvHolder.lp, 1000));
            //同步搜索
    //        poiSearch.searchPOI();//不能在主线程实现耗时操作
            //异步搜索
            poiSearch.searchPOIAsyn();
        }
         /**
         * 返回POI搜索异步处理的结果。
         * @param result
         * @param rcode
         */
        @Override
        public void onPoiSearched(PoiResult result, int rcode) {
            if (rcode == AMapException.CODE_AMAP_SUCCESS) {
                if (result != null && result.getQuery() != null) {// 搜索poi的结果
                    if (result.getQuery().equals(query)) {// 是否是同一条
                        // 取得搜索到的poiitems有多少页
                        List<PoiItem> poiItems = result.getPois();// 取得第一页的poiitem数据,页数从数字0开始
                        if (poiItems != null && poiItems.size() > 0) {
                            for (int i = 0;i<poiItems.size();i++){
                                PoiItem poiitem = poiItems.get(i);
                                ListViewHoldier holder = new ListViewHoldier();
                                holder.address = poiitem.getSnippet();
                                holder.title = poiitem.getTitle();
                                holder.lp = poiitem.getLatLonPoint();
                                if(data.size()>i+1){
                                    data.remove(i+1);
                                }
                                data.add(i+1,holder);
                                Log.d(TAG, "onPoiSearched: \n"+holder.address+"\n"+holder.title+"\n"+holder.lp.toString());
                            }
    
                        } else {
    
                        }
                    }
                } else {
    
                }
            } else {
    
            }
        }
    
        /**
         * poi id搜索的结果回调
         * @param poiItem
         * @param i
         */
        @Override
        public void onPoiItemSearched(PoiItem poiItem, int i) {
    
        }

    OK,代码比较长,我们接下来看看日志输出结果,检验一下我们的成果,日志如下:

    04-30 12:12:39.010 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              剑南大道南段
                                                                              小勇硅胶
                                                                              30.528865,104.044311
    04-30 12:12:39.010 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              剑南大道南段698号附11号
                                                                              老草屋烧烤(华阳店)
                                                                              30.528869,104.044336
    04-30 12:12:39.010 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              协和街道剑南大道南段712号
                                                                              华宜·上锦
                                                                              30.528781,104.044425
    04-30 12:12:39.010 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              剑南大道南段
                                                                              依爱思洗衣
                                                                              30.528873,104.044673
    04-30 12:12:39.010 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              协和街道剑南大道南段698号附8号
                                                                              子墨西点
                                                                              30.52902,104.04488
    04-30 12:12:39.020 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              剑南大道南段708-710号附近
                                                                              乐诚家乐(剑南大道南段)
                                                                              30.528738,104.044926
    04-30 12:12:39.020 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              协和街道剑南大道南段706号
                                                                              大邑血旺家常菜
                                                                              30.528702,104.045092
    04-30 12:12:39.020 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              剑南大道南段708-710号附近
                                                                              欣家超市
                                                                              30.528637,104.04507
    04-30 12:12:39.020 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              剑南大道南段708-710
                                                                              美家装饰建材(华阳店)
                                                                              30.528752,104.045118
    04-30 12:12:39.020 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              剑南大道南段706号附近
                                                                              贝尔康药业(同福堂大药房)
                                                                              30.528835,104.045141
    04-30 12:12:39.020 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              剑南大道南段美家建材旁
                                                                              牛肉面&馄饨王&黄焖鸡米饭(剑南大道店)
                                                                              30.528964,104.045165
    04-30 12:12:39.020 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              双流区
                                                                              元景路与剑南大道南段交叉口
                                                                              30.529386,104.045866
    04-30 12:12:39.020 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              515;521路;814路
                                                                              剑南大道元景路口站(公交站)
                                                                              30.529922,104.045593
    04-30 12:12:39.020 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              天府新区华府大道一段996号(金茂)光明城市54单元
                                                                              菜鸟驿站(光明城市优超市周6寄件免费)
                                                                              30.5273,104.04558
    04-30 12:12:39.020 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              元景路与剑南大道南段交叉口东100米
                                                                              停车场(元景路)
                                                                              30.529275,104.046573
    04-30 12:12:39.030 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              G123路;T207路
                                                                              元景路剑南大道口站(公交站)
                                                                              30.529392,104.046562
    04-30 12:12:39.030 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              元景路金茂光明城市3号门124单元2层
                                                                              海鸣画室二号店
                                                                              30.529139,104.046657
    04-30 12:12:39.030 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              剑南大道南段
                                                                              顺发超市
                                                                              30.531082,104.044417
    04-30 12:12:39.030 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              华阳镇剑南大道南段688号
                                                                              骑龙小区
                                                                              30.526689,104.043652
    04-30 12:12:39.030 18831-18831/cn.com.vicent.mymap D/PiclocationActivity: onPoiSearched: 
                                                                              华阳华府大道一段99611摄影工作室
                                                                              30.527685,104.046519

    OK,周边搜索已经搞定,接下来执行下一步。

    第四步,随手指的滑动更新数据:

    其实上面有一个bug,就是我们手指滑动是时候,然后定位成功就会将地图的中心点重新定位会我们当前的位置,如图:

    这里写图片描述

    原因是高德地图默认每秒更新一次当前位置,所以每秒地图就会回到中心点一次。解决方法很多,可以关闭定位,或者将定位成功后的显示系统小蓝点给关掉,代码如下:

    mListener.onLocationChanged(amapLocation);// 显示系统小蓝点

    现在我们的地图还只是可以随意滑动,但是我们需要在手指滑动结束的时候获取到经纬度,然后更新我们的周边数据。更新周边的数据已经封装好一个方法了,问题是在手指滑动的时候获取到经纬度。并且,在打开地图的时候中心点覆盖系统图标上面还有一个图标,并且该图标随手指移动,在手指结束滑动的时候还有一个动画。所以整理一下思路,接下来需要实现的有如下几点:

    1. 打开地图的时候显示自定义图标
    2. 图标随手指移动
    3. 手指移动结束的时候图标有一个动画
    4. 手指移动结束的时候获取到当前的经纬度并且更新数据

    首先我们来实现对地图添加自定义图标,代码如下:

    private Marker mEndMarker;
     /**
         * 实现定位
         * @param amapLocation
         */
        @Override
        public void onLocationChanged(AMapLocation amapLocation) {
          ...
                        // 初始化Marker添加到地图
                        mEndMarker = amap.addMarker(new MarkerOptions().icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.end))));
                        mEndMarker.setPosition(new LatLng(amapLocation.getLatitude(),amapLocation.getLongitude()));
                        ...
        }

    完成了第1步,接下来实现第2步,就是手指滑动的时候图标随手指滑动。这里我们需要实现一个地图状态发生变化的监听接口——AMap.OnCameraChangeListener,它有两个抽象方法,如下:

     /**
         * 地图实例化
         */
        private void initMap() {
            if (amap == null) {
            ...
                amap.setOnCameraChangeListener(this);
            }
        }
    /**
         * 在地图状态改变过程中回调此方法。
         * @param cameraPosition
         */
        @Override
        public void onCameraChange(CameraPosition cameraPosition) {
            mEndMarker.setPosition(cameraPosition.target);
        }
    
        /**
         * 在地图状态改变完成时回调此方法。
         * @param cameraPosition
         */
        @Override
        public void onCameraChangeFinish(CameraPosition cameraPosition) {
    
        }

    接下来实现第3步,在滑动结束时启动一个动画。所以我们直接在onCameraChangeFinish(CameraPosition cameraPosition)方法里面执行动画的方法即可,代码如下:

     /**
         * 在地图状态改变完成时回调此方法。
         * @param cameraPosition
         */
        @Override
        public void onCameraChangeFinish(CameraPosition cameraPosition) {
    
            jumpPoint(mEndMarker);
        }
    
        /**
         * marker点击时跳动一下
         */
        public void jumpPoint(final Marker marker) {
            final Handler handler = new Handler();
            final long start = SystemClock.uptimeMillis();
            //获取地图投影坐标转换器
            Projection proj = amap.getProjection();
            final LatLng markerLatlng = marker.getPosition();
            Point markerPoint = proj.toScreenLocation(markerLatlng);
            markerPoint.offset(0, -50);
            final LatLng startLatLng = proj.fromScreenLocation(markerPoint);
            final long duration = 500;
    
            final Interpolator interpolator = new BounceInterpolator();
            handler.post(new Runnable() {
                @Override
                public void run() {
                    long elapsed = SystemClock.uptimeMillis() - start;
                    float t = interpolator.getInterpolation((float) elapsed
                            / duration);
                    double lng = t * markerLatlng.longitude + (1 - t)
                            * startLatLng.longitude;
                    double lat = t * markerLatlng.latitude + (1 - t)
                            * startLatLng.latitude;
                    marker.setPosition(new LatLng(lat, lng));
                    if (t < 1.0) {
                        handler.postDelayed(this, 16);
                    }
                }
            });
        }

    上面这些比较花哨的动作完成以后,我们得干一点实事,就是获取数据,并且及时更新。首先,我们需要在手指滑动结束的时候获取到经纬度,然后通过逆地理编码方法拿到地址的详细数据,再接着通过经纬度查询周边数据。所以这1步其实有三个动作。我们就不一步步的列了,直接上代码,看注释:

     /**
         * 逆地理编码业务类
         */
        private GeocodeSearch geocoderSearch;
        /**
         * 地图实例化
         */
        private void initMap() {
            if (amap == null) {
               ...
                //初始化 geocoderSearch
                geocoderSearch = new GeocodeSearch(this);
                //注册 逆地理编码异步处理回调接口
                geocoderSearch.setOnGeocodeSearchListener(this);
    
            }
        }
        /**
         * 在地图状态改变完成时回调此方法。
         * @param cameraPosition
         */
        @Override
        public void onCameraChangeFinish(CameraPosition cameraPosition) {
            //当地图定位成功的时候该方法也会回调,为了避免不必要的搜索,因此此处增加一个判断
            if(isFirstTime){
                isFirstTime = false;
                return;
            }
            //marker 动画
            jumpPoint(mEndMarker);
            lvHolder.lp = new LatLonPoint(cameraPosition.target.latitude,cameraPosition.target.longitude);
            RegeocodeQuery query = new RegeocodeQuery(lvHolder.lp, 200,
                    GeocodeSearch.AMAP);// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系
            geocoderSearch.getFromLocationAsyn(query);// 设置异步逆地理编码请求
            doSearchQuery();
    
        }
    /**
         * 逆地理编码回调方法
         * 经纬度转位置
         * @param result
         * @param rCode
         */
        @Override
        public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
                if (rCode == AMapException.CODE_AMAP_SUCCESS) {
                    if (result != null && result.getRegeocodeAddress() != null
                            && result.getRegeocodeAddress().getFormatAddress() != null) {
                        lvHolder.address = result.getRegeocodeAddress().getFormatAddress();
                        data.remove(0);
                        data.add(0,lvHolder);
                    } else {
            //                ToastUtil.show(ReGeocoderActivity.this, R.string.no_result);
                    }
            } else {
    //            ToastUtil.showerror(this, rCode);
            }
        }
    
        /**
         * 地理编码回调方法
         * 位置转经纬度
         * @param geocodeResult
         * @param i
         */
        @Override
        public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
    
        }
    

    第五步、将结果以列表的形式展现出来

    上面把主要内容都已经实现了,最后就是将数据封装好,放入ListView里面。因为后文还将用到RecycleView,所以这里就直接使用RecycleView,以便使用统一的Adapter。
    修改代码,首先是布局,如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center">
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="5dp"
            android:background="@color/gray">
            <ImageView
                android:layout_width="24dp"
                android:layout_height="24dp"
                android:src="@mipmap/back"
                android:layout_alignParentLeft="true"
                android:layout_centerHorizontal="true"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:layout_centerInParent="true"
                android:text="地图选点"
                android:textSize="16sp"/>
        </RelativeLayout>
        <com.amap.api.maps.MapView
            android:id="@+id/map"
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="5"/>
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/ll_rl_locations"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="2"
            android:visibility="gone">
    
        </android.support.v7.widget.RecyclerView>
    
        <LinearLayout
            android:id="@+id/ll_ll_holderview"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="2"
            android:orientation="horizontal"
            android:gravity="center">
            <ProgressBar
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="@string/loading"/>
    
        </LinearLayout>
    </LinearLayout>
    

    接下来是所有代码,直接看注释吧:

    package cn.com.vicent.mymap;
    
    import android.app.ActionBar;
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.graphics.BitmapFactory;
    import android.graphics.Color;
    import android.graphics.Point;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.SystemClock;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.util.Log;
    import android.view.View;
    import android.view.animation.BounceInterpolator;
    import android.view.animation.Interpolator;
    import android.widget.TextView;
    
    import com.amap.api.location.AMapLocation;
    import com.amap.api.location.AMapLocationClient;
    import com.amap.api.location.AMapLocationClientOption;
    import com.amap.api.location.AMapLocationListener;
    import com.amap.api.maps.AMap;
    import com.amap.api.maps.CameraUpdateFactory;
    import com.amap.api.maps.LocationSource;
    import com.amap.api.maps.MapView;
    import com.amap.api.maps.Projection;
    import com.amap.api.maps.model.BitmapDescriptorFactory;
    import com.amap.api.maps.model.CameraPosition;
    import com.amap.api.maps.model.LatLng;
    import com.amap.api.maps.model.Marker;
    import com.amap.api.maps.model.MarkerOptions;
    import com.amap.api.maps.model.MyLocationStyle;
    import com.amap.api.services.core.AMapException;
    import com.amap.api.services.core.LatLonPoint;
    import com.amap.api.services.core.PoiItem;
    import com.amap.api.services.geocoder.GeocodeResult;
    import com.amap.api.services.geocoder.GeocodeSearch;
    import com.amap.api.services.geocoder.RegeocodeQuery;
    import com.amap.api.services.geocoder.RegeocodeResult;
    import com.amap.api.services.poisearch.PoiResult;
    import com.amap.api.services.poisearch.PoiSearch;
    import com.zhy.adapter.recyclerview.CommonAdapter;
    import com.zhy.adapter.recyclerview.base.ViewHolder;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class PiclocationActivity extends Activity implements LocationSource, AMapLocationListener, PoiSearch.OnPoiSearchListener, AMap.OnCameraChangeListener, GeocodeSearch.OnGeocodeSearchListener {
        private static final String TAG = "PiclocationActivity";
        private MapView mMapView = null;
        private AMap amap;
        private Marker mEndMarker;
        private OnLocationChangedListener mListener;
        private AMapLocationClient mlocationClient;
        private AMapLocationClientOption mLocationOption;
        /**
         * 周边搜索条件
         */
        private PoiSearch.Query  query;
        /**
         * 周边搜索的业务执行
         */
        private PoiSearch poiSearch;
        /**
         * 逆地理编码业务类
         */
        private GeocodeSearch geocoderSearch;
        /**
         * 第一次定位的标志位
         */
        private boolean isFirstTime = true;
        private Context mContext;
        private List<ListViewHoldier> data = new ArrayList<>();
        //第一个位置数据,设为成员变量是因为有多个地方需要使用
        private ListViewHoldier lvHolder;
        private RecyclerView mRecyclerView;
        private CommonAdapter mAdapter;
        private View progressDialogView;
        private TextView tvHint;
        private View progressbar;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_piclocation);
            ActionBar actionBar = getActionBar();
            if(actionBar!=null)actionBar.hide();
            initView();
            mMapView.onCreate(savedInstanceState);// 此方法必须重写
            initMap();
    
        }
    
        private void initView() {
            mMapView = (MapView) findViewById(R.id.map);
            mRecyclerView = (RecyclerView) findViewById(R.id.ll_rl_locations);
            mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
            mAdapter = getAdapter();
            mRecyclerView.setAdapter(mAdapter);
            progressDialogView = findViewById(R.id.ll_ll_holderview);
            tvHint = (TextView) findViewById(R.id.ll_tv_hint);
            progressbar = findViewById(R.id.ll_progressbar);
        }
    
    
        /**
         * 地图实例化
         */
        private void initMap() {
            if (amap == null) {
                amap = mMapView.getMap();
                amap.setLocationSource(this);//设置了定位的监听,这里要实现LocationSource接口
                amap.getUiSettings().setMyLocationButtonEnabled(true); // 是否显示定位按钮
                amap.setMyLocationEnabled(true);//显示定位层并且可以触发定位,默认是flase
                amap.moveCamera(CameraUpdateFactory.zoomTo(15));//设置地图缩放级别
                MyLocationStyle myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类
                myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
                myLocationStyle.strokeColor(Color.TRANSPARENT);//设置定位蓝点精度圆圈的边框颜色
                myLocationStyle.radiusFillColor(Color.TRANSPARENT);//设置定位蓝点精度圆圈的填充颜色
                amap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style
                lvHolder = new ListViewHoldier();
                //天添加屏幕移动的监听
                amap.setOnCameraChangeListener(this);
                // 初始化Marker添加到地图
                mEndMarker = amap.addMarker(new MarkerOptions().icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.end))));
                //初始化 geocoderSearch
                geocoderSearch = new GeocodeSearch(this);
                //注册 逆地理编码异步处理回调接口
                geocoderSearch.setOnGeocodeSearchListener(this);
    
            }
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            //在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
            mMapView.onDestroy();
        }
        @Override
        protected void onResume() {
            super.onResume();
            //在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
            mMapView.onResume();
        }
        @Override
        protected void onPause() {
            super.onPause();
            //在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
            mMapView.onPause();
        }
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
            mMapView.onSaveInstanceState(outState);
        }
    
        /**
         * 激活定位
         * @param listener
         */
        @Override
        public void activate(OnLocationChangedListener listener) {
            mListener = listener;
            if (mlocationClient == null) {
                //初始化定位
                mlocationClient = new AMapLocationClient(this);
                //初始化定位参数
                mLocationOption = new AMapLocationClientOption();
                //设置定位回调监听
                mlocationClient.setLocationListener(this);
                //设置为高精度定位模式
                mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
                //设置为定位一次
    //            mLocationOption.setOnceLocation(true);
                //设置定位参数
                mlocationClient.setLocationOption(mLocationOption);
                // 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
                // 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求
                // 在定位结束后,在合适的生命周期调用onDestroy()方法
                // 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
                mlocationClient.startLocation();//启动定位
            }
        }
    
        /**
         * 注销定位
         */
        @Override
        public void deactivate() {
            mListener = null;
            if (mlocationClient != null) {
                mlocationClient.stopLocation();
                mlocationClient.onDestroy();
            }
            mlocationClient = null;
        }
    
        /**
         * 实现定位
         * @param amapLocation
         */
        @Override
        public void onLocationChanged(AMapLocation amapLocation) {
            if (mListener != null && amapLocation != null) {
                if (amapLocation != null
                        &&amapLocation.getErrorCode() == 0) {
    
                    if(isFirstTime){//只要第一次的数据,当然,也可以在这里关闭定位
    //                    mlocationClient.stopLocation();//停止定位
                        mListener.onLocationChanged(amapLocation);// 显示系统小蓝点
                        lvHolder.title = "[位置]";
                        lvHolder.address = amapLocation.getProvider()+amapLocation.getCity()+amapLocation.getStreet()+amapLocation.getStreetNum();
                        lvHolder.lp = new LatLonPoint(amapLocation.getLatitude(),amapLocation.getLongitude());
                        mEndMarker.setPosition(new LatLng(amapLocation.getLatitude(),amapLocation.getLongitude()));
                        data.add(0,lvHolder);
                        doSearchQuery();
    
                    }
    
                } else {
                    String errText = "定位失败," + amapLocation.getErrorCode()+ ": " + amapLocation.getErrorInfo();
                    Log.e("AmapErr",errText);
                }
            }
        }
    
        /**
         * 搜查周边数据
         */
        private void doSearchQuery() {
            //搜索类型
            String type = "汽车服务|汽车销售|" +
                    "汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|体育休闲服务|医疗保健服务|" +
                    "住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务|交通设施服务|" +
                    "金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施";
            query = new PoiSearch.Query("", type, "");// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
            query.setPageSize(20);// 设置每页最多返回多少条poiitem
            query.setPageNum(0);// 设置查第一页
    
            poiSearch = new PoiSearch(this, query);
            //搜索回调
            poiSearch.setOnPoiSearchListener(this);
            //搜索位置及范围
            poiSearch.setBound(new PoiSearch.SearchBound(lvHolder.lp, 1000));
            //同步搜索
    //        poiSearch.searchPOI();//不能在主线程实现耗时操作
            //异步搜索
            poiSearch.searchPOIAsyn();
        }
    
        /**
         * 返回POI搜索异步处理的结果。
         * @param result
         * @param rcode
         */
        @Override
        public void onPoiSearched(PoiResult result, int rcode) {
            if (rcode == AMapException.CODE_AMAP_SUCCESS) {
                if (result != null && result.getQuery() != null) {// 搜索poi的结果
                    if (result.getQuery().equals(query)) {// 是否是同一条
                        // 取得搜索到的poiitems有多少页
                        List<PoiItem> poiItems = result.getPois();// 取得第一页的poiitem数据,页数从数字0开始
                        if (poiItems != null && poiItems.size() > 0) {
                            for (int i = 0;i<poiItems.size();i++){
                                PoiItem poiitem = poiItems.get(i);
                                ListViewHoldier holder = new ListViewHoldier();
                                holder.address = poiitem.getSnippet();
                                holder.title = poiitem.getTitle();
                                holder.lp = poiitem.getLatLonPoint();
                                if(data.size()>i+1){
                                    data.remove(i+1);
                                }
                                data.add(i+1,holder);
    
                            }
                        mAdapter.notifyDataSetChanged();
                        mRecyclerView.setVisibility(View.VISIBLE);
                        progressDialogView.setVisibility(View.GONE);
                        } else {
                            progressbar.setVisibility(View.GONE);
                            tvHint.setText(R.string.no_location);
                        }
                    }
                } else {
                    progressbar.setVisibility(View.GONE);
                    tvHint.setText(R.string.no_location);
                }
            } else {
                progressbar.setVisibility(View.GONE);
                tvHint.setText(R.string.no_location);
            }
        }
    
        /**
         * poi id搜索的结果回调
         * @param poiItem
         * @param i
         */
        @Override
        public void onPoiItemSearched(PoiItem poiItem, int i) {
    
        }
    
        /**
         * 在地图状态改变过程中回调此方法。
         * @param cameraPosition
         */
        @Override
        public void onCameraChange(CameraPosition cameraPosition) {
            mEndMarker.setPosition(cameraPosition.target);
        }
    
    
        /**
         * 在地图状态改变完成时回调此方法。
         * @param cameraPosition
         */
        @Override
        public void onCameraChangeFinish(CameraPosition cameraPosition) {
            //当地图定位成功的时候该方法也会回调,为了避免不必要的搜索,因此此处增加一个判断
            if(isFirstTime){
                isFirstTime = false;
                return;
            }
            //隐藏数据
            mRecyclerView.setVisibility(View.GONE);
            //展示dialogView
            progressDialogView.setVisibility(View.VISIBLE);
            findViewById(R.id.ll_progressbar).setVisibility(View.VISIBLE);
            tvHint.setText(R.string.loading);
            //marker 动画
            jumpPoint(mEndMarker);
            lvHolder.lp = new LatLonPoint(cameraPosition.target.latitude,cameraPosition.target.longitude);
            RegeocodeQuery query = new RegeocodeQuery(lvHolder.lp, 200,
                    GeocodeSearch.AMAP);// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系
            geocoderSearch.getFromLocationAsyn(query);// 设置异步逆地理编码请求
            doSearchQuery();
    
        }
    
        /**
         * marker点击时跳动一下
         */
        public void jumpPoint(final Marker marker) {
            final Handler handler = new Handler();
            final long start = SystemClock.uptimeMillis();
            //获取地图投影坐标转换器
            Projection proj = amap.getProjection();
            final LatLng markerLatlng = marker.getPosition();
            Point markerPoint = proj.toScreenLocation(markerLatlng);
            markerPoint.offset(0, -50);
            final LatLng startLatLng = proj.fromScreenLocation(markerPoint);
            final long duration = 500;
    
            final Interpolator interpolator = new BounceInterpolator();
            handler.post(new Runnable() {
                @Override
                public void run() {
                    long elapsed = SystemClock.uptimeMillis() - start;
                    float t = interpolator.getInterpolation((float) elapsed
                            / duration);
                    double lng = t * markerLatlng.longitude + (1 - t)
                            * startLatLng.longitude;
                    double lat = t * markerLatlng.latitude + (1 - t)
                            * startLatLng.latitude;
                    marker.setPosition(new LatLng(lat, lng));
                    if (t < 1.0) {
                        handler.postDelayed(this, 16);
                    }
                }
            });
        }
    
        /**
         * 逆地理编码回调方法
         * 经纬度转位置
         * @param result
         * @param rCode
         */
        @Override
        public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
                if (rCode == AMapException.CODE_AMAP_SUCCESS) {
                    if (result != null && result.getRegeocodeAddress() != null
                            && result.getRegeocodeAddress().getFormatAddress() != null) {
                        lvHolder.address = result.getRegeocodeAddress().getFormatAddress();
                        data.remove(0);
                        data.add(0,lvHolder);
                    } else {
            //                ToastUtil.show(ReGeocoderActivity.this, R.string.no_result);
                    }
            } else {
    //            ToastUtil.showerror(this, rCode);
            }
        }
    
        /**
         * 地理编码回调方法
         * 位置转经纬度
         * @param geocodeResult
         * @param i
         */
        @Override
        public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
    
        }
    
    private CommonAdapter getAdapter() {
        return new CommonAdapter<ListViewHoldier>(this,R.layout.item_listview_location,data) {
    
            @Override
            protected void convert(ViewHolder holder, final ListViewHoldier listViewHoldier, int position) {
                holder.setText(R.id.rl_tv_name,listViewHoldier.title);
                holder.setText(R.id.rl_tv_location,listViewHoldier.address);
                holder.getView(R.id.rl_tv_subit).setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Intent intent = new Intent(mContext,NavigationActivity.class);
                        intent.putExtra("value",listViewHoldier.lp);
                        intent.putExtra("address",listViewHoldier.address);
                        setResult(RESULT_OK,intent);
                        finish();
                    }
                });
            }
        };
    }
        /**
         * 周边数据实体封装
         */
        private class ListViewHoldier{
            String title;
            String address;
            LatLonPoint lp;
        }
    
    
    }
    
    

    最后我们来看看效果怎么样?
    这里写图片描述

    由于对地图相关API不熟悉,走了很多弯路。最后还有一个bug,就是加载地图的时候有时候不会显示到我们设置的缩放级别,还有就是有时候打开地图的时候,会看不见marker,一般都是时间或者网络的原因,大家可以测试一下。最后,如有错误,希望大家多多指正,一起进步,谢谢!

    相关API:
    http://lbs.amap.com/api/android-sdk/summary/
    http://a.amap.com/lbs/static/unzip/Android_Map_Doc/index.html
    http://lbs.amap.com/api/android-location-sdk/locationsummary/
    http://amappc.cn-hangzhou.oss-pub.aliyun-inc.com/lbs/static/unzip/Android_Location_Doc/index.html
    http://lbs.amap.com/api/android-navi-sdk/summary/
    http://a.amap.com/lbs/static/unzip/Android_Navi_Doc/index.html
    参考文章:
    http://blog.csdn.net/u010378579/article/details/53907749

    源码

    展开全文
  • 之前在做大创的时候,就用到了高德地图,但是当时是为了赶项目,所以只是按照官方的demo代码搬运了过来,而具体哪个类是干什么的根本不清楚,而且一个完整的流程也是很模糊。现在再次用到了这个东西,所以觉得一定要...

    之前在做大创的时候,就用到了高德地图,但是当时是为了赶项目,所以只是按照官方的demo代码搬运了过来,而具体哪个类是干什么的根本不清楚,而且一个完整的流程也是很模糊。现在再次用到了这个东西,所以觉得一定要好好研究一下,为了以后用的更方便,总不能每次都搬运人家官方的demo吧-。=。

    今天这篇是最基础的一篇,我会从申请高德API的key开始走一遍流程,因为相信大家跟我一样,看官网给的代码都已经晕头转向了(他写的实在是太乱了)。

     

    第二篇:高德地图Poi搜索周边位置https://blog.csdn.net/zy_jibai/article/details/103017217

    接下来我们按照申请的流程一步一步的实现高德地图的API使用:

    一、申请和配置

    首先来看一下申请和配置的流程:

    1、申请注册成为开发者。

    这一步应该不用怎么说吧,大家自己都会注册账号密码什么的。。

    2、申请应用key

    ①首先点开控制台,点击应用管理:

    我这里已经有了四个应用,如果是刚刚创建的话是没有的。

    ②点击右上角创建应用:

     

    应用名称随便填,应用类型也随便填。点击创建

    我们创建好了之后会在应用中显示刚刚创建和已经创建的应用。

    ③点击右上角添加新Key

    我们只说一下获取这两个安全码SHA1:

    2.1.调试版:我们打开Android Studio,点击gradle projects(默认在右侧),app->Tasks->android->signingReport。

     

    双击后,他会给我们调试版的安全码SHA1。这个测试版的安全码我们就可以填入了。

     

    2.2.发布版:这个需要我们找到自己的签名证书文件,如果没有的话,下面笔者带着大家申请一个:

     

    1. 申请签名证书文件
    2. 打开终端或者Terminal,获取正式版安全码SHA1。

    2.2.1申请签名证书文件:

    关于申请签名证书文件的方式有很多,可以通过终端,也可以通过Android  Studio,个人比较喜欢用Android Studio(可能是因为比较懒吧-。+!!)。

    点击Generate Signed APK 。

    他会出现一个这样的界面。在第一行中的Key Store path中指定我们签名文件的路径,如果没有的话点击Create new...

     

    随便填,只要你能记得住就行,Validity为签名文件有效时间,当然我们肯定用不了这么长时间的。点击ok。

    然后退出Generate signed APK,因为我们只是为了生成一个签名证书文件,又不是发布正式版的APK。

     

    2.2.2打开终端或者Terminal。

    推荐大家使用Terminal,因为Android Studio已经集成了,用起来比较方便(本人就是懒-。+)。

    首先要移动到我们刚刚生成的签名证书文件的路径下。

     

    然后输入以下代码:

    keytool -list -v -keystore 这是我们刚刚创建的签名证书文件的名字

    点击enter,

     

    他会出现让我们输入密匙口令,这个就是我们刚才创建签名文件的时候自己设置的。

     

    现在我们就获取到正式版的SHA1安全码了。

    现在我们将测试安全码和正式安全码填入,下面的包名我们在AndroidManifest.xml中自己就可以查找。不多说。

    我们看到现在已经应用中已经有了key。

     

    3、在Project中添加配置。

    我们从官方下载的SDK解压后如下:

    我下的是6.3.0的版本:

     

    3.1.导入jar包。

    3.1.1.我们将里面的jar包放入app/libs文件目录下。

     

    因为我已经导入了,在大家那里应该是看不到jar包前面的这个小箭头的。

    3.1.2.导入jar包

    导入jar包的方式有两种:

    一种是最暴力的,直接点击File->Sync Project with Gradle Files ,将所有libs目录下的jar包全部导入。

    另一种是我们选择将哪个jar包导入。File->Project Structure ->Dependencies -> + ->Jar dependency->找到自己Application Project的路径,->libs中选择自己想要导入的jar包。

    个人觉得还是第二中比较好,因为不必要的jar包导入让整个app看着很胖。

     

    3.2.放入.so文件

    放入.so文件同样有两种方式:使用默认配置(不修改build.gradle)和修改build.gradle配置。

    使用默认配置:将解压缩剩下的(除了jar包)的文件夹放入src/main/jniLibs文件夹下(没有自己创建,在几版本的Android Studio中我记得添加jni就会自动创建这个目录)

    修改build.gradle:将文件夹放入刚才的app/libs目录。然后打开build.gradle。

    在android下添加如下标签:

    android {
        compileSdkVersion 26
        defaultConfig {
            ......
            /*sourceSets{
                main{
                    jniLibs.srcDirs = ['libs']
                }
            }*/
        }
        ......
    }

     

    注释掉的部分,因为本人比较懒,所以用的默认配置-。+。

     

     

    3.3.在AndroidManifest.xml中进行配置。

    3.3.1.权限声明

    我们开发肯定需要一系列权限的声明(我直接打出来了,大家复制粘贴吧23333):

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
        <!--用于访问GPS定位-->
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
        <!--获取运营商信息,用于支持提供运营商信息相关的接口-->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
        <!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
        <!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
        <!--用于访问网络,网络定位需要上网-->
        <uses-permission android:name="android.permission.INTERNET"></uses-permission>
        <!--用于读取手机当前的状态-->
        <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
        <!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据-->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
        <!--用于申请调用A-GPS模块-->
        <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
        <!--用于申请获取蓝牙信息进行室内定位-->
        <uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
        <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>

    3.3.2.在Application标签中加入 meta-data标签

    <meta-data
                android:name="com.amap.api.v2.apikey"
                android:value="07e23534b69a1ea1dd7b17cc2812142c" />

     

    其中name一定要这样写,value就是我们刚才申请的key。

     

    3.3.3.声明Service组件

    <service android:name="com.amap.api.location.APSService"/>

     

    到现在为止我们申请和配置的工作就做完了(感觉也不是很多是吧!)

     

    二、显示地图

    由于篇幅的原因,我们今天只看一下如何显示地图以及显示定位蓝点。

    1、在layout中添加地图容器。

    这个是一个很没有操作的事情,我们默认一般都使用mapview,官方还提供了6中容器用来显示地图。

    <com.amap.api.maps.MapView
            android:id="@+id/map"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
    />
    

    2、使用AMap类。

    这个AMap类可以说是一个很重要的类,他是地图的控制器类,主要负责的工作有:

     

    • 地图模式切换(黑夜、卫星......)
    • 改变地图状态(旋转角度、俯仰角、中心坐标、缩放级别等)
    • 添加标记点(Marker)
    • 绘制几何图形(Polyline、Polyon、Circle等)
    • 事件监听(点击、手势)

    下面我们一起看一下AMap类的主要方法:

     

    限定符

    返回值

    方法名

    介绍

    字段

    public final 

    void

    setMapType(int)

    设置地图模式

    MAP_TYPE_NORMAL  普通

    MAP_TYPE_SATELLITE 卫星

    MAP_TYPE_NIGHT 夜间

    MAP_TYPE_NAVI 导航

    MAP_TYPE_BUS 公交

    public final

    int

    getMapType()

    获取地图模式

     

    public final

    UiSettings

    getUiSettings()

    获取地图UI控制器

     

    public final

    void

    setMylocationStyle(MyLocationStye)

    设置定位小蓝点(坐标位置)

     

    public final

    void

    setMylocationEnabled(boolean)

    设置是否启动定位蓝点

    true:启动显示

    false:隐藏定位蓝点,并不定位

    默认false

    public final

    void

    setTrafficEnabled(boolean)

    设置是否打开交通图层

    true:打开

    false:不打开

    默认true

    public final

    boolean

    isTrafficEnabled()

    获取是否已打开交通图层

     

    public final

    void

    showMapText(boolean)

    设置是否打开文字标注

    默认true

    public final

    void

    showIndoorMap(boolean)

    设置是否显示室内地图

    默认false

    public final

    void

    showBuildings(boolean)

    设置是否显示3D建筑

    默认true

    这里面涉及到两个其他的类:MyLocationStyle类和UiSettings类。我们今天主要看一下MyLocationStyle类:

    3、MyLocationStyle类介绍

    MyLocationStyle类为定位小蓝点的绘制样类。方法如下:

     

    限定符

    返回值

    方法名

    介绍

    字段

    public

    MyLocationStyle

    myLocationIcon(BitmapPescriptor)

    设置定位蓝点的图标

     

    public

    MyLocationStyle

    anchor(float u,float v)

    设置定位图标锚点的偏移量

     

    public

    MyLocationStyle

    radiusFillColor(int color)

    设置圆形区域的填充颜色

     

    public

    MyLocationStyle

    strokeColor(int color)

    设置圆形区域的边框颜色

     

    public

    MyLocationStyle

    strokeWidth(float width)

    设置圆形区域的边框宽度

     

    public

    MyLocationStyle

    inteval(long interval)

    设置连续定位请求间隔

     

    public

    MyLocationStyle

    showMyLocation(boolean visible)

    是否显示蓝点图标

    默认true,false情况会定位,但是图标不显示

    public

    MyLocationStyle

    myLocationType(int type)

    设置位置展示模式

    _SHOW 只定位一次

    _LOCAE 只定位一次,且将视角移动到地图中心点

    _FOLLOW 连续定位,将视角移动到中心点,定位蓝点随设备移动。

    _MAP_ROTATE 连续、视角移动到中心点,地图依照设备防线旋转,定位点随设备移动

    _LOCATON_ROTATE 连续、视角移动到中心点,定位点照地图方向旋转,跟设备移动。

    _LOCATION_ROTATE_NO_CENTER

    _MAP_ROTATE_NO_CENTER

    _FOLLOW_NO_CENTER

    后面这三个对应上面的三个,只是不一定到地图中心点

    可以看出MyLocationStyle是支持链式编写。

     

    有了上面的这些方法介绍,相信大家已经知道如何去显示一个地图了,下面直接给大家带来一个代码栗子了:

    private void initMap(Bundle savedInstanceState) {
            location = (TextView) findViewById(R.id.sample_text);
            location.setText(stringFromJNI());
            mapView = (MapView) findViewById(R.id.map);
            mapView.onCreate(savedInstanceState);
            if (aMap == null) {
                aMap = mapView.getMap();   //获取到aMap实例,从地图容器中获取
            }
    
            MyLocationStyle myLocationStyle;
            myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类
    
            myLocationStyle.radiusFillColor(getColor(R.color.colorAlphaRed));//设置圆形区域填充颜色为红色
    
            myLocationStyle.interval(5000); //设置连续定位模式下的定位间隔,只在连续定位模式下生效
    
            myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_MAP_ROTATE_NO_CENTER);//连续定位、蓝点不会移动到地图中心点,地图依照设备方向旋转,并且蓝点会跟随设备移动。
    
            aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style
    
            aMap.getUiSettings().setMyLocationButtonEnabled(true);  //设置默认定位按钮是否显示,非必需设置。
            aMap.setMyLocationEnabled(true);// 设置为true表示启动显示定位蓝点,
            aMap.showIndoorMap(true);//室内定位开启
    
            aMap.setMapType(AMap.MAP_TYPE_NIGHT);//地图类型设为夜晚
    
    }

    效果如下:

    由于模拟器无法实现地图定位,所以只能用真机截个图了!!!

    好了,关于高德地图初次使用就到这里了,下一篇中会给大家介绍如何实现定位功能。

    喜欢的朋友,如果感觉对你有所帮助的话,希望支持关注一波!!!

     
     
    展开全文
  • web端使用高德地图入门教程 不要问为什么使用高德地图,而不是百度地图,没有为什么 web端使用高德地图入门教程 开始 准备工作 开始 准备工作 如果开发者账号包括Key...
  • 由于前面通过echarts和百度地图都没能实现理想效果从而只能另寻方案,最终实现方案:全国省采用echarts渲染,单个省、地级市采用高德地图为地图渲染(有人可能会疑问为什么不全部采用高德地图渲染,在上一篇中我有...
  • 高德地图爬虫

    2019-02-27 11:11:13
    高德地图爬虫 工具:Pycharm,win10,Python3.6.4 1.需求分析 这篇爬虫和上一篇百度地图爬虫要求一样,百度地图爬虫我发现有一个auth参数会一直变化,一旦变化则获取的数据是不准确的,所以我上高德地图看了一下,...
  • 高德地图

    2019-06-20 21:33:57
    高德地图需要导入以下依赖和权限 (1)依赖 implementation 'com.amap.api:location:4.2.0' implementation'com.amap.api:map2d:5.2.0' (2)key(在高德地图开发个人里面复制key): 放在</activity>下面 <meta...
  • react项目中使用高德地图 基本项目使用create-react-app创建项目,并引入typescript 1. 申请高德key 2. 在index.html中引入高德地图 <script type="text/javascript" src=...
  • 最近在项目中,有需要使用到获取用户当前地理位置信息的功能,获取当前用户位置保存到数据库中的场景,并且需要支持多种地图定位方式,我这里采用系统参数配置的方式,暂时实现了高德地图和腾讯地图两种方式,下面...
  • 之前我写的切换是给两类不同的点绑定上不同的 class名称 给他们做显示隐藏(比较lou的方法大家不要学习)这样做的后果会导致一个问题就是地图上的自己定义的内容是隐藏起来了看不到了 但是点击地图 还是存在这个...
  • 阿里巴巴高德地图 AMAP-TECH 算法大赛于 7 月 8 日开启初赛,赛题为「基于车载视频图像的动态路况分析」,活动邀请了业界权威专家担任评委,优秀选手不仅可以瓜分丰厚的奖金,领取荣...
  • 解决高德地图锁屏黑屏定位不更新,高德地图绘制定位轨迹,高德定位判断定位停留点,高德地图绘制弹出框等内容。高德地图将所有坐标绘制在可视区域内,本程序作为向高德地图申请高德LBS开发平台开发者认证证书的做业...
  • 高德地图集成概要高德地图集成(一):高德地图简单实现由于一开始是接触地图是接触的百度地图所以做项目的也是也会首先选择百度地图。但是自己使用的是高德地图于是想简单集成一下高德地图。以便以后实时应变。高德...
  • vue2(webpack)调用amap高德地图及其UI组件和标记物 今天一个app项目中要使用vue2加入高德地图,本来以为有第三方的插件,结果没找到适合自己用的,因为地图这块,一般都是自定义程度比较高的。注:这块针对的是...
  • 本文章介绍微信小程序调用高德地图API的过程,使用高德定位功能做演示。 微信小程序目前支持百度地图、高德地图、腾讯地图。用法都基本一致,简单说一下他们的区别,高德地图精度应该是最准确的,毕竟本来就是做...
  • 最近笔者在做一个直播APP,里面有个附近的视频功能,获取周边的视频,要实时定位,用到高德地图,那么笔者把高德地图接口申请以及接口集成的过程分享出来。 一、注册 1、填写信息 2、成为开发者 3、注册完成...
  • 高德地图——申请Key

    2018-03-05 09:28:49
    高德地图API WEB开发(key申请,地图搭建)简约教程前端时间因为公司需要研究 了一下百度的教程然后写个简约的笔记记录一下自己学习的收获,只为了满足自己暂时的写作热情 高德地图WEB开发(key申请、api)简约教程...
1 2 3 4 5 ... 20
收藏数 26,188
精华内容 10,475
关键字:

高德地图