Android 百度地图周边雷达(v6.1.3)及覆盖物

Posted 一口仨馍

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 百度地图周边雷达(v6.1.3)及覆盖物相关的知识,希望对你有一定的参考价值。

闲聊百度地图SDK

百度地图API是为开发者免费提供的一套基于百度地图服务的应用接口,包括javascript API、Web服务API、android SDK、ios SDK、定位SDK、车联网API、LBS云等多种开发工具与服务,提供基本地图展现、搜索、定位、逆/地理编码、路线规划、LBS云存储与检索等功能,适用于PC端、移动端、服务器等多种设备,多种操作系统下的地图应用开发。百度地图已经容纳了超过500万生活服务类数据,60余家数据合作伙伴与之进行深度合作,日均定位请求超过35亿次。

很久以前接入过百度地图SDK。自v3.6.0起,版本更新大到新旧不兼容。故在此重温百度地图SDK。

  1. 注册百度账号:https://passport.baidu.com/v2/?reg&tpl=newdev&u=http://developer.baidu.com/
  2. 创建应用:http://lbsyun.baidu.com/apiconsole/key#
  3. 下载相应SDK:http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download
  4. 开发文档:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/introduction

周边雷达概述

  1. 什么是周边雷达功能?
    周边雷达功能,是面向移动端开发者的一套SDK功能接口。同步支持Android和iOS端。它的本质是一个连接百度LBS开放平台前端SDK产品和后端LBS云的中间服务。
  2. 利用周边雷达能够实现什么?
    开发者利用周边雷达功能,可以便捷的在自己的应用内,帮助用户实现查找周边跟“我”使同样一款App的人,这样一个功能。
  3. 周边雷达功能的典型使用场景
    (1)查看周边都有谁跟“我”使用同一个App,分布在哪里?
    (2)查看周边用户在听什么歌、看什么文章、有什么新动态?
    (3)查看周边有什么最新发生的新闻、资讯?

周边雷达开发介绍:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/radar

注意:一定要新建我的周边雷达,否则无法使用。http://lbsyun.baidu.com/index.php?title=radar

从一个包含基础地图的示例开始

package com.dyk.baidumapwork;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.GroundOverlayOptions;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.PolygonOptions;
import com.baidu.mapapi.map.Stroke;
import com.baidu.mapapi.map.TextOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.LatLngBounds;
import com.baidu.mapapi.radar.RadarNearbyResult;
import com.baidu.mapapi.radar.RadarNearbySearchOption;
import com.baidu.mapapi.radar.RadarSearchError;
import com.baidu.mapapi.radar.RadarSearchListener;
import com.baidu.mapapi.radar.RadarSearchManager;
import com.baidu.mapapi.radar.RadarUploadInfo;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity implements View.OnClickListener,RadarSearchListener 

    private static final String TAG = "MainActivity";

    private MapView mMapView;
    private BaiduMap mBaiduMap;

    private Marker markerA;
    private RadarSearchManager mManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        //在使用SDK各组件之前初始化context信息,传入ApplicationContext
        //注意该方法要再setContentView方法之前实现
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        // 初始化周边雷达
        mManager = RadarSearchManager.getInstance();
        initView();
        initClick();
//        testOverlay();
//        testGeometryOverlay();
//        testTextOverlay();
//        testGroundOverlay();

        // 将底图标注设置为隐藏,方法如下:
        // mBaiduMap.showMapPoi(false);

    

    private void initView() 
        mMapView = (MapView) findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();
    

    private void initClick() 
        findViewById(R.id.map_common).setOnClickListener(this);
        findViewById(R.id.map_satelite).setOnClickListener(this);
        findViewById(R.id.map_blank).setOnClickListener(this);
        findViewById(R.id.map_traffic).setOnClickListener(this);
        findViewById(R.id.map_heat).setOnClickListener(this);
        findViewById(R.id.map_radar).setOnClickListener(this);
    

    /** 覆盖物 */
    private void testOverlay() 
        LatLng point = new LatLng(39.963175, 116.400244);
        // 通过marker的icons设置一组图片,再通过period设置多少帧刷新一次图片资源
        ArrayList<BitmapDescriptor> bitmapList = new ArrayList<BitmapDescriptor>();
        BitmapDescriptor bitmapA = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
        BitmapDescriptor bitmapB = BitmapDescriptorFactory.fromResource(R.drawable.icon_markb);
        BitmapDescriptor bitmapC = BitmapDescriptorFactory.fromResource(R.drawable.icon_markc);
        BitmapDescriptor bitmapD = BitmapDescriptorFactory.fromResource(R.drawable.icon_markd);
        BitmapDescriptor bitmapE = BitmapDescriptorFactory.fromResource(R.drawable.icon_marke);
        bitmapList.add(bitmapA);
        bitmapList.add(bitmapB);
        bitmapList.add(bitmapC);
        bitmapList.add(bitmapD);
        bitmapList.add(bitmapE);

        OverlayOptions options = new MarkerOptions()
                .position(point) //位置
                .icons(bitmapList) // 图标
                .period(10) // 刷新帧数
                .zIndex(9)// 显示层级
                .alpha(0.5f) //透明度
                .draggable(true);// 支持拖拽
        markerA = (Marker) (mBaiduMap.addOverlay(options));// 在地图上添加marker并显示

               // 点击marker
        mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() 
            @Override
            public boolean onMarkerClick(Marker marker) 
                marker.remove();
                return true;
            
        );
    

    /** 几何覆盖物 */
    private void testGeometryOverlay() 
        //定义多边形的五个顶点
        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);
    

    /** 文字覆盖物 */
    private void testTextOverlay() 
        LatLng text = new LatLng(39.86923, 116.397428);
        OverlayOptions options = new TextOptions()
                .bgColor(0xAAFFFF00)
                .fontSize(24)
                .fontColor(0xFFFF00FF)
                .text("文字覆盖物测试")
                .rotate(-45) // 旋转角度
                .position(text);

        mBaiduMap.addOverlay(options);
    

    /** 地形图图层(GroundOverlay),又可叫做图片图层 */
    private void testGroundOverlay() 
        //定义Ground的显示地理范围
        LatLng southwest = new LatLng(39.92235, 116.380338);
        LatLng northeast = new LatLng(39.947246, 116.414977);
        LatLngBounds bounds = new LatLngBounds.Builder()
                .include(northeast)
                .include(southwest)
                .build();
        //定义Ground显示的图片
        BitmapDescriptor bdGround = BitmapDescriptorFactory
                .fromResource(R.drawable.ground_overlay);
        //定义Ground覆盖物选项
        OverlayOptions ooGround = new GroundOverlayOptions()
                .positionFromBounds(bounds)
                .image(bdGround)
                .transparency(0.8f);// 透明度

        //在地图中添加Ground覆盖物
        mBaiduMap.addOverlay(ooGround);
    

    /** 周边雷达信息上传 */
    private void testRadarInfoUpload() 

        // 周边雷达设置监听
        mManager.addNearbyInfoListener(this);
        //周边雷达设置用户身份标识,id为空默认是设备标识
        mManager.setUserID("123");
        //上传位置
        RadarUploadInfo info = new RadarUploadInfo();
        LatLng pt = new LatLng(39.963175, 116.400244);
        info.comments = "备注";
        info.pt = pt;
        mManager.uploadInfoRequest(info);
    

    /** 雷达周边位置检索 */
    private void testRadarLocationSearch() 
        // 自己的位置
        LatLng pt = new LatLng(39.963175, 116.400244);
        RadarNearbySearchOption option = new RadarNearbySearchOption()
                .centerPt(pt)
                .pageNum(0)
                .radius(2*1000);
        // 发起查询请求
        mManager.nearbyInfoRequest(option);
    

    @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 onDestroy() 
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        mMapView.onDestroy();

        //移除监听
        mManager.removeNearbyInfoListener(this);
        //清除用户信息
//        mManager.clearUserInfo();
        //释放资源
        mManager.destroy();
        mManager = null;
    

    @Override
    public void onClick(View v) 
        switch (v.getId()) 
            // 普通地图
            case R.id.map_common:
                mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
                break;
            // 卫星地图
            case R.id.map_satelite:
                mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
                break;
            // 空白地图
            case R.id.map_blank:
                mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);
                break;
            // 交通图
            case R.id.map_traffic:
                if (mBaiduMap.isTrafficEnabled()) 
                    mBaiduMap.setTrafficEnabled(false);
                 else 
                    mBaiduMap.setTrafficEnabled(true);
                
                break;
            // 热力图
            case R.id.map_heat:
                if (mBaiduMap.isBaiduHeatMapEnabled()) 
                    mBaiduMap.setBaiduHeatMapEnabled(false);
                 else 
                    mBaiduMap.setBaiduHeatMapEnabled(true);
                
                break;
            // 周边检索
            case R.id.map_radar:
                testRadarInfoUpload();
                testRadarLocationSearch();
                break;
        
    

    @Override
    public void onGetNearbyInfoList(RadarNearbyResult radarNearbyResult, RadarSearchError radarSearchError) 
        if (radarSearchError == RadarSearchError.RADAR_NO_ERROR) 
            Toast.makeText(MainActivity.this, "查询周边成功", Toast.LENGTH_LONG).show();
            Log.i(TAG,radarNearbyResult.infoList.get(0).userID+"\\n"+
                      radarNearbyResult.infoList.get(0).distance+"\\n"+
                      radarNearbyResult.infoList.get(0).pt+"\\n"+
                      radarNearbyResult.infoList.get(0).timeStamp);
         else 
            Toast.makeText(MainActivity.this, "查询周边失败", Toast.LENGTH_LONG).show();
            Log.i(TAG,"查询错误:"+radarSearchError.toString());
        
    

    @Override
    public void onGetUploadState(RadarSearchError radarSearchError) 
        if (radarSearchError == RadarSearchError.RADAR_NO_ERROR) 
            //上传成功
            Toast.makeText(MainActivity.this, "单次上传位置成功", Toast.LENGTH_LONG).show();
         else 
            //上传失败
            Toast.makeText(MainActivity.this, "单次上传位置失败", Toast.LENGTH_LONG).show();
            Log.i(TAG,"上传错误:"+radarSearchError.toString());
        
    

    @Override
    public void onGetClearInfoState(RadarSearchError radarSearchError) 
        if (radarSearchError == RadarSearchError.RADAR_NO_ERROR) 
            //清除成功
            Toast.makeText(MainActivity.this, "清除位置成功", Toast.LENGTH_LONG).show();
         else 
            //清除失败
            Toast.makeText(MainActivity.this, "清除位置失败", Toast.LENGTH_LONG).show();
        
    

这是一段运行成功的代码,可作为实际开发的参考。

注意:
1.必须要新建我的雷达
2.pageNum从0开始
3.软件要模仿两个用户分别运行一次,对应的操作为:跑一遍程序之后修改userId后在跑一遍。这样才能看见“附近的人”。
4.在合适的时机调用RadarSearchManager#clearUserInfo(),别不小心把自己测试数据给clear了,否则肯定没有数据的啦!

欢迎访问我的博客及另外两篇关于百度地图SDK的博文,综合使用可以实现更多效果:

  1. 我的博客

  2. Android 百度定位SDK(v6.1.3)结合方向传感器

  3. Android 百度鹰眼轨迹SDK(v2.1.6)

Demo全部代码及资源下载:http://download.csdn.net/detail/qq_17250009/9469613

以上是关于Android 百度地图周边雷达(v6.1.3)及覆盖物的主要内容,如果未能解决你的问题,请参考以下文章

Android 百度鹰眼轨迹SDK(v2.1.6)

Android 百度鹰眼轨迹SDK(v2.1.6)

Android studio 百度地图开发查询周边服务(加油站)

Android POI 百度地图——周边检索

百度地图实现普通地图定位周边搜索功能

什么是百度地图android sdk