{"version":"0.1.0","code":"0000","result":true,"message":"处理成功","errdetail":"","timestamp":1671508973294,"data":{"id":71713562,"title":"14.地理围栏服务","slug":"sgwg9r","format":"lake","bookId":26046811,"body":null,"body_draft":null,"body_html":"
/**\n* @file bl_geo_fence_define_dto.h\n* @brief 地理围栏服务枚举量以及数据结构定义头文件\n* @details 明确地理围栏服务对外透出的枚举量以及数据结构\n* @version 1.0\n* @author qingcheng.yqc\n* @date 2020-06-30\n* @copyright (C) Copyright 2020-2021, AutoNavi Software Co., Ltd.\n*/\n#ifndef __BL_GEO_FENCE_DEFINE_DTO_H__\n#define __BL_GEO_FENCE_DEFINE_DTO_H__\n#include "common/dice_types.h"\n#include "common/dice_coord_3d.h"\n#include "common/dice_hash_map.h"\n#include "utils/bl_util_define.h"\n#include "bl_map_view.h"\n\nBEGIN_SPACE_BL\n\n/**\n* @brief 车辆电源状态定义\n*/\nenum VehiclePowerState\n{\n VehiclePowerStateUnknow = 0, /**< 未知 */\n VehiclePowerStateOn, /**< 车辆启动 */\n VehiclePowerStateOff, /**< 车辆熄火 */\n VehiclePowerStateStandby, /**< 车辆待机 */\n};\n\n/**\n* @brief 围栏类型定义\n*/\nenum GeoFenceType\n{\n GeoFenceTypeUnknow = 0, /**< 未知 */\n GeoFenceTypeCircle, /**< 圆形围栏 */\n GeoFenceTypePolygon, /**< 多边形围栏 */\n GeoFenceTypeLine, /**< 线型围栏 */\n};\n\n/**\n * @brief 特殊围栏类型定义\n */\nenum GeoFenceSpecialType\n{\n GeoFenceSpecialTypeUnknow = 0, /**< 未知 */\n GeoFenceSpecialTypeHome, /**< 家 */\n GeoFenceSpecialTypeCompany, /**< 公司 */\n GeoFenceSpecialTypeFrequentLoc, /**< 常去地点 */\n};\n\n/**\n* @brief 围栏生产方式\n*/\nenum GeoFenceGenMode\n{\n GeoFenceGenModeUnknow = 0, /**< 未知 */\n GeoFenceGenModeManualDraw, /**< 围栏web编辑平台手绘 */\n GeoFenceGenModeImportPoints, /**< 围栏web编辑平台导入点列表 */\n GeoFenceGenModeSpecilSetPoint, /**< 围栏web编辑平台特定点设定 */\n};\n\n/**\n* @brief 围栏形状特征\n*/\nenum GeoFenceShapeFeature\n{\n GeoFenceShapeFeatureUnknow = 0, /**< 未知 */\n GeoFenceShapeFeatureRegular, /**< 规则 */\n GeoFenceShapeFeatureUnRegular, /**< 不规则 */\n};\n\n/**\n* @brief 围栏感知状态定义\n*/\nenum GeoFencePerceptStatus\n{\n GeoFencePerceptStatusUnknow = 0, /**< 未知 */\n GeoFencePerceptStatusOutside, /**< 在围栏外 */\n GeoFencePerceptStatusEnter, /**< 进入围栏 */\n GeoFencePerceptStatusInside, /**< 在围栏内 */\n GeoFencePerceptStatusExit, /**< 出围栏 */\n GeoFencePerceptStatusCross, /**< 穿过围栏 */\n};\n\nclass BL_EXPORT VehicleCondition\n{\npublic:\n VehicleCondition();\n \n float fSpeed; /**<车机真实速度*/\n float fCharge; /**<当前电量*/\n float fFuel; /**<当前油量*/\n bool bLight; /**<车灯信号*/\n VehiclePowerState ePowerState; /**<电源状态*/\n dice::String16 strExData; /**<扩展数据,JSON格式*/\n};\n\nclass BL_EXPORT RegualCondition\n{\npublic:\n RegualCondition();\n VehicleCondition vehicleCondition;\n};\n\n/**\n * @brief 围栏生效时间\n */\nclass BL_EXPORT GeoFenceValidTime\n{\npublic:\n GeoFenceValidTime();\n dice::String16 mStrStartdateTime; /**< 生效起始时间 */\n dice::String16 mStrEnddateTime; /**< 生效终止时间 */\n};\n\n/**\n * @brief 围栏规则动作\n */\nclass BL_EXPORT GeoFenceDetectAction\n{\npublic:\n GeoFenceDetectAction();\n \n bool bEnter; /**< 进入围栏*/\n bool bInside; /**< 在围栏内部*/\n bool bExit; /**< 出围栏*/\n bool bOutside; /**< 在围栏外部*/\n bool bCross; /**< 穿过围栏*/\n uint32_t nDuration; /**< 停留时长,单位:分钟 */\n};\n\n/**\n * @brief 围栏规则响应动作\n */\nclass BL_EXPORT GeoFenceResponeAction\n{\npublic:\n GeoFenceResponeAction();\n \n dice::String16 responeName; /**< 围栏规则条件 */\n dice::String16 responeType; /**< 围栏规则响应类型 */\n dice::String16 strContent; /**< 围栏规则响应内容 */\n};\n\n/**\n * @brief 围栏服务初始化参数\n */\nclass BL_EXPORT GeoFenceInitParam\n{\npublic:\n GeoFenceInitParam();\n \npublic:\n dice::String16 strChannelID; /**< 猛犸渠道号,请求围栏数据必填参数 */\n dice::String16 strDbPath; /**< 围栏数据库存储路径 */\n};\n\n/**\n* @brief 围栏规则\n*/\nclass BL_EXPORT GeoFenceRegual\n{\npublic:\n GeoFenceRegual();\n\npublic:\n dice::String8 strGeoFenceGID; /**< 围栏组唯一ID */\n dice::String16 strGeoFenceGName; /**< 围栏组名称 */\n int64_t geoFenceUpdateTime; /**< 围栏组更新时间 */\n dice::vector<GeoFenceValidTime> validTime; /**< 围栏生效时间 */\n dice::String16 mStrCondition; /**< 围栏规则条件 */\n GeoFenceDetectAction detectAction; /**< 围栏规则检测动作 */\n dice::vector<GeoFenceResponeAction> responeAction; /**< 围栏规则响应动作 */\n};\n\n/**\n* @brief 围栏信息基类\n*/\nclass BL_EXPORT GeoFenceRegionBase\n{\npublic:\n GeoFenceRegionBase();\n\n virtual ~GeoFenceRegionBase();\n\npublic:\n dice::String8 strGeoFenceID; /**< 围栏唯一ID */\n dice::String16 strGeoFencName; /**< 围栏名称 */\n dice::vector<dice::String8> vecGids; /**< 围栏组列表 */\n bool bEnable; /**< 是否启用 false 禁用 true 启用 */\n GeoFencePerceptStatus geoFenceStatus; /**< 围栏感知状态 */\n GeoFenceType type; /**< 围栏类型 */\n dice::String16 strUserAccount; /**< 围栏用户账号 */\n int64_t updateTime; /**< 更新时间 */\n dice::Coord3D<double> rectangleMin; /**< 外接矩形左下点坐标 */\n dice::Coord3D<double> rectangleMax; /**< 外接矩形右上点坐标 */\n dice::Coord3D<double> rectangleCenter; /**< 外接矩形中心点坐标 */\n};\n\n/**\n* @brief 圆形围栏\n*/\nclass BL_EXPORT GeoFenceCircleRegion : public GeoFenceRegionBase\n{\npublic:\n GeoFenceCircleRegion();\n virtual ~GeoFenceCircleRegion();\n\npublic:\n uint32_t radius; /**< 半径,单位:米 */\n dice::Coord3D<double> centerPt; /**< 中心点经纬度 */\n};\n\n/**\n* @brief 多边型围栏\n*/\nclass BL_EXPORT GeoFencePolygonRegion : public GeoFenceRegionBase\n{\npublic:\n GeoFencePolygonRegion();\n virtual ~GeoFencePolygonRegion();\n\npublic:\n dice::vector<dice::Coord3D<double> > coordliates; /**< 经纬度坐标点列表 */\n};\n\n/**\n* @brief 线型围栏\n*/\nclass BL_EXPORT GeoFenceLineRegion : public GeoFenceRegionBase\n{\npublic:\n GeoFenceLineRegion();\n virtual ~GeoFenceLineRegion();\n\npublic:\n dice::vector<dice::Coord3D<double> > coordliates; /**< 经纬度坐标点列表 */\n};\n\n/**\n* @brief 围栏信息\n*/\nclass BL_EXPORT GeoFenceRegion\n{\npublic:\n GeoFenceRegion();\n \n GeoFenceRegual regual; /**< 围栏规则 */\n GeoFenceRegionBase* geoFenceRegion; /**< 当前命中围栏数据 */\n};\n\n/**\n* @brief 围栏绘制样式控制\n*/\nclass BL_EXPORT GeoFenceDrawConfig\n{\npublic:\n GeoFenceDrawConfig();\n \n int32_t levelMax; //显示最大比例尺\n int32_t levelWhole; //全量显示比例尺比例尺\n int32_t limitedNumber;// 小于 levelMax && 大于 levelWhole 比例尺的最大围栏显示数量,建议小于10个\n int32_t cacheAdcodeNumber;//默认3个。缓存的adcode数量,无离线数据状态下adcode最小单位是城市,有离线数据情况下最小单位是区域(城镇)\n dice::vector<dice::String8> visibleGroups; //默认为空。在设置的情况下只会显示对应围栏组的围栏数据\n};\n\nEND_SPACE_BL\n\n#endif /**< __BL_GEO_FENCE_DEFINE_DTO_H__ */
/**\n* @file bl_geo_fence_regual_condition.h\n* @brief 围栏规则条件数据适配接口定义\n* @version 1.0\n* @author qingcheng.yqc\n* @date 2020-6-30\n* @copyright (C) Copyright 2020-2021, AutoNavi Software Co., Ltd.\n*/\n\n#ifndef __BL_GEO_FENCE_REGUAL_CONDITION_H__\n#define __BL_GEO_FENCE_REGUAL_CONDITION_H__\n\n#include "utils/bl_util_errorcode.h"\n#include "bl_geo_fence_define_dto.h"\n\nBEGIN_SPACE_BL\n\n/**\n* @brief 围栏规则条件数据适配接口\n*/\nclass BL_EXPORT IGeoFenceRegualCondition\n{\npublic:\n virtual ~IGeoFenceRegualCondition() {}\n /**\n * @brief 围栏规则条件数据获取\n * @details 此接口用来从车机系统获取车机真实速度等相关车身状态数据以及其它规则条件数据\n * @param[out] condition 围栏规则条件数据包含车身状态、用户行为等\n * @return bool,true : 成功 false : 失败\n * @note thread:main\n */\n virtual bool GetRegualCondition(RegualCondition& condition) = 0;\n};\nEND_SPACE_BL\n\n#endif /**< __BL_GEO_FENCE_VEHICLE_CONDITION_H__ */
GetRegualCondition:主要用来实时获取车身数据,方便用于围栏进行规则匹配,需要外部实现,并且通过围栏服务接口SetGeoFenceRegualCondition传入。
/**\n* @brief 围栏感知结果观察者回调接口\n*/\nclass BL_EXPORT IGeoFencePerceptObserver\n{\npublic:\n virtual ~IGeoFencePerceptObserver() {}\n\n /**\n * @brief 围栏位置感知结果通知\n * @details 此接口通知HMI围栏位置感知结果\n * @param[in] strGeoFenceID 围栏唯一ID\n * @param[in] geoFenceRegion 围栏以及策略规则信息\n * @return void\n * @note thread:main\n */\n virtual void OnGeoFencePerceptNotify(const dice::String8& strGeoFenceID, const GeoFenceRegion& geoFenceRegion) = 0;\n \n /**\n * @brief 围栏策略规则生效与否通知\n * @details 此接口通知HMI围栏策略规则感知结果\n * @param[in] strGeoFenceID 围栏唯一ID\n * @param[in] bValid true为在生效时间内,false为不在生效时间内\n * @param[in] geoFenceRegion 围栏以及策略规则信息\n * @return void\n * @note thread:main\n */\n virtual void OnGeoFenceValidPerceptNotify(const dice::String8& strGeoFenceID, bool bValid, const GeoFenceRegion& geoFenceRegion) = 0;\n\n /**\n * @brief 围栏策略规则感知结果通知\n * @details 此接口通知HMI围栏策略规则感知结果\n * @param[in] strGeoFenceID 围栏唯一ID\n * @param[in] bMatch 规则匹配结果,true为匹配,false为不匹配\n * @param[in] geoFenceRegion 围栏以及策略规则信息\n * @return void\n * @note thread:main\n */\n virtual void OnGeoFenceRegualPerceptNotify(const dice::String8& strGeoFenceID, bool bMatch, const GeoFenceRegion& geoFenceRegion) = 0;\n};\n\nEND_SPACE_BL\n\n#endif /**< __BL_GEO_FENCE_PERCEPT_OBSERVER_H__ */
该观察者需要外部进行实现,并通过围栏服务接口AddObserver传入,详细如下:
/**\n* @file bl_geo_fence_service.h\n* @brief 地理围栏服务对外接口定义\n* @version 1.0\n* @author qingcheng.yqc\n* @date 2020-6-30\n* @copyright (C) Copyright 2020-2021, AutoNavi Software Co., Ltd.\n*/\n\n#ifndef __BL_GEO_FENCE_SERVICE_H__\n#define __BL_GEO_FENCE_SERVICE_H__\n\n#include "servicebase/bl_service.h"\n#include "bl_geo_fence_percept_observer.h"\n#include "bl_geo_fence_regual_condition.h"\n#include "layer/bl_prepare_layer_style.h"\n#include "bl_geo_fence_define_dto.h"\n\nBEGIN_SPACE_BL\n\n/**\n* @brief 路线服务\n*/\nclass BL_EXPORT IGeoFenceService : public IService\n{\npublic:\n virtual ~IGeoFenceService();\n /**\n * @brief 地理围栏服务初始化\n * @details 此接口用来初始化地理围栏服务,更新围栏信息\n * @param[in] strChannelID 渠道号,与web端围栏账号一致\n * @param[in] strDbPath 数据库存放路径\n * @return ErrorCode 返回错误码\n * - GBL_ERR_OK 成功 其他 失败\n * @note thread:main\n */\n virtual ErrorCode Init(const GeoFenceInitParam& param) = 0;\n\n /**\n * @brief 地理围栏服务反初始化\n * @details 此接口用来反初始化地理围栏\n * @note thread:main\n */\n virtual void UnInit() = 0;\n\n /**\n * @brief 获取当前初始化状态\n * @return 当前的初始化状态\n * @note thread:multi\n */\n virtual ServiceInitStatus IsInit() = 0;\n\n /**\n * @brief 获取版本号\n * @details 此接口用来获取BL地理围栏后台服务版本号\n * @return const dice::String16 版本号\n * @note thread:multi\n */\n virtual const dice::String16 GetVersion() = 0;\n\n /**\n * @brief 设置围栏规则条件数据适配接口\n * @param[in] pCondition 围栏规则条件数据适配接口\n * @return void\n * @note thread:multi\n */\n virtual void SetGeoFenceRegualCondition(IGeoFenceRegualCondition* pCondition) = 0;\n\n /**\n * @brief 围栏渲染功能开关\n * @param[in] pView 主图句柄,目前只支持单实例\n * @param[in] bOpen 开关\n * @return void\n * @note thread:multi\n */\n virtual void OpenGeoFenceLayer(IMapView* pView, bool bOpen) = 0;\n \n /**\n * @brief 围栏渲染图层显隐\n * @param[in] pView 主图句柄,目前只支持单实例\n * @param[in] bVisible 可见不可见\n * @return void\n * @note thread:multi\n */\n virtual void SetGeoFenceLayerVisible(IMapView* pView, bool bVisible) = 0;\n \n /**\n * @brief 围栏显示样式控制\n * @param[in] pView 主图句柄,目前只支持单实例\n * @param[in] drawConfig 详见 GeoFenceDrawConfig\n * @return void\n * @note thread:multi\n */\n virtual void SetGeoFenceDrawConfig(IMapView* pView, const GeoFenceDrawConfig& drawConfig) = 0;\n \n /**\n * @brief 围栏图层样式自定义\n * @param[in] pView 主图句柄,目前只支持单实例\n * @param[in] pStyle 用法和AutoSDK 的 BizLayer服务一致。 当应用层想自定义不同的围栏样式可以通过实现自定义IPrepareLayerStyle。客户端不调用的情况下,AutoSDK有内置默认样式\n * 内部默认实现的是PolygonItem 和 LineItem 样式,分别区分 在围栏内 和 围栏外的效果。\n * 激活态的line样式 "{\\"line_layer_item_style\\":{\\"priority\\":0,\\"use_cap\\":1,\\"use_color\\":1,\\"draw_cover\\":1,\\"can_be_coveredbylabel\\":0,\\"fill_texture\\":{\\"marker_id\\":-1,\\"marker_info\\":\\"\\",\\"color\\":\\"0x773E6EFF\\",\\"width\\":20},\\"texture_info\\":{\\"x1\\":0.0,\\"y1\\":0.5,\\"x2\\":1.0,\\"y2\\":0.5,\\"texture_len\\":32},\\"cap_texture_info\\":{\\"x1\\":0.0,\\"y1\\":0.5,\\"x2\\":1.0,\\"y2\\":0.75}}}"\n * 非激活态的line样式:{\\"line_layer_item_style\\":{\\"priority\\":0,\\"use_cap\\":1,\\"use_color\\":1,\\"draw_cover\\":1,\\"can_be_coveredbylabel\\":0,\\"fill_texture\\":{\\"marker_id\\":-1,\\"marker_info\\":\\"\\",\\"color\\":\\"0x771EBBDA\\",\\"width\\":10},\\"texture_info\\":{\\"x1\\":0.0,\\"y1\\":0.5,\\"x2\\":1.0,\\"y2\\":0.5,\\"texture_len\\":32},\\"cap_texture_info\\":{\\"x1\\":0.0,\\"y1\\":0.5,\\"x2\\":1.0,\\"y2\\":0.75}}}\n * 激活态polygon: {\\"polygon_layer_item_style\\":{\\"priority\\":0,\\"color\\":\\"0x773E6EFF\\"}}\n * 非激活态polygon: {\\"polygon_layer_item_style\\":{\\"priority\\":0,\\"color\\":\\"0x771EBBDA\\"}}\n * @return void\n * @note thread:multi\n */\n virtual void SetStyle(IMapView* pView, const IPrepareLayerStyle* pStyle) = 0;\n \n /**\n * @brief 添加围栏感知结果回调观察者\n * @param[in] pObserver 围栏感知结果回调观察者\n * @return bool true : 成功, false:失败\n * @note thread:multi\n */\n virtual bool AddObserver(IGeoFencePerceptObserver* pObserver) = 0;\n\n /**\n * @brief 移除围栏感知结果回调观察者\n * @param[in] pObserver 围栏感知结果回调观察者\n * @return bool true : 成功, false:失败\n * @note thread:multi\n */\n virtual bool RemoveObserver(IGeoFencePerceptObserver* pObserver) = 0;\n\npublic:\n\n /**\n * @brief 获取地理围栏服务版本\n * @details 此接口用来获取BL地理围栏服务版本\n * @return dice::String16 版本号\n * @note thread:multi\n */\n static dice::String16 GetGeoFenceVersion();\n};\nEND_SPACE_BL\n\n#endif /**< __BL_GEO_FENCE_SERVICE_H__ */
ErrorCode l_code = ErrorCodeUnknown;\n bl::IGeoFenceService* pGeoFenceService = GetGeoFenceService();\n if (NULL != pGeoFenceService)\n {\n bl::GeoFenceInitParam param;\n dice::String8 key = "dic";\n dice::String8 value = "";\n dice::String8 section = "GRestConfig";\n //gBlConfigPtr->GetRestConfigValue(section, key, value);\n dice::String16 strChannelID = S16("bl_geofence_test8");\n param.strChannelID = strChannelID;\n dice::String8 strDbPath = GeoFencePathFromDataDir("res/").c_str();\n \n param.strDbPath = BlToolString::String8ToString16(strDbPath);\n param.pView = MapMgr::GetInstance().GetMapService()->GetMapView(MapEngineIdMain);\n \n l_code = pGeoFenceService->Init(param);\n if (ErrorCodeOK == l_code)\n {\n pGeoFenceService->AddObserver((IGeoFencePerceptObserver*)&GeoFencePerceptObserver::GetInstance());\n pGeoFenceService->SetGeoFenceRegualCondition((IGeoFenceRegualCondition*)&GeoFenceRegualCondition::GetInstance());\n pGeoFenceService->OpenGeoFenceLayer(param.pView, true);\n }\n }
l_code = pGeoFenceService->Init(param);
pGeoFenceService->SetGeoFenceRegualCondition((IGeoFenceRegualCondition*)&GeoFenceRegualCondition::GetInstance());
pGeoFenceService->AddObserver((IGeoFencePerceptObserver*)&GeoFencePerceptObserver::GetInstance());
pGeoFenceService->OpenGeoFenceLayer(param.pView, true);
GeoFenceService mGeoFenceService = (GeoFenceService) ServiceMgr.getServiceMgrInstance().getBLService(SingleServiceID.GeoFenceSingleServiceID);\nif (mGeoFenceService == null) { // 获取服务失败\n return false;\n}\n\n// 创建数据目录\nFileUtils.createDIR(AutoConstant.GEOFENCE_DATA_DIR);\n\nGeoFenceInitParam param = new GeoFenceInitParam();\nparam.strChannelID = "bl_geofence_test8"; // 猛犸渠道号,请求围栏数据必填参数\nparam.strDbPath = AutoConstant.GEOFENCE_DATA_DIR; // 围栏数据库存储路径,目录需要先创建\nint success = mGeoFenceService.init(param);\n\nif (success == ErrorCode.ErrorCodeOK) { // 初始化成功\n mGeoFenceService.setGeoFenceRegualCondition(geoFenceRegualCondition); // 设置围栏规则条件数据适配接口\n mGeoFenceService.addObserver(geoFencePerceptObserver); // 添加围栏感知结果回调观察者\n mGeoFenceService.openGeoFenceLayer(mapView, true); // 围栏渲染功能开关\n}
mGeoFenceService.init(param);
mGeoFenceService.setGeoFenceRegualCondition( new IGeoFenceRegualCondition() {...})
mGeoFenceService.addObserver(new IGeoFencePerceptObserver() {...})
mGeoFenceService.openGeoFenceLayer(mapView, true)
围栏服务依赖定位服务,引导服务依赖定位服务,因此销毁引导服务会先销毁定位服务,导致地理围栏服务崩溃。建议通过removeService销毁服务,销毁引导或者定位服务,都会先销毁地理围栏服务,再销毁定位服务和引导服务,销毁地理围栏服务,仅仅只销毁地理围栏服务
","body_lake":null,"pub_level":null,"status":"0","updated_at":"2022-04-06 07:06:58","deleted_at":null,"nameSpace":"mnlcaa/v610","browseCount":209,"collectCount":1,"estimateDate":40,"docStatus":0,"permissions":true,"overView":false}}