高德地图使用小结

作者: 想入飞飞___ | 来源:发表于2016-11-14 16:07 被阅读3173次

    前言

    高德地图的api使用方法和百度地图差不多,照着Demo写也并不难,前段时间做的高德地图如今已经忘的差不多了,我的记性真是差,而且最近在重构代码,我才现以前理解的还是不够透彻有问题,希望写下来常常可以看看。

    最简单的定位

    定位基本上都是一个LocationClient类开始定位,LocationListener进行定位监听拿到定位结果,百度地图中也是这样的。

    实例化对象

     private void initLocation() {
    
            if(locationClient ==null)
            {
                locationClient = new AMapLocationClient(this);
            }
            if(option == null)
            {
                option = new AMapLocationClientOption();
                option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
            }
    
            //定位监听
            locationClient.setLocationListener(this);
            locationClient.setLocationOption(option);
            locationClient.startLocation();
        }
    
    

    定位结果的回调方法

      @Override
        public void onLocationChanged(AMapLocation aMapLocation) {
            if(aMapLocation!=null)
            {
                if(aMapLocation.getErrorCode()==0)
    
                    Log.d(TAG, "onLocationChanged: "+aMapLocation.getAddress());
                }
                else {
                    Log.d(TAG, "onLocationChanged: "+aMapLocation.getErrorCode()+aMapLocation.getErrorInfo());
                }
            }
        }
    
    

    从AmapLocation对象中可以拿到相关的地理位置信息。
    定位结果:onLocationChanged: 江苏省南京市浦口区

    定位并且在地图上显示出我的位置

    有的时候不仅仅希望能拿到城市经纬度,还希望可以直接在地图上看到,怎么办呢?
    不是刚刚已经说了,拿到经纬度了吗,那么在地图上放个Marker,再把地图移到这个经纬度上,我们不就可以看到了吗?
    对,这是一种方法,可是看高德地图Demo中还有一种更简单的方法。

    直接看代码

    //定位
        private void initLocation() {
          //地图监听定位
            mAmap.setLocationSource(this);
     /**
        设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
        不设置true定位定不出来(一个大坑)
    **/
            mAmap.setMyLocationEnabled(true);
    
        }
    

    setLocationSource主要有两个方法

    • void activate(LocationSource.OnLocationChangedListener onLocationChangedListener) //激活定位,实例化对象,设置监听等
    • void deactivate() 释放资源 如停止定位

    具体代码:

    
    //定位回调接口
     @Override
        public void onLocationChanged(AMapLocation aMapLocation) {
            if (aMapLocation != null&&mlistener!=null) {
                if (aMapLocation.getErrorCode() == 0)
                  //这行直接显示我的位置,并且给出一个默认的图标标位置
                    mlistener.onLocationChanged(aMapLocation);
                    Log.d(TAG, "onLocationChanged: " + aMapLocation.getAddress());
            } else {
                Log.d(TAG, "onLocationChanged: " + aMapLocation.getErrorCode() + aMapLocation.getErrorInfo());
            }
        }
    
    
    //激活定位 
        @Override
        public void activate(LocationSource.OnLocationChangedListener onLocationChangedListener) {
            mlistener = onLocationChangedListener;
    
            if(locationClient ==null)
            {
                locationClient = new AMapLocationClient(this);
            }
            if(option == null)
            {
                option = new AMapLocationClientOption();
                设置GPS定位优先,即使设置高精度定位模式,它也会优先GPS在室内定位很差,最好不要设置,就默认的也就是false;
                option.setGpsFirst(true);
                //高精度定位模式
                option.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
            }
            //设置定位,onLocationChanged就是这个接口的方法
            locationClient.setLocationListener(this);
            locationClient.setLocationOption(option);
            //开始定位 
            locationClient.startLocation();
        }
    
        @Override
        public void deactivate() {
            if(locationClient.isStarted())
                locationClient.stopLocation();
            locationClient = null;
            mlistener=null;
        }
    
    搜索结果.png

    Poi搜索

    poi,point of interset,也就是兴趣点搜索,区别于正向地址解析。.
    一般就是为搜索设置查询条件,然后异步搜索。

    // 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
     query = new PoiSearch.Query(keyWord,"",aMapLocation.getCity());
            // 设置query为poiSearch的查询条件
            poiSearch  = new PoiSearch(mContext,query);
            //  搜索回调接口
            poiSearch.setOnPoiSearchListener(this);
            //  设置异步搜索
            poiSearch.searchPOIAsyn();
    

    搜索结果

     @Override
        public void onPoiSearched(PoiResult poiResult, int i) {
            view.hideProgress();
    
            if(i==1000)
            {
                if(null != poiResult&&poiResult.getQuery()!=null)
                {
                  //判断返回的结果和想要查询的结果是否一致
                    if(poiResult.getQuery().equals(query))
                    {
                        List<PoiItem> poiItem = poiResult.getPois();
                        if(null!= poiItem&&poiItem.size()>0)
                        {
                            //aMap.clear();
                            //添加覆盖物
                            PoiOverlay poiOverlay = new PoiOverlay(aMap,poiItem);
                            poiOverlay.removeFromMap();
                            poiOverlay.addToMap();
                            poiOverlay.zoomToSpan();
                        }
                    }
                }
            }
      
        }
    
    poi搜索.png

    最后说一个高等地图的一个坑

    
            <!-- 高德地图配置 -->
            <meta-data
                android:name="com.amap.api.v2.apikey"
                android:value="08c9b26d3ce86fb2159bb8b233960c88" />
            <!-- 高德地图定位 -->
            <service android:name="com.amap.api.location.APSService" />
    

    "com.amap.api.v2.apikey"这个不能改是固定死的,和百度地图一样,不然定位失败。


    注意:高德地图并不是比较密钥“08c9b26d3ce86fb2159bb8b233960c88”,而是比较申请key的时候填写的sha1加密值和包名。一台机器上运行的项目放到另一台机器上地图就定位不出结果了,显示key配置有问题,这里就是你本地机器sha1加密和高德服务器上的不一样,所以才会这样。

    相关文章

      网友评论

        本文标题:高德地图使用小结

        本文链接:https://www.haomeiwen.com/subject/tvyhpttx.html