android studio高德地图基础应用+定位规划路线

1.申请Key

    首先注册成为高德开发平台用户,http://lbs.amap.com/,进入控制台,点击右上角创建应用按钮,应用程序创建以后,点击该应用展开,应用对应右侧添加Key值,进入如下界面

添加新Key

Key名称:为你的应用起一个名字。

服务平台默认选择android sdk。

发布版sha1获取命令:在studio中Terminal下输入命令keytool -list -v -keystore **.keystore,之后输入keystore的密码,**为你的keystore名称;

测试版sha1获取命令:keytool -list -v -keystore debug.keystore,密码略过;

package:一定要是你要使用高德的项目中的package,否则高德会找不到项目。



2.基础使用(附代码)

       基础使用只需要2DMap包,定位需要使用Location包,而搜索及路线规划需用到Service包,共三包请先准备好。

        @Override

       protected voidonCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);

                setContentView(R.layout.activity_order_detail);

                model.mapView = (MapView)findViewById(R.id.mapView);

                model.mapView.onCreate(savedInstanceState);  //创建Map对象

       }

      @Override

       protected voidonDestroy() {

               model.mapView.onDestroy();

              super.onDestroy();

       }

       @Override

        protected voidonResume() {

                   //在activity执行onResume时执行mMapView.onResume (),实现地图生命周期管理

                  model.mapView.onResume();

                  super.onResume();

        }

        @Override

        protected voidonPause() {

                //在activity执行onPause时执行mMapView.onPause (),实现地图生命周期管理

               model.mapView.onPause();

               super.onPause();

         }

         @Override

          protected voidonSaveInstanceState(Bundle outState) {

                  //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),实现地图生命周期管理

                model.mapView.onSaveInstanceState(outState);

                super.onSaveInstanceState(outState);

           }

一定要在使用MapView的Activity中进行MapView生命周期管理,否则会出现地图无法显示,内存溢出等问题。


3.定位

          //初始化定位

         mLocationClient=newAMapLocationClient(ac);

          //设置定位回调监听

          mLocationClient.setLocationListener(this);

            //初始化定位参数

              mLocationOption=newAMapLocationClientOption();

              //设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式

             mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);

            //设置是否返回地址信息(默认返回地址信息)

             mLocationOption.setNeedAddress(true);

            //设置是否只定位一次,默认为false

              mLocationOption.setOnceLocation(true);

           //设置是否强制刷新WIFI,默认为强制刷新

         mLocationOption.setWifiActiveScan(true);

            //设置是否允许模拟位置,默认为false,不允许模拟位置

          mLocationOption.setMockEnable(false);

         //设置定位间隔,单位毫秒,默认为2000ms

           mLocationOption.setInterval(2000);

          //给定位客户端对象设置定位参数

          mLocationClient.setLocationOption(mLocationOption);

        //启动定位

          mLocationClient.startLocation();

在Activity的初始化中写入以上方法,setOnceLocation(true)为指定位一次,然后在LocationChangeListener的监听方法中处理定位事件。

      @Override

        public voidonLocationChanged(AMapLocation aMapLocation) {

                    aMapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见官方定位类型表

                    startLatitude=  aMapLocation.getLatitude();//获取纬度

                  startLongitude= aMapLocation.getLongitude();//获取经度

                   aMapLocation.getAccuracy();//获取精度信息

                  city= aMapLocation.getCity();//城市信息

                   area= aMapLocation.getDistrict();//城区信息

                  street= aMapLocation.getStreet();//街道信息

                  detailAddr= aMapLocation.getStreetNum();//街道门牌号信息

                  cityCode= aMapLocation.getCityCode();

                  if(cityCode==null||StringUtils.isEmpty(cityCode)){

                            Toast.makeText(ac,"定位失败,请检查后重试",Toast.LENGTH_SHORT).show();

                  }else{

                           startAddrText.setText(city+area+street+detailAddr);

                  }

        }

记录下定位返回的城市Code,经度,纬度等信息,在接下来的实践中会用得到。


4.搜索地址并自动补全

           创建搜索界面,并在EditText中设置addTextWatcher监听,在after方法中处理输入完成监听事件。

          代码:if(cityCode!=null) {    //之所以判空是因为本次实践是在同城路线规划

                        PoiSearch.Query query =newPoiSearch.Query(name,"",cityCode);

                        //keyWord表示搜索字符串,

                        //第二个参数表示POI搜索类型,二者选填其一,

                         //POI搜索类型共分为以下20种:汽车服务|汽车销售|

                    //汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|体育休闲服务|医疗保健服务|

                       //住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务|交通设施服务|

                       //金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施

                     //cityCode表示POI搜索区域,可以是城市编码也可以是城市名称,也可以传空字符串,空字符串代表全国在全国范围内进行搜索

                    query.setPageSize(10);// 设置每页最多返回多少条poiitem

                     query.setPageNum(1);//设置查询页码

                      poiSearch=newPoiSearch(ac, query);

                      poiSearch.setOnPoiSearchListener(this);

                      poiSearch.searchPOIAsyn();

              }

              在onPoiSearched方法的返回结果中进行处理初始化搜索的列表项。

             if(rCode ==1000) {

                      if(poiResult !=null&& poiResult.getQuery() !=null) {// 搜索poi的结果

                                 poiItems= poiResult.getPois();// 取得第一页的poiitem数据,页数从数字0开始

                                  initListView();

                          }

             } else{

                         Toast.makeText(ac,"错误码为:"+rCode,Toast.LENGTH_SHORT).show();

               }

          选中LIstView的某项后记录下选中地址的经纬度等信息。


5.线路规划并在地图上画出路线

          //根据以上记录下的开始经纬度和结束经纬度进行查询路线

        LatLonPointstartPoint =newLatLonPoint(startLatitude,startLongitude);

        LatLonPointendPoint =newLatLonPoint(endLatitude,endLongitude);

        RouteSearch.FromAndTo fromAndto =newRouteSearch.FromAndTo(startPoint,endPoint);

         RouteSearch.DriveRouteQuery query =newRouteSearch.DriveRouteQuery(fromAndto,2,null,null,""); //第二个参数传2为默认驾车路线查询,1为公交路线,3为步行路线。

        在onDriveRouteSearched相应方法中进行路线处理,

        //驾车路线规划

        if(i==1000){

              if(driveRouteResult !=null&& driveRouteResult.getPaths() !=null&& driveRouteResult.getPaths().size() >0) {

                       DrivePath drivePath = driveRouteResult.getPaths().get(0);

                        amap.clear();// 清理地图上的所有覆盖物

                        DrivingRouteOverlay drivingRouteOverlay =newDrivingRouteOverlay(ac,amap, drivePath, driveRouteResult.getStartPos(),

                         driveRouteResult.getTargetPos());

                          drivingRouteOverlay.removeFromMap();

                            drivingRouteOverlay.addToMap();

                            drivingRouteOverlay.zoomToSpan();

               }else{

                        Toast.makeText(ac,"距离太短无法显示路线",Toast.LENGTH_SHORT).show();

                }

      }else if(i ==27) {

              Toast.makeText(ac,"网络连接异常",Toast.LENGTH_SHORT).show();

        }else if(i ==32) {

              Toast.makeText(ac,"技术异常,请联系客服人员",Toast.LENGTH_SHORT).show();

         }else{

              Toast.makeText(ac,"错误码为:"+i,Toast.LENGTH_SHORT).show();;

        }

    如果需要计算公里数,时间等功能在DrivePath的List<DriveStep>对象中进行叠加计算,代码:

    List steps =  drivePath.getSteps();

   distance=0;

    totalSecond=0;

     hour=0;

      minutes=0;

      if(steps!=null&&steps.size()>0){

                 for(DriveStep step : steps){

                           distance+= step.getDistance();//距离

                           totalSecond+= step.getDuration();

                 }

      }

     if(distance!=0&&totalSecond!=0){

                   distance=distance/1000;

                  floattempMinute =totalSecond/60;

                //second = totalSecond%60==0?0:(int)(totalSecond%60);

                if(tempMinute>1){

             minutes= (int)tempMinute;

      }else{

              Toast.makeText(ac,"距离太短,无法计算价格",Toast.LENGTH_SHORT).show();

              return;

        }

      if(minutes>59){

               hour=minutes/60;

               minutes=minutes%60;

         }

     if(distance<=0){

           Toast.makeText(ac,"规划有误,请检查网络重试",Toast.LENGTH_SHORT).show();

           return;

     }

      DecimalFormat df =newDecimalFormat("###.00");

        distance= Float.parseFloat(df.format(distance));

     if(hour!=0&&minutes!=0){

           totalTimeTexts.setText("共"+distance+"公里;需"+hour+"小时"+minutes+"分钟");

     }else if(hour==0){

           totalTimeTexts.setText("共"+distance+"公里;需"+minutes+"分钟");

    }else if(minutes==0){

           totalTimeTexts.setText("共"+distance+"公里;需"+hour+"小时");

       }

第五条讲解为两点之间的路线查询,后续功能会在新的博客中继续分享....与君共勉

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容