Android之百度地图集成

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fu_17791654327/article/details/79674614

Android之百度地图集成

注册和获取密钥

注册百度账号

注册链接:点击进行百度账号注册

创建应用

1.应用名称
2.应用类型(Android SDK)
3.发布版SHA1(详见:)
4.包名 (AndroidManifest.xml文件中)
5.提交生成AK

下载开发包并进行配置

1.开发包下载链接:点击下载开发包
2.解压下载的压缩包
3.复制libs文件夹下的所有文件至项目libs文件夹下,并将jar包添加到应用中。
4.build.gradle文件中说明so的路径为该libs路径,关联所有地图SDK的so文件

android {
    sourceSets {
        main {
            jniLibs.srcDir 'libs'
            //说明so的路径为该libs路径,关联所有地图SDK的so文件
        }
    }
}

5.AndroidManifest.xml中加入相关配置及权限。

        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="创建应用后得到的AppKey" />
        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" />

使用

1.创建地图

  • xml文件中添加地图组件
    <com.baidu.mapapi.map.TextureMapView
        android:id="@+id/bmapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true" />
  • 代码中获取地图组件,并设置地图显示图层
        //获取地图控件引用
        mMapView = (TextureMapView) findViewById(R.id.bmapView);
        //获取地图控制器对象
        mBaiduMap = mMapView.getMap();
        // 设置地图图层
        mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);  // 默认地图(2D,3D ),还有卫星地图(BaiduMap.MAP_TYPE_SATELLITE),空白地图(BaiduMap.MAP_TYPE_NONE)
  • 显示定位

        // 定位参数配置
        option = new LocationClientOption();
        option.setOpenGps(true); // 打开gps
        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(1000); // 定位次数
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        // 可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
        option.setIsNeedAddress(true);// 可选,设置是否需要地址信息,默认不需要
        option.setIsNeedLocationPoiList(true);// 可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到

        // 开启定位图层
        mBaiduMap.setMyLocationEnabled(true);

        // 自定义定位图标
        mCurrentMarker = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);

        // 自定义精度圈填充颜色
        int accuracyCircleFillColor = 0x556EE1F4;//自定义精度圈填充颜色

        // 自定义精度圈边框颜色
        int accuracyCircleStrokeColor = 0xFF116DDD;//自定义精度圈边框颜色

        // 定位图层的配置(定位模式,是否允许方向信息,用户自定义定位图标)
        MyLocationConfiguration myLocationConfiguration = new MyLocationConfiguration(
                mCurrentMode, true, mCurrentMarker,
                accuracyCircleFillColor, accuracyCircleStrokeColor);

        //打开室内图,默认为关闭状态
        mBaiduMap.setIndoorEnable(true);

        // 设定定位图层配置
        mBaiduMap.setMyLocationConfiguration(myLocationConfiguration);


//        // 当不需要定位图层时关闭定位图层
//        mBaiduMap.setMyLocationEnabled(false);


//        // 设置定位跟随状态(使用默认图标)
//        mBaiduMap.setMyLocationConfigeration(
//                new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, mCurrentMarker));

        // 定位初始化
        mLocClient = new LocationClient(this);

        // 定位监听
        MyLocationListener myLocListener = new MyLocationListener();

        // 定位监听
        mLocClient.registerLocationListener(myLocListener);

        // 设置定位参数
        mLocClient.setLocOption(option);

        // 开启定位
        mLocClient.start();


    /**
     * 定位SDK监听函数
     */
    public class MyLocationListener implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {
            // map view 销毁后不在处理新接收的位置
            if (location == null || mMapView == null) {
                return;
            }
            // 此处设置开发者获取到的方向信息,顺时针0-360
            MyLocationData locData = new MyLocationData.Builder().accuracy(location.getRadius())
                    // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(100).latitude(location.getLatitude()).longitude(location.getLongitude()).build();
            // 设置定位数据
            mBaiduMap.setMyLocationData(locData);
            if (isFirstLoc) {
                isFirstLoc = false;
                // 经纬度获取
                latitude = location.getLatitude();
                longitude = location.getLongitude();

                // 移动定位图标至定位点上
                latLngLocation = new LatLng(latitude, longitude);
                builder = new MapStatus.Builder();
                builder.target(latLngLocation).zoom(18.0f);
                mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));

                Toast.makeText(MainActivity.this, "当前所在位置:" + location.getAddrStr(), Toast.LENGTH_LONG).show();
                tvAtvtMainHeatingPower.setText(location.getCity());
            }
        }


    }

2.与地图交互

  • 地图单击事件
        // TODO: 2018/3/27 0027 地图单击事件 
        mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
            /**
             * 地图单击事件回调函数
             * @param point 点击的地理坐标
             */
            public void onMapClick(LatLng point) {
                Log.e("onMapClick", "获取到点击坐标 = " + point);
            }

            /**
             * 地图内 Poi 单击事件回调函数
             * @param poi 点击的 poi 信息
             */
            public boolean onMapPoiClick(MapPoi poi) {
                Log.e("onMapPoiClick", " 地图poi的信息  name = " + poi.getName()
                        + "   uid = " + poi.getUid() + "   latlng = " + poi.getPosition());
                return true;
            }
        });

  • 地图长按事件
        // TODO: 2018/3/27 0027 地图长按事件 
        mBaiduMap.setOnMapLongClickListener(new BaiduMap.OnMapLongClickListener() {
            @Override
            public void onMapLongClick(LatLng latLng) {
                Log.e("onMapLongClick", "长按事件  latLng = " + latLng);
            }
        });
  • 地图定位点点击事件
        // TODO: 2018/3/27 0027 地图定位点点击事件
        mBaiduMap.setOnMyLocationClickListener(new BaiduMap.OnMyLocationClickListener() {
            /**
             * 地图定位图标点击事件监听函数
             */
            public boolean onMyLocationClick() {
                Log.e("onMyLocationClick", "定位图标点击事件");
                return false;
            }
        });
  • 地图覆盖物点击事件
        // TODO: 2018/3/27 0027 覆盖物单击事件 
        mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
            /**
             * 地图 Marker 覆盖物点击事件监听函数
             * @param marker 被点击的 marker
             */
            public boolean onMarkerClick(Marker marker) {
                Log.e("onMarkerClick", "覆盖物点击事件监听 = " + marker);
                return false;
            }
        });
  • 地图覆盖物拖拽事件
        // TODO: 2018/3/27 0027 地图上覆盖物拖拽的监听 
        mBaiduMap.setOnMarkerDragListener(new BaiduMap.OnMarkerDragListener() {
            public void onMarkerDrag(Marker marker) {
                //拖拽中
                Log.e("onMarkerDrag", "拖拽中  marker = " + marker);
            }
            public void onMarkerDragEnd(Marker marker) {
                //拖拽结束
                Log.e("onMarkerDragEnd", "拖拽结束  marker = " + marker);
            }
            public void onMarkerDragStart(Marker marker) {
                //开始拖拽
                Log.e("onMarkerDragStart", "开始拖拽  marker = " + marker);
            }
        });
  • 地图触摸事件
        // TODO: 2018/3/27 0027 地图触摸事件 
        mBaiduMap.setOnMapTouchListener(new BaiduMap.OnMapTouchListener() {
            /**
             * 当用户触摸地图时回调函数
             * @param event 触摸事件
             */
            public void onTouch(MotionEvent event) {
                Log.e("onTouch","触摸事件 event = " + event );
            }
        });
  • 地图滑动事件
        // TODO: 2018/3/27 0027 地图滑动监听 
        mBaiduMap.setOnMapStatusChangeListener(new BaiduMap.OnMapStatusChangeListener() {
            @Override
            public void onMapStatusChangeStart(MapStatus mapStatus) {
            }

            @Override
            public void onMapStatusChangeStart(MapStatus mapStatus, int i) {
                Log.e("onMapStatusChangeStart","地图滑动开始 + 2    mapStatus = " + mapStatus  + "    i = " + i);
            }

            @Override
            public void onMapStatusChange(MapStatus mapStatus) {
                Log.e("onMapStatusChange","地图滑动中    mapStatus = " + mapStatus );
            }

            @Override
            public void onMapStatusChangeFinish(MapStatus mapStatus) {
                Log.e("onMapStatusChangeFinish","地图滑动完成    mapStatus = " + mapStatus );
            }
        });

3.在地图上绘制

  • 绘制线
        // TODO: 2018/3/27 0027 绘制多段线 
        //构建折线点坐标
        LatLng p1 = new LatLng(39.97923, 116.357428);
        LatLng p2 = new LatLng(36.94923, 113.397428);
        LatLng p3 = new LatLng(33.97923, 119.437428);
        List<LatLng> points = new ArrayList<LatLng>();
        points.add(p1);
        points.add(p2);
        points.add(p3);

        //绘制折线
        OverlayOptions ooPolyline = new PolylineOptions().width(10)
                .color(0xAAFF0000).points(points);
        Polyline mPolyline = (Polyline) mBaiduMap.addOverlay(ooPolyline);

//        mPolyline.setDottedLine(true);   //设置是否虚线绘制


        // TODO: 2018/3/27 0027 绘制多段分色线 
        // 构造折线点坐标
        List<LatLng> pointss = new ArrayList<LatLng>();
        pointss.add(new LatLng(39.965, 116.404));
        pointss.add(new LatLng(39.925, 116.454));
        pointss.add(new LatLng(39.955, 116.494));
        pointss.add(new LatLng(39.905, 116.554));
        pointss.add(new LatLng(39.965, 116.604));

        //构建分段颜色索引数组
        List<Integer> colors = new ArrayList<>();
        colors.add(Integer.valueOf(Color.BLUE));
        colors.add(Integer.valueOf(Color.RED));
        colors.add(Integer.valueOf(Color.YELLOW));
        colors.add(Integer.valueOf(Color.GREEN));

        OverlayOptions oooPolyline = new PolylineOptions().width(10)
                .colorsValues(colors).points(pointss);

        // 添加在地图中
        mPolyline = (Polyline) mBaiduMap.addOverlay(oooPolyline);
  • 绘制面
        // TODO: 2018/3/27 0027 绘制圆 
        LatLng llCircle = new LatLng(39.90923, 116.447428);
        Stroke stroke = new Stroke(5, 0xAA000000);
        OverlayOptions ooCircle = new CircleOptions().fillColor(0x000000FF).center(llCircle).stroke(stroke).radius(1400);
        // 设置颜色和透明度,均使用16进制显示,0xAARRGGBB,如 0xAA000000 其中AA是透明度,000000为颜色
        mBaiduMap.addOverlay(ooCircle);


        // TODO: 2018/3/27 0027 绘制多边形 
        //定义多边形的五个顶点
        LatLng pt1 = new LatLng(39.93923, 116.357428);
        LatLng pt2 = new LatLng(39.91923, 116.327428);
        LatLng pt3 = new LatLng(39.89923, 116.347428);
        LatLng pt4 = new LatLng(39.89923, 116.367428);
        LatLng pt5 = new LatLng(39.91923, 116.387428);
        List<LatLng> pts = new ArrayList<LatLng>();
        pts.add(pt1);
        pts.add(pt2);
        pts.add(pt3);
        pts.add(pt4);
        pts.add(pt5);

        //构建用户绘制多边形的Option对象
        OverlayOptions polygonOption = new PolygonOptions()
                .points(pts)
                .stroke(new Stroke(5, 0xAA00FF00))
                .fillColor(0xAAFFFF00);

        //在地图上添加多边形Option,用于显示
        mBaiduMap.addOverlay(polygonOption);
  • 绘制文字
        //定义文字所显示的坐标点
        LatLng llText = new LatLng(39.86923, 116.397428);

        //构建文字Option对象,用于在地图上添加文字
        OverlayOptions textOption = new TextOptions()
                .bgColor(0xAAFFFF00)  // 背景色
                .fontSize(24)         // 文字大小
                .fontColor(0xFFFF00FF)  // 文字颜色
                .text("绘制文字")  // 文字内容
                .rotate(-30)          // 文字旋转角度
                .position(llText);    // 文字显示位置

        //在地图上添加该文字对象并显示
        mBaiduMap.addOverlay(textOption);

4.检索地图数据

    // 地图poi检索配置
    private void poiSearchSet(){
        // 1.创建POI检索实例
        mPoiSearch = PoiSearch.newInstance();

        // 初始化建议搜索模块,注册建议搜索事件监听
        mSuggestionSearch = SuggestionSearch.newInstance();

        // 2.创建POI检索监听者;
        //获取POI检索结果

        //获取Place详情页检索结果
        poiListener = new OnGetPoiSearchResultListener() {
            @Override
            public void onGetPoiResult(PoiResult poiResult) {
                //获取POI检索结果
                Log.e("onGetPoiResult", "POI检索结果  poiResult = " + poiResult);

                List<PoiInfo> poiInfoList = poiResult.getAllPoi();
                Log.e("onGetPoiResult", "POI检索结果  poiInfoList = " + poiInfoList);
                if (poiInfoList != null && poiInfoList.size() > 0) {
                    PoiInfo poiinfo = poiInfoList.get(0);
                    Log.e("onGetPoiResult", "POI检索结果  describeContents = " + poiinfo.describeContents() +
                            "  name =  " + poiinfo.name + "  address = " + poiinfo.address + "  city =  " + poiinfo.city + "   " +
                            "  phoneNum =   " + poiinfo.phoneNum + "  postCode =  " + poiinfo.postCode + "  uid =  " + poiinfo.uid +
                            "  hasCaterDetails = " + poiinfo.hasCaterDetails + "  isPano = " + poiinfo.isPano + "  location = " + poiinfo.location +
                            "  type = " + poiinfo.type + "   ");

                    for (int i = 0; i < poiInfoList.size(); i++) {
                        PoiInfo poiInfo = (PoiInfo) poiInfoList.get(i);
                        Log.e("poiInfo ", " poiInfo  = " + poiInfo.address + "   " + poiInfo.name);
                    }
                }



                List<PoiAddrInfo> poiAddrInfoList = poiResult.getAllAddr();
                Log.e("onGetPoiResult", "POI检索结果  poiAddrInfoList = " + poiAddrInfoList);
                if (poiAddrInfoList != null && poiAddrInfoList.size() > 0) {
                    for (int i = 0; i < poiAddrInfoList.size(); i++) {
                        PoiAddrInfo poiAddrInfo = poiAddrInfoList.get(i);
                        Log.e("onGetPoiResult", "POI检索结果  location = " + poiAddrInfo.location +
                                "  name =  " + poiAddrInfo.name +
                                "  address =  " + poiAddrInfo.name );
                    }
                }
                List<CityInfo> suggestCityList = poiResult.getSuggestCityList();
                Log.e("onGetPoiResult", "POI检索结果  suggestCityList = " + suggestCityList);
                if (suggestCityList != null && suggestCityList.size() > 0) {
                    for (int i = 0; i < suggestCityList.size(); i++) {
                        CityInfo cityInfo = suggestCityList.get(i);
                        Log.e("onGetPoiResult", "POI检索结果  describeContents = " + cityInfo.describeContents() +
                                "  num =  " + cityInfo.num +
                                "  city =  " + cityInfo.city );
                    }
                }


            }

            @Override
            public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
                //获取Place详情页检索结果
                Log.e("onGetPoiDetailResult", "Place详情页检索结果  poiDetailResult = " + poiDetailResult.toString());
            }

            @Override
            public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
                Log.e("onGetPoiIndoorResult", "Indoor POI检索结果  poiIndoorResult = " + poiIndoorResult.toString());
                List<PoiIndoorInfo> poiIndoorInfoList = poiIndoorResult.getmArrayPoiInfo();
                if (poiIndoorInfoList != null && poiIndoorInfoList.size() > 0) {
                    for (int i = 0; i < poiIndoorInfoList.size(); i++) {
                        PoiIndoorInfo poiIndoorInfo = (PoiIndoorInfo) poiIndoorInfoList.get(i);
                        Log.e("onGetPoiResult", "POI检索结果  describeContents = " + poiIndoorInfo.latLng +
                                "  name =  " + poiIndoorInfo.name + "  address = " + poiIndoorInfo.address +
                                "  bid =  " + poiIndoorInfo.bid + "   " + "  uid =   " + poiIndoorInfo.uid +
                                "  cid =  " + poiIndoorInfo.cid + "  floor =  " + poiIndoorInfo.floor +
                                "  tag = " + poiIndoorInfo.tag + "  isGroup = " + poiIndoorInfo.isGroup +
                                "  discount = " + poiIndoorInfo.discount + "  groupNum = " + poiIndoorInfo.groupNum +
                                "  phone =  " + poiIndoorInfo.phone + "  floor =  " + poiIndoorInfo.floor +
                                "  isTakeOut =  " + poiIndoorInfo.isTakeOut + "  isWaited =  " + poiIndoorInfo.isWaited +
                                "  price = " + poiIndoorInfo.price + "  starLevel = " + poiIndoorInfo.starLevel );
                    }
                }
            }



        };

        OnGetSuggestionResultListener onGetSuggestionResultListener = new OnGetSuggestionResultListener() {
            @Override
            public void onGetSuggestionResult(SuggestionResult suggestionResult) {

            }
        };



        // 3.设置POI检索监听者;
        mPoiSearch.setOnGetPoiSearchResultListener(poiListener);
        mSuggestionSearch.setOnGetSuggestionResultListener(onGetSuggestionResultListener);

    }
    // 条件搜索
    private void poiConditionSearch() {
        // 4.发起检索请求;
        if (!TextUtils.isEmpty(etAtvtMainCity.getText().toString().trim()) && !TextUtils.isEmpty(etAtvtMainText.getText().toString().trim())) {
            mPoiSearch.searchInCity((new PoiCitySearchOption())
                    .city(etAtvtMainCity.getText().toString().trim())
                    .keyword(etAtvtMainText.getText().toString().trim())
                    .pageNum(10));
            /**
             * 使用建议搜索服务获取建议列表,结果在onSuggestionResult()中更新
             */
            mSuggestionSearch.requestSuggestion((new SuggestionSearchOption())
                    .keyword(etAtvtMainText.getText().toString())        // 搜索关键字
                    .city(etAtvtMainCity.getText().toString()));  // 搜索城市

        }


    }
    // 周边搜索
    private void poiAmbitusSearch() {

        // 4.发起检索请求;
        if (!TextUtils.isEmpty(etAtvtMainCity.getText().toString().trim()) && !TextUtils.isEmpty(etAtvtMainText.getText().toString().trim())) {
            LatLng center = new LatLng(34.29923570837169,  108.95409189492081);
            mPoiSearch.searchNearby(new PoiNearbySearchOption()
                    .keyword(etAtvtMainText.getText().toString().trim())
                    .sortType(PoiSortType.distance_from_near_to_far)
                    .location(center)
                    .radius(100)
                    .pageNum(10));

        }

    }
    // 矩形搜索
    private void poiRectangleSearch() {
        // 4.发起检索请求;
        LatLng southwest = new LatLng( 39.92235, 116.380338 );
        LatLng northeast = new LatLng( 39.947246, 116.414977);
        LatLngBounds searchbound = new LatLngBounds.Builder()
                .include(southwest).include(northeast)
                .build();
        mPoiSearch.searchInBound(new PoiBoundSearchOption().bound(searchbound)
                .keyword("餐厅"));

    }

5.工具
计算两点之间的直线距离(单位:米):

DistanceUtil. getDistance(p1, p2);

代码已上传至:github ,欢迎指正修改。

猜你喜欢

转载自blog.csdn.net/fu_17791654327/article/details/79674614