STBMKCenter.m 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. //
  2. // STBMKCenter.m
  3. // BuguLive
  4. //
  5. // Created by 岳克奎 on 17/3/29.
  6. // Copyright © 2017年 xfg. All rights reserved.
  7. //
  8. #import "STBMKCenter.h"
  9. @implementation STBMKCenter
  10. #pragma mark **************************** Life Cycle ****************************
  11. static STBMKCenter *signleton = nil;
  12. + (instancetype)allocWithZone:(struct _NSZone *)zone
  13. {
  14. static dispatch_once_t onceToken;
  15. dispatch_once(&onceToken, ^{
  16. signleton = [super allocWithZone:zone];
  17. });
  18. return signleton;
  19. }
  20. + (STBMKCenter *)shareManager
  21. {
  22. static dispatch_once_t onceToken;
  23. dispatch_once(&onceToken, ^{
  24. signleton = [[self alloc] init];
  25. });
  26. return signleton;
  27. }
  28. + (id)copyWithZone:(struct _NSZone *)zone
  29. {
  30. return signleton;
  31. }
  32. + (id)mutableCopyWithZone:(struct _NSZone *)zone
  33. {
  34. return signleton;
  35. }
  36. #pragma mark **************************** Getter ****************************
  37. #pragma mark --- BMKGeoCodeSearch
  38. -(BMKGeoCodeSearch *)bmkGeoCodeSearch{
  39. if (!_bmkGeoCodeSearch) {
  40. _bmkGeoCodeSearch = [[BMKGeoCodeSearch alloc]init];
  41. _bmkGeoCodeSearch.delegate = self;
  42. }
  43. return _bmkGeoCodeSearch;
  44. }
  45. #pragma mark --- BMKLocationService 定位功能
  46. -(BMKLocationService *)bmkLocationService{
  47. if (!_bmkLocationService) {
  48. _bmkLocationService = [[BMKLocationService alloc]init];
  49. _bmkLocationService.delegate = self;
  50. }
  51. return _bmkLocationService;
  52. }
  53. #pragma mark ---BMKPoiSearch
  54. -(BMKPoiSearch *)bmkPoiSearch{
  55. if (!_bmkPoiSearch) {
  56. _bmkPoiSearch = [[BMKPoiSearch alloc]init];
  57. _bmkPoiSearch.delegate = self;
  58. }
  59. return _bmkPoiSearch;
  60. }
  61. #pragma mark --- BMKNearbySearchOption
  62. -(BMKNearbySearchOption *)bmkNearbySearchOption{
  63. if (!_bmkNearbySearchOption) {
  64. _bmkNearbySearchOption = [[BMKNearbySearchOption alloc] init];
  65. }
  66. return _bmkNearbySearchOption;
  67. }
  68. #pragma mark **************************** Delegate ***************************
  69. #pragma mark ----------------------- <BMKLocationServiceDelegate>
  70. // ①②③④⑤⑥
  71. #pragma mark ----① 将要启动定位
  72. - (void)willStartLocatingUser{
  73. }
  74. #pragma mark ----② 停止定位
  75. - (void)didStopLocatingUser{
  76. }
  77. #pragma mark ----③ 用户方向更新
  78. //处理方向变更信息
  79. - (void)didUpdateUserHeading:(BMKUserLocation *)userLocation {
  80. NSLog(@"user derection change--->heading is %@",userLocation.heading);
  81. return;
  82. }
  83. #pragma mark ----④ 处理位置坐标更新
  84. -(void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation{
  85. NSLog(@"didUpdateUserLocation lat %f,long %f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude);
  86. if(_stBMKUserLocationComplete){
  87. _stBMKUserLocationComplete(userLocation);
  88. }
  89. [_bmkLocationService stopUserLocationService];
  90. }
  91. #pragma mark ----⑤ 定位失败
  92. - (void)didFailToLocateUserWithError:(NSError *)error{
  93. [_bmkLocationService stopUserLocationService];
  94. NSLog(ASLocalizedString(@"定位失败"));
  95. if(_stBMKUserLocationComplete) {
  96. _stBMKUserLocationComplete(nil);
  97. }
  98. [_bmkLocationService stopUserLocationService];
  99. return;
  100. }
  101. #pragma mark ---展示定位信息
  102. /*
  103. 展示定位信息的功能位于 “基础地图(Map)”这个功能模块,开发者使用时请注意选择。
  104. 核心代码如下:(完整信息请参考Demo)
  105. //普通态
  106. //以下_mapView为BMKMapView对象
  107. _mapView.showsUserLocation = YES;//显示定位图层
  108. [_mapView updateLocationData:userLocation];
  109. */
  110. #pragma mark -----------------------<BMKGeoCodeSearchDelegate>
  111. #pragma mark --- Public method of BMKGeocodeSearch
  112. /*
  113. 根据地址名称获取地理信息 - (BOOL)geoCode:(BMKGeoCodeSearchOption*)geoCodeOption
  114. 根据地理坐标获取地址信息 - (BOOL)reverseGeoCode:(BMKReverseGeoCodeOption*)reverseGeoCodeOption
  115. */
  116. #pragma ----- Reverse Geo Code Result 返回反地理编码搜索结果
  117. -(void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher
  118. result:(BMKReverseGeoCodeResult *)result
  119. errorCode:(BMKSearchErrorCode)error
  120. {
  121. if (_stBMKReverseGeoCodeResultComplete) {
  122. _stBMKReverseGeoCodeResultComplete(searcher,result,error);
  123. }
  124. NSLog(@"================ %@ ==========%u",result,error);
  125. NSArray *poiArray = result.poiList.copy;
  126. //POI信息类
  127. //poi列表
  128. for (BMKPoiInfo *info in poiArray) {
  129. NSLog(@"info.name === %@",info.name);
  130. NSLog(@"info.name === %@",info.address);
  131. }
  132. }
  133. #pragma ----- 返回地址信息搜索结果
  134. - (void)onGetGeoCodeResult:(BMKGeoCodeSearch *)searcher
  135. result:(BMKGeoCodeResult *)result
  136. errorCode:(BMKSearchErrorCode)error{
  137. }
  138. #pragma mark **************************** Public ***************************
  139. //获得经纬度
  140. //- (void)showUserLocationServiceWithComplete:(void(^)(BMKUserLocation *bmkUserLocation))block{
  141. // [self bmkLocationService];
  142. //}
  143. - (void)showUserLocationServiceWithComplete:(STBMKUserLocationComplete)block{
  144. [[self bmkLocationService] startUserLocationService];
  145. _stBMKUserLocationComplete = [block copy];
  146. }
  147. //根据经纬度 获得具体地址
  148. #pragma mark - GetAdress from userLocation
  149. ////根据经纬度 获得具体地址
  150. - (void)showAddressWithuserLocation:(BMKUserLocation *)userLocation
  151. Complete:(STBMKReverseGeoCodeResultComplete)block{
  152. _stBMKReverseGeoCodeResultComplete = [block copy];
  153. //发起反地理编码
  154. CLLocationCoordinate2D pt = (CLLocationCoordinate2D){userLocation.location.coordinate.latitude, userLocation.location.coordinate.longitude};
  155. //逆向编码对象
  156. BMKReverseGeoCodeOption *bmkReverseGeoCodeOption = [[BMKReverseGeoCodeOption alloc]init];
  157. //设置需要转化的经纬度
  158. bmkReverseGeoCodeOption.reverseGeoPoint = pt;
  159. //发送逆向地理编码-根据地理坐标获取地址信息
  160. BOOL flag = [ [self bmkGeoCodeSearch] reverseGeoCode:bmkReverseGeoCodeOption];
  161. if(flag)
  162. {
  163. NSLog(ASLocalizedString(@"反geo检索发送成功"));
  164. //关闭定位
  165. [self.bmkLocationService stopUserLocationService];
  166. }
  167. else
  168. {
  169. NSLog(ASLocalizedString(@"反geo检索发送失败"));
  170. //关闭定位
  171. [self.bmkLocationService stopUserLocationService];
  172. }
  173. }
  174. //- (void)showAddressWithuserLocation:(BMKUserLocation *)userLocation
  175. // andComplete:(void(^)(BMKGeoCodeSearch *searcher,
  176. // BMKReverseGeoCodeResult *result,
  177. // BMKSearchErrorCode error))block{
  178. // [self bmkGeoCodeSearch];
  179. // //发起反地理编码
  180. // CLLocationCoordinate2D pt = (CLLocationCoordinate2D){userLocation.location.coordinate.latitude, userLocation.location.coordinate.longitude};
  181. // //逆向编码对象
  182. // BMKReverseGeoCodeOption *bmkReverseGeoCodeOption = [[BMKReverseGeoCodeOption alloc]init];
  183. // //设置需要转化的经纬度
  184. // bmkReverseGeoCodeOption.reverseGeoPoint = pt;
  185. // //发送逆向地理编码-根据地理坐标获取地址信息
  186. // BOOL flag = [_bmkGeoCodeSearch reverseGeoCode:bmkReverseGeoCodeOption];
  187. // if(flag)
  188. // {
  189. // NSLog(ASLocalizedString(@"反geo检索发送成功"));
  190. // }
  191. // else
  192. // {
  193. // NSLog(ASLocalizedString(@"反geo检索发送失败"));
  194. // }
  195. //// if (block) {
  196. //// // _stBMKReverseGeoCodeResultComplete = [block copy];
  197. //// block = [_stBMKReverseGeoCodeResultComplete copy];
  198. //// }
  199. //}
  200. -(void)showSearchByKeyWords:(NSString *)searchKeyWords andNearbySearchwithUserLocation:(BMKUserLocation *)userLocation
  201. andComplete:(STBMKPoiResultComplete)block{
  202. _stBMKPoiResultComplete = [block copy];
  203. [self bmkPoiSearch];
  204. [self bmkNearbySearchOption];
  205. _bmkNearbySearchOption.pageIndex = 0; //分页索引,可选,默认为0
  206. _bmkNearbySearchOption.pageCapacity = 50; //页数默认为10
  207. _bmkNearbySearchOption.radius = 1000; //周边检索半径
  208. //检索的中心点,经纬度
  209. _bmkNearbySearchOption.location = userLocation.location.coordinate;
  210. //搜索的关键字
  211. _bmkNearbySearchOption.keyword = searchKeyWords;
  212. //根据中心点、半径和检索词发起周边检索
  213. BOOL flag = [self.bmkPoiSearch poiSearchNearBy:self.bmkNearbySearchOption];
  214. if (flag) {
  215. NSLog(ASLocalizedString(@"搜索成功"));
  216. //关闭定位
  217. [self.bmkLocationService stopUserLocationService];
  218. }
  219. else {
  220. NSLog(ASLocalizedString(@"搜索失败"));
  221. //关闭定位
  222. [self.bmkLocationService stopUserLocationService];
  223. }
  224. }
  225. #pragma marl--------------------- <BMKPoiSearchDelegate>
  226. /**
  227. *返回POI搜索结果
  228. *@param searcher 搜索对象
  229. *@param poiResult 搜索结果列表
  230. *@param errorCode 错误号,@see BMKSearchErrorCode
  231. */
  232. - (void)onGetPoiResult:(BMKPoiSearch*)searcher result:(BMKPoiResult*)poiResult errorCode:(BMKSearchErrorCode)errorCode{
  233. //若搜索成功
  234. if (errorCode ==BMK_SEARCH_NO_ERROR) {
  235. /* if (_stBMKPoiResultComplete) {
  236. _stBMKPoiResultComplete(searcher,poiResult,errorCode);
  237. }
  238. //POI信息类
  239. //poi列表
  240. for (BMKPoiInfo *info in poiResult.poiInfoList) {
  241. NSLog(@"info.name === %@",info.name);
  242. NSLog(@"info.name === %@",info.address);
  243. }*/
  244. }
  245. if (_stBMKPoiResultComplete) {
  246. _stBMKPoiResultComplete(searcher,poiResult,errorCode);
  247. }
  248. }
  249. /**
  250. *返回POI详情搜索结果
  251. *@param searcher 搜索对象
  252. *@param poiDetailResult 详情搜索结果
  253. *@param errorCode 错误号,@see BMKSearchErrorCode
  254. */
  255. - (void)onGetPoiDetailResult:(BMKPoiSearch*)searcher result:(BMKPoiDetailResult*)poiDetailResult errorCode:(BMKSearchErrorCode)errorCode{
  256. }
  257. /**
  258. *返回POI室内搜索结果
  259. *@param searcher 搜索对象
  260. *@param poiIndoorResult 搜索结果列表
  261. *@param errorCode 错误号,@see BMKSearchErrorCode
  262. */
  263. - (void)onGetPoiIndoorResult:(BMKPoiSearch*)searcher result:(BMKPoiIndoorResult*)poiIndoorResult errorCode:(BMKSearchErrorCode)errorCode{
  264. }
  265. //获取 省 市 地理位置 经纬度
  266. -(void)showAdressLatitudeLongitudeDataComplete:(void(^)(BOOL finished))block{
  267. //开启定位
  268. [[BGHUDHelper sharedInstance]syncLoading:ASLocalizedString(@"定位中...")];
  269. __weak typeof(self)weak_Self = self;
  270. // 位置
  271. [weak_Self showUserLocationServiceWithComplete:^(BMKUserLocation *bmkUserLocation) {
  272. [weak_Self showAddressWithuserLocation:bmkUserLocation
  273. Complete:^(BMKGeoCodeSearch *search,
  274. BMKReverseGeoCodeResult *result,
  275. BMKSearchErrorCode error) {
  276. weak_Self.provinceStr = result.addressDetail.province;
  277. weak_Self.cityNameStr = result.addressDetail.city;
  278. weak_Self.detailAdressStr = result.address;
  279. weak_Self.longitudeValue = bmkUserLocation.location.coordinate.longitude;
  280. weak_Self.latitudeValue = bmkUserLocation.location.coordinate.latitude;
  281. weak_Self.poiListMArray = result.poiList.mutableCopy;
  282. [[BGHUDHelper sharedInstance] syncStopLoading];
  283. if (block) {
  284. block(YES);
  285. }
  286. }];
  287. }];
  288. }
  289. //关键字搜索 返回结果
  290. -(void)showSearchByKeyWords:(NSString *)searchKeyWords
  291. latitude:(CGFloat)latitude
  292. longitude:(CGFloat)longitude
  293. andComplete:(STBMKPoiResultComplete)block{
  294. _stBMKPoiResultComplete = [block copy];
  295. [self bmkPoiSearch];
  296. [self bmkNearbySearchOption];
  297. _bmkNearbySearchOption.pageIndex = 0; //分页索引,可选,默认为0
  298. _bmkNearbySearchOption.pageCapacity = 50; //页数默认为10
  299. _bmkNearbySearchOption.radius = 1000; //周边检索半径
  300. //
  301. //检索的中心点,经纬度
  302. CLLocationCoordinate2D location;
  303. location.latitude = latitude;
  304. location.longitude = longitude;
  305. _bmkNearbySearchOption.location = location;
  306. //key words
  307. _bmkNearbySearchOption.keyword = searchKeyWords;
  308. //根据中心点、半径和检索词发起周边检索
  309. BOOL flag = [self.bmkPoiSearch poiSearchNearBy:self.bmkNearbySearchOption];
  310. if (flag) {
  311. NSLog(ASLocalizedString(@"搜索成功1"));
  312. //关闭定位
  313. [self.bmkLocationService stopUserLocationService];
  314. }
  315. else {
  316. NSLog(ASLocalizedString(@"搜索失败2"));
  317. //关闭定位
  318. [self.bmkLocationService stopUserLocationService];
  319. }
  320. }
  321. - (void)detailPlaceStr
  322. {
  323. if ([self.detailAdressStr rangeOfString:self.provinceStr].location !=NSNotFound)
  324. {
  325. self.detailAdressStr = [self.detailAdressStr stringByReplacingOccurrencesOfString:self.provinceStr withString:@""];
  326. }
  327. if ([self.detailAdressStr rangeOfString:self.cityNameStr].location !=NSNotFound)
  328. {
  329. self.detailAdressStr = [self.detailAdressStr stringByReplacingOccurrencesOfString:self.cityNameStr withString:@""];
  330. }
  331. }
  332. #pragma mark**************************** Getter ********************
  333. #pragma mark -------- provinceStr
  334. -(NSString *)provinceStr{
  335. if (!_provinceStr) {
  336. _provinceStr = @"";
  337. }
  338. return _provinceStr;
  339. }
  340. #pragma mark -------- _cityNameStr
  341. -(NSString *)cityNameStr{
  342. if (!_cityNameStr) {
  343. _cityNameStr = @"";
  344. }
  345. return _cityNameStr;
  346. }
  347. #pragma mark -------- detailAdressStr
  348. -(NSString *)detailAdressStr{
  349. if (!_detailAdressStr) {
  350. _detailAdressStr = @"";
  351. }
  352. return _detailAdressStr;
  353. }
  354. #pragma mark -------- latitudeValue
  355. -(CGFloat )latitudeValue{
  356. if (!_latitudeValue) {
  357. _latitudeValue = 0;
  358. }
  359. return _latitudeValue;
  360. }
  361. #pragma mark -------- longitudeValue
  362. -(CGFloat)longitudeValue{
  363. if (!_longitudeValue) {
  364. _longitudeValue = 0;
  365. }
  366. return _longitudeValue;
  367. }
  368. #pragma mark -------- provinceStr
  369. -(NSMutableArray *)poiListMArray{
  370. if (!_poiListMArray) {
  371. _poiListMArray = @[].mutableCopy;
  372. }
  373. return _poiListMArray;
  374. }
  375. @end