Swift - 集成百度地图的周边雷达功能

一、周边雷达功能介绍

1,什么是周边雷达

(1)周边雷达功能,是面向移动端开发者的一套 SDK 功能接口(同步支持 Android 和 iOS 端)。
(2)周边雷达本质是一个连接百度 LBS 开放平台前端 SDK 产品和后端 LBS 云的中间服务。

2,使用场景

利用周边雷达功能,我们可以便捷的在自己的应用内,帮助用户实现查找周边跟“我”使用同一款 App 的人。比如:
(1)查看周边都有谁跟“我”使用同一个 App,分布在哪里?
(2)查看周边用户在听什么歌、看什么文章、有什么新动态?
(3)查看周边有什么最新发生的新闻、资讯?

二、准备工作

1,申请API Key
首先我们要到百度地图开放平台上申请个 API Key,供我们程序使用。具体参考我前面一篇文章:Swift - 百度地图SDK的配置和使用(附样例)

2,注册周边雷达
要使用周边雷达功能,我们光申请个 API Key 还不够。还需要对这个Key做相应的注册操作。
注册周边雷达是使用其相应功能的基础前提。通过注册可实现一个或多个应用之间的关系绑定,实现相互之间的位置信息查看。

3,集成SDK

周边雷达是百度地图SDK产品的一个功能模块。我们除了要将百度地图SDK的基础包集成进来外,还要集成周边雷达相关库(BaiduMapAPI_Radar.framework)。具体集成方式同样参考前文。

同时桥接头文件中也要将雷达库文件 import 进来。

#import <BaiduMapAPI_Base/BMKBaseComponent.h> //引入base相关所有的头文件
#import <BaiduMapAPI_Map/BMKMapComponent.h> //引入地图功能所有的头文件
#import <BaiduMapAPI_Map/BMKMapView.h> //只引入所需的单个头文件X
#import <BaiduMapAPI_Radar/BMKRadarComponent.h> //引入周边雷达功能所有的头文件
/****** 下面的几个暂时不需要 ******/
//#import <BaiduMapAPI_Search/BMKSearchComponent.h> //引入检索功能所有的头文件
//#import <BaiduMapAPI_Cloud/BMKCloudSearchComponent.h> //引入云检索功能所有的头文件
//#import <BaiduMapAPI_Location/BMKLocationComponent.h> //引入定位功能所有的头文件
//#import <BaiduMapAPI_Utils/BMKUtilsComponent.h> //引入计算工具所有的头文件

三、样例介绍

下面通过“附近的人”这个小样例演示周边雷达的使用。
(1)程序启动后,应用会自动定时上传用户位置信息(每隔5秒)
(2)上传位置的时候我们同时还附带上传用户名(随机生成的)
(3)主界面有个“附近的人”列表,显示500米范围内其他的用户,以及离你的距离(列表也是5秒钟刷新一次)。
(4)只用一台手机不太好看出效果。拿两台或以上数量的手机测试的话,就可以看到其他人信息,以及他们离你的距离。比如我这里用3部手机测试,其中1部手机的运行效果如下:

四、样例代码

1,info.plist
由于我们要使用 CoreLocation 获取实时位置数据,所以在 info.plist 里加入定位描述(Value 值为空也可以):
NSLocationWhenInUseDescription :允许在前台获取GPS的描述
NSLocationAlwaysUsageDescription :允许在后台获取GPS的描述

2,AppDelegate.swift

在这里使用我们之前申请的授权 Key,来对 BMKMapManager 进行声明和初始化。

import UIKit
 
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, BMKGeneralDelegate {
 
    var window: UIWindow?
    
    var _mapManager: BMKMapManager?
 
    func application(application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
        _mapManager = BMKMapManager()
        // 如果要关注网络及授权验证事件,请设定generalDelegate参数
        let ret = _mapManager?.start("mRYTrHzAZUlT5Aojf5tMSxxxxxxxxxxx",
                                     generalDelegate: self)
        if ret == false {
            NSLog("manager start failed!")
        }
        return true
    }
    //...............

3,ViewController.swift

位置信息上传、周边位置检索并显示等功能都在这里实现。这里要注意的是在上传和获取位置信息前,我们需要设置 userid。
如果我们不设置的话,这个也会自动生成的。自动生成的userid 是唯一的,且与当前设备有关。也就是说对于同一个设备每次启动程序后,生成的 userid 都是一样的。(所以多次关闭启动程序不会造成不断新增新用户的问题)

import UIKit
import CoreLocation
 
class ViewController: UIViewController, CLLocationManagerDelegate, BMKRadarManagerDelegate,
        UITableViewDelegate, UITableViewDataSource {
    
    //定位管理器
    let locationManager:CLLocationManager = CLLocationManager()
    
    //当前位置坐标
    var currCoordinate:CLLocationCoordinate2D?
 
    //周边雷达管理类
    var _radarManager:BMKRadarManager?
    
    //定时器,用于定时请求周边信息数据
    var timer:NSTimer!
    
    //周边用户集合
    var infoList:[BMKRadarNearbyInfo] = [BMKRadarNearbyInfo]()
    
    //显示周边用户的表格
    var tableView:UITableView?
    
    //当前用户名称
    var userName:String!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        //随机生成一个用户名
        userName = "陌生人\(String(format: "%03i", Int(arc4random()%1000)))"
        self.title = "\(userName),你好!下面是你周围的人。"
        
        //设置定位服务管理器代理
        locationManager.delegate = self
        //设置定位进度
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        //更新距离
        locationManager.distanceFilter = 100
        ////发送授权申请
        locationManager.requestAlwaysAuthorization()
        if (CLLocationManager.locationServicesEnabled()){
            //允许使用定位服务的话,开启定位服务更新
            locationManager.startUpdatingLocation()
            print("定位开始")
        }
 
        //获取周边雷达管理类实例
        _radarManager =  BMKRadarManager.getRadarManagerInstance()
        //在上传和拉取位置信息前,需要设置userid,否则会自动生成
        //_radarManager?.userId = "u007"
        //通过添加radar delegate获取自动上传时的位置信息,以及获得雷达操作结果
        _radarManager?.addRadarManagerDelegate(self)
        
        //位置信息连续自动上传(每隔5秒上传一次)
        _radarManager?.startAutoUpload(5)
        //启用计时器,控制每5秒执行一次requestNearbyData方法,请求周边信息
        timer = NSTimer.scheduledTimerWithTimeInterval(5,
                        target:self,selector:#selector(ViewController.requestNearbyData),
                        userInfo:nil,repeats:true)
        
        //创建表视图
        self.tableView = UITableView(frame: self.view.frame, style:UITableViewStyle.Plain)
        self.tableView!.delegate = self
        self.tableView!.dataSource = self
        //创建一个重用的单元格
        self.tableView!.registerClass(UITableViewCell.self,
                                      forCellReuseIdentifier: "SwiftCell")
        self.view.addSubview(self.tableView!)
    }
    
    //定位改变执行,可以得到新位置、旧位置
    func locationManager(manager: CLLocationManager,
                         didUpdateLocations locations: [CLLocation]) {
        //获取最新的坐标
        currCoordinate = locations.last!.coordinate
    }
    
    //获取我的位置信息(自动上传调用)
    func getRadarAutoUploadInfo() -> BMKRadarUploadInfo! {
        if let pt = currCoordinate{
            let myinfo = BMKRadarUploadInfo()
            myinfo.extInfo = userName
            //myinfo.pt = CLLocationCoordinate2DMake(39.916, 116.404)
            myinfo.pt = pt
            return myinfo
        }else{
            return nil
        }
    }
    
    //返回雷达 上传结果
    func onGetRadarUploadResult(error: BMKRadarErrorCode) {
        if error == BMK_RADAR_NO_ERROR {
            print("位置上传成功")
        }else{
            print("位置上传失败")
        }
    }
    
    //发起检索请求,获取周边信息
    func requestNearbyData() {
        if let centerPt = currCoordinate {
            let option =  BMKRadarNearbySearchOption()
            option.radius = 500 //检索半径
            option.sortType = BMK_RADAR_SORT_TYPE_DISTANCE_FROM_NEAR_TO_FAR //排序方式
            option.centerPt = centerPt //检索中心点
            //发起检索
            
            let res = _radarManager?.getRadarNearbySearchRequest(option)
            if res! {
                print("周边信息获取成功")
            } else {
                print("周边信息获取失败")
            }
        }
    }
    
    //获取到周边位置信息回调
    func onGetRadarNearbySearchResult(result: BMKRadarNearbyResult!, error: BMKRadarErrorCode) {
        if error == BMK_RADAR_NO_ERROR {
            print("周边用户数量:",result.totalNum)
            self.infoList = result.infoList as! [BMKRadarNearbyInfo]
            self.tableView?.reloadData()
        }
    }
    
    //在本例中,只有一个分区
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1;
    }
    
    //返回表格行数(也就是返回控件数)
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.infoList.count
    }
    
    //创建各单元显示内容(创建参数indexPath指定的单元)
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)
        -> UITableViewCell {
        let cell =  UITableViewCell(style: UITableViewCellStyle.Value1,
                        reuseIdentifier: "SwiftCell")
        cell.textLabel?.text = self.infoList[indexPath.row].extInfo
        cell.detailTextLabel?.text = "\(self.infoList[indexPath.row].distance)m"
        return cell
    }
 
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

 

时间: 2024-09-19 16:47:56

Swift - 集成百度地图的周边雷达功能的相关文章

控件- 百度地图怎么实现截图功能?

问题描述 百度地图怎么实现截图功能? 做web项目的时候,需求要求在引入的百度地图上加个类似百度官方地图的截图控件,但是在百度API上没有找到地图截图控件,哪个大神有这方面的案例或者提个建议! 解决方案 可以百度查一下js截屏 解决方案二: 百度地图覆盖物功能

Android集成百度地图开发流程和注意事项

前言 最近公司要把百度地图集成的项目中,于是我就研究了一天百度地图的SDK,当前的版本:Android SDK v3.0.0 . 虽然百度地图网上相关代码比较多,大多可能都是比较旧的版本,且百度地图API的改动感觉也比较大,所以再此跟大家分享一下实现的流程的和注意事项 一.申请密钥 重难点:获取Android签名证书的sha1值 方法一.使用keytool 进入命令提示符 获取debug的sha1值: 定位到.android文件夹下,输入keytool -list -v -keystore de

利用WeX5集成百度地图

最近做一个地图类的app 经过几天的摸索,终于完成百度地图集成的界面 先看效果: 1.加载完成之后,页面加载制定位置的地图 2.顶部能够输入地图的关键字,地图显示符合条件的下拉列表 3.用户选择了相应的选项后,地图会移动到对应的地图范围,同时标题栏显示对应位置信息 4.当用户点击地图其他位置时,标识点移动到对应位置,标题栏的位置信息相应改变 5.当用户点击确认按钮时,用alert将当前标识点的地理信息alert出来 只需要把对应的代码片段复制到WeX5工具(开源免费的一个app开发工具)中相应的

Android实现带列表的地图POI周边搜索功能_Android

先看效果图:(以公司附近的国贸为中心点) 上面是地图,下面是地理位置列表,有的只有地理位置列表(QQ动态的位置),这是个很常见的功能.它有个专门的叫法:POI周边搜索. 实现: 这个效果实现起来其实很简单,不过需要你先阅读下地图的API,这里使用的是高德地图的Android SDK,SDK的配置这里不作讲解,文末会放一些链接供学习. 思路: 1.利用地图的定位功能,获取用户当前的位置 2.根据获得的位置信息调用POI搜索,获取位置列表 3.ListView展示位置列表 4.用户拖动地图,获取地图

ecshop加入百度地图,支持周边标记实例

ecshop加入百度地图接口,首先在你要调用的页面加入下面这段话(样式可以自己调),传入默认的值,分别是经度.纬度.关键字(可以标记地图范围内与你关键字有关的地点).  代码如下 复制代码 <ul>  <li onclick="reload_map({$room.longitude},{$room.latitude},'公交站')" class="current">公交</li>  <li onclick="rel

Android实现带列表的地图POI周边搜索功能

先看效果图:(以公司附近的国贸为中心点) 上面是地图,下面是地理位置列表,有的只有地理位置列表(QQ动态的位置),这是个很常见的功能.它有个专门的叫法:POI周边搜索. 实现: 这个效果实现起来其实很简单,不过需要你先阅读下地图的API,这里使用的是高德地图的Android SDK,SDK的配置这里不作讲解,文末会放一些链接供学习. 思路: 1.利用地图的定位功能,获取用户当前的位置 2.根据获得的位置信息调用POI搜索,获取位置列表 3.ListView展示位置列表 4.用户拖动地图,获取地图

thinkphp 集成百度地图获取经纬度的实例

最近一个项目用到了经纬度,根据经纬度在地图上显示相应的位置 后台实现代码: html代码:  代码如下 复制代码 <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script> <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=0A41212

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

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

Swift - 百度地图SDK的配置和使用

一.申请API Key 首先我们要到百度地图开放平台上申请个 API Key,供我们程序使用.地址:http://lbsyun.baidu.com/ 二.项目配置 1,修改Info.plist 由于 iOS9 改用更安全的 https,为了能够在 iOS9 中正常使用地图 SDK.需要在"Info.plist"中添加如下配置: <key>NSAppTransportSecurity</key> <dict>     <key>NSAllo