最近在写百度地图电子围栏加载,研究源码,也花了一些时间。
1、百度电子围栏整体思路
1)用户创造实体,赋予监控权限
2)对该实体创造电子围栏,有服务端和本地端两种方式,先创造实体,上传到的服务器中。在对实体创造电子围栏,服务器端的有多边形,圆形,本地端的只有圆形围栏。
3)查询对于该实体的电子围栏操作,从代理返回值中在地图上画出围栏。
4)检测实体运动轨迹,若超出范围,则报警。(创建实体,允许获得用户轨迹,百度后台返回的代理)
一、工程配置
按照官网提示的即可,swift要加桥接而已。
二、
0、调用百度地图服务之前,都需要设置ak mcode信息,否则调用不到
- let sop: BTKServiceOption = BTKServiceOption(ak: "ksqN5xi5s2Kpc6jlqW6Km5zk524pDhmy", mcode: "www.arvin.com.baiduMap", serviceID: 200447, keepAlive: false)
- BTKAction.sharedInstance().initInfo(sop)
ak 是在百度地图申请的,mcode是工程的Bundle id。
1、添加百度地图,因为我们用鹰眼围栏是需要在地图上画出图形来的。
_mapView = BMKMapView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height))
self.view.addSubview(_mapView!)
按照百度地图官网或者其demo即可。
2、添加百度地图的第一步是首先需要创建实体,并给实体创建电子围栏,上传给百度地图服务器
- //设置地理围栏
- func creatMapFrence() {
- //创建entity实体 entityDesc 字母数字下划线
- let request: BTKAddEntityRequest = BTKAddEntityRequest(entityName: "entityA", entityDesc: "ThissaentityA", columnKey: nil, serviceID: 00000, tag: 1)
- BTKEntityAction.sharedInstance().addEntity(with: request, delegate: self)
- p; //创建一个名称为“server_circle_fence” 的服务端圆形地理围栏,圆心坐标为东经116.3134度、北纬40.0478度,围栏半径为50米。它的监控对象为“entityA”,且当entityA这个终端实体的定位精度大于50米的轨迹点不参与此围栏的计算。
- //圆心40.055573298959558)Optional(116.30384089417596
- let center: CLLocationCoordinate2D = CLLocationCoordinate2D.init(latitude: 40.055573298959558, longitude: 116.30384089417596)
- //构造将要创建的新的围栏对象
- let fence: BTKServerCircleFence = BTKServerCircleFence(center: center, radius: 450.0, coordType: .COORDTYPE_BD09LL, denoiseAccuracy: 50, fenceName: "firstFenceName", monitoredObject: "entityA")
- //构建请求对象
- let circleRequest: BTKCreateServerFenceRequest = BTKCreateServerFenceRequest.init(serverCircleFence: fence, serviceID: 00000, tag: 1)
- //发起请求
- BTKFenceAction.sharedInstance().createServerFence(with: circleRequest, delegate: self)
-
- }
完成之后,我们需要调用创建实体是否成功的代理,判断是否创建成功
- //创建地理围栏返回代理
- func onCreateServerFence(_ response: Data!) {
- guard let array:[String: Any] = try! JSONSerialization.jsonObject(with: response, options: []) as? [String: Any] else {//转化失败就返回
- return
- }
- print("创建地理围栏\(array)")
- }
2、搜索我们可以在鹰眼代理BTKFenceDelegate 中查询我们所创建的实体
- //查询围栏
- func qureyMapFernce() {
- //构建请求对象
- let request = BTKQueryServerFenceRequest(monitoredObject: "entityA", fenceIDs: nil, outputCoordType: .COORDTYPE_BD09LL, serviceID: 000000, tag: 1)
- //发送查询请求
- BTKFenceAction.sharedInstance().queryServerFence(with: request, delegate: self)
-
- }
查询地理围栏并且在地图上画出地理围栏
- func onQueryServerFence(_ response: Data!) {
- guard let array:[String: Any] = try! JSONSerialization.jsonObject(with: response, options: []) as? [String: Any] else {//转化失败就返回
- return
- }
- print("查询地理围栏\(array)")
- let size: NSInteger = array["size"] as! NSInteger
- //在地图上展示这些围栏
- //获取size 在地理位置信息
- //使用Annotation代表圆形围栏的圆心
- let centerAnnotations: NSMutableArray = NSMutableArray(capacity: size)
- //使用填充圆行围栏的覆盖物
- let radiusOverlays: NSMutableArray = NSMutableArray(capacity: size)
- //存储所有围栏的圆心位置,是为了确定地图的显示范围
- let coordinates: NSMutableArray = NSMutableArray(capacity: size)
- let dicFence: [[String: Any]] = array["fences"] as! [[String : Any]]
-
- for fence in dicFence {
- //筛选circle的圆
- let circle: String = fence["shape"] as! String
- if circle == "circle" {
- //解析数据 经纬度
- let fenceCenter: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: fence["latitude"] as! CLLocationDegrees, longitude: fence["longitude"] as! CLLocationDegrees)
-
- let fenceRadius: Double = fence["radius"] as! Double
- let fenceName: String = fence["fence_name"] as! String
- let denoiseAccuracy: NSInteger = fence["denoise"] as! NSInteger
- let monitoredObject: String = fence["monitored_person"] as! String
-
- //存贮圆心位置 /*略有问题*/
- // let coordinateValue: NSValue = NSValue.init(bytes: &fenceCenter, objCType: "CLLocationCoordinate2D")
-
- coordinates.add(fenceCenter)
-
|
请发表评论