Android studio 百度地图开发(4)触摸选点、地理编码

Android studio 百度地图开发(4)触摸选点、地理编码

email:[email protected]

      开发环境:win7 64位,Android Studio,请注意是Android Studio,使用的导航SDK版本:3.1.0

  • 百度地图显示:Android studio 百度地图开发(1)配置工程、显示地图
  • 百度地图定位Android studio 百度地图开发(2)地图定位
  • 百度地图导航:Android studio 百度地图开发(3)地图导航

一.前言

      之前通过百度地图官网的Demo学习了百度地图显示、定位和导航。

       (1)百度地图显示,主要是初步学习一下工程配置;

       (2)百度地图定位,实现了对客户端的定位,主要目的是了解:

               LocationClient类(定位SDK核心类);

              LocationClientOption类(定位配置信息类);

               BDLocationListener接口(SDK定位监听);

               BDLocation类(定位获得的数据信息类)等数据结构,以及它们之间的关系;

      (3)百度地图导航,实现了对指定起点和终点的路径规划;

       那么,我后续又进行了定位+(触摸选点+地理编码)导航的实现:在地图中长按一个点,通过反地理编码获得该点的经度维度以及地名等信息,点击“去这里”按钮计算客户端点和该点的导航路径。长按一点后,显示该点的信息信息以及“去这里”按钮最好可以使用覆盖物或者infoWindow实现,但是为了先将导航实现,我只是写了一个TextView来实现的,后期再学习覆盖物和infoWindow后再完善。

二.功能实现

以下代码只是一部分,整个工程点击这里下载。

1.触摸选点

        /**
         * 为百度地图增加长按监听函数
         */
        baiduMap.setOnMapLongClickListener(new BaiduMap.OnMapLongClickListener() {
            @Override
            public void onMapLongClick(LatLng latLng) {
                /**
                 * 存储定位点信息
                 */
                currentPt = latLng;
                /**
                 * 发起反向搜索
                 */
                reverseSearch(latLng);
            }
        });

2.正反向地理编码

(1)正向地理编码:将地址信息转换为经纬度坐标;

(2)反向地理编码:将经纬度坐标转换为地址信息;

第一步:声明搜索模块

/**
     * 搜索模块
     */
    GeoCoder mSearch = null;
第二步:注册监听
<pre name="code" class="java">        /**
         * 初始化搜索模块,注册事件监听
         */
        mSearch = GeoCoder.newInstance();
        mSearch.setOnGetGeoCodeResultListener(this);

 
 第三步:监听 
 

     /**
     * 正向地理编码和反向地理编码
     * @param result
     */
    @Override
    public void onGetGeoCodeResult(GeoCodeResult result) {
        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
            Toast.makeText(BaiDuMapActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
                    .show();
            return;
        }
        baiduMap.clear();
        baiduMap.addOverlay(new MarkerOptions().position(result.getLocation())
                .icon(BitmapDescriptorFactory
                        .fromResource(R.drawable.icon_marka)));
        baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result
                .getLocation()));
        String strInfo = String.format("纬度:%f 经度:%f",
                result.getLocation().latitude, result.getLocation().longitude);
        Toast.makeText(BaiDuMapActivity.this, strInfo, Toast.LENGTH_LONG).show();
    }
    @Override
    public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
            Toast.makeText(BaiDuMapActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG)
                    .show();
            return;
        }
        baiduMap.clear();
        baiduMap.addOverlay(
                new MarkerOptions()
                        .position(result.getLocation())                                     //坐标位置
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_marka))  //图标
                        .title(result.getAddress())                                         //标题

        );
        baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result
                .getLocation()));
        Toast.makeText(BaiDuMapActivity.this, result.getAddress(),
                Toast.LENGTH_LONG).show();
        /**
         * 弹出InfoWindow,显示信息
         */
        poputInfo(result);
    }

第五步:反向搜索

    /**
     * 反向搜索
     * @param latLng
     */
    public void reverseSearch(LatLng latLng)
    {
        mSearch.reverseGeoCode(new ReverseGeoCodeOption()
                .location(latLng));
    }

3.弹出显示信息的窗口;为按钮绑定点击事件

 /**
     * 弹出InfoWindow,显示信息
     */
    public void poputInfo(final ReverseGeoCodeResult result)
    {
        /**
         * 获取弹窗控件
         */
        popuInfoView = (RelativeLayout) findViewById(R.id.id_marker_info);
        TextView addrNameView = (TextView)findViewById(R.id.addrName);
        if(addrNameView!=null)
            addrNameView.setText(result.getAddress());
        popuInfoView.setVisibility(View.VISIBLE);

        /**
         * 首先进行授权
         */
        if(initDirs())
            initNavi();
        /**
         * 获取到这去 按钮
         */
        Button goButton = (Button)findViewById(R.id.goButton);
        /**
         * 为到这去按钮绑定点击事件
         */
        goButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /**
                 * 判断是否已经授权
                 */
                if(!BaiduNaviManager.isNaviInited())
                {
                    Toast.makeText(BaiDuMapActivity.this, "授权失败咯", Toast.LENGTH_SHORT).show();
                    return;
                }
                /**
                 * 获取该点的坐标位置
                 */
                LatLng ll = new LatLng(result.getLocation().latitude,result.getLocation().longitude);
                BNRoutePlanNode sNode = null;
                BNRoutePlanNode eNode = null;

                Toast.makeText(BaiDuMapActivity.this, "开始获取起点和终点", Toast.LENGTH_SHORT).show();
                sNode = new BNRoutePlanNode(
                        currentLoction.getLongitude(),          //经度
                        currentLoction.getLatitude(),           //纬度
                        currentLoction.getBuildingName(),       //算路节点名
                        null,                                   //算路节点地址描述
                        BNRoutePlanNode.CoordinateType.BD09LL
                        ); //坐标类型
                eNode = new BNRoutePlanNode(
                        result.getLocation().longitude,
                        result.getLocation().latitude,
                        result.getAddress(),
                        null,
                        BNRoutePlanNode.CoordinateType.BD09LL);

                if (sNode != null && eNode != null) {
                    List<BNRoutePlanNode> list = new ArrayList<BNRoutePlanNode>();
                    list.add(sNode);
                    list.add(eNode);
                    /**
                     * 发起算路操作并在算路成功后通过回调监听器进入导航过程,返回是否执行成功
                     */
                    BaiduNaviManager
                            .getInstance()
                            .launchNavigator(
                                    BaiDuMapActivity.this,							//建议是应用的主Activity
                                    list,							//传入的算路节点,顺序是起点、途经点、终点,其中途经点最多三个
                                    1,								//算路偏好 1:推荐 8:少收费 2:高速优先 4:少走高速 16:躲避拥堵
                                    true,							//true表示真实GPS导航,false表示模拟导航
                                    new DemoRoutePlanListener(sNode)//开始导航回调监听器,在该监听器里一般是进入导航过程页面
                            );
                }

            }
        });
}

ok,剩下的就应该是前面导航部分涉及到的东西了。

三.结果

Android studio 百度地图开发(4)触摸选点、地理编码_第1张图片

Android studio 百度地图开发(4)触摸选点、地理编码_第2张图片

四.工程代码

点击这里前往下载(.java和.xml文件以及所有的jar包和.so文件)。

因为用Android Studio做百度地图应用的资料还不是很多,如果有问题,欢迎大家相互讨论:[email protected]

你可能感兴趣的:(android,百度地图,Studio)