iOS百度地图反编码个人见解

转载 2018年01月02日 00:00:00

点击上方“程序员大咖”,选择“置顶公众号”

关键时刻,第一时间送达!

640?wxfrom=5&wx_lazy=1

0.gif?wxfrom=5&wx_lazy=1


类似于微信中的发送位置,拖拽从新定位,以及反编码,列表附近的位置。


?wx_fmt=gif&wxfrom=5&wx_lazy=1

百度地图拖拽更新位置.gif


思路就是将一个UIImageView固定在地图中间,每次更新位置,给UIImageView添加动画即可。


代码如下:


#import "FTBasicController.h"


typedef void (^SelectBlock) (NSString *address,CLLocationCoordinate2D select);

@interface FTUploadAddressController : FTBasicController


@property(nonatomic, copy)SelectBlock selectBlock;

@end


#import "FTUploadAddressController.h"

#import "FTBMKPoiInfo.h"

#import "FTPoiCell.h"

@interface FTUploadAddressController ()<BMKMapViewDelegate,BMKLocationServiceDelegate,UITableViewDelegate,UITableViewDataSource,BMKGeoCodeSearchDelegate>

@property(nonatomic,strong)BMKLocationService *locService;

@property(nonatomic,strong)BMKUserLocation *userLocation;

@property(nonatomic,strong)BMKMapView *mapView;

@property(nonatomic,strong)UITableView *tableview;

@property(nonatomic,strong)BMKGeoCodeSearch *geocodesearch;

@property(nonatomic,strong)UIImageView *loactionView;

@property(nonatomic,strong)NSMutableArray *dataA;

@property(nonatomic,strong)LxButton *poiBackBtn;


@property(nonatomic,assign)CLLocationCoordinate2D selectedCoordinate;

@property(nonatomic,strong)NSString *selectAddress;

@end


@implementation FTUploadAddressController

-(void)viewWillAppear:(BOOL)animated{

    [super viewWillAppear:animated];

    

    self.fd_interactivePopDisabled = YES;

    

    if (!([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedAlways || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse) &&[CLLocationManager authorizationStatus] != kCLAuthorizationStatusNotDetermined){

        [self judgeOpenlocation];

    }else{

        [_mapView viewWillAppear];

        _mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放

        

        

        _locService.delegate = self;

          _geocodesearch.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放

        _mapView.showsUserLocation = NO;//先关闭显示的定位图层

        _mapView.userTrackingMode = 0;

        _mapView.showsUserLocation = YES;//显示定位图层

        

        

        [self.locService startUserLocationService];

        

        

    }

    

    

    

}

-(void)judgeOpenlocation{

    

    UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"打开[定位服务]来允许[应用名字]确定您的位置" message:@"请在系统设置中开启定位服务(设置>隐私>定位服务>应用名字>始终)" preferredStyle:UIAlertControllerStyleAlert];

    [alertVC addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];

    [alertVC addAction:[UIAlertAction actionWithTitle:@"去设置" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

        

        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.000000) {

            //跳转到定位权限页面

            NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];

            if( [[UIApplication sharedApplication]canOpenURL:url] ) {

                [[UIApplication sharedApplication] openURL:url];

            }

        }else {

            //跳转到定位开关界面

            NSURL *url = [NSURL URLWithString:@"prefs:root=LOCATION_SERVICES"];

            if( [[UIApplication sharedApplication]canOpenURL:url] ) {

                [[UIApplication sharedApplication] openURL:url];

            }

        }

    }]];

    [self presentViewController:alertVC animated:YES completion:nil];

    

}

-(void)viewWillDisappear:(BOOL)animated

{

     self.fd_interactivePopDisabled = NO;

    [_mapView viewWillDisappear];

    _mapView.delegate = nil; // 不用时,置nil

    [self.locService stopUserLocationService];

     _geocodesearch.delegate = nil; // 不用时,置nil

    _locService.delegate = nil;

    

}

- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view.

    self.title = @"所在位置";

    

     self.locService = [[BMKLocationService alloc]init];

    self.geocodesearch =  [[BMKGeoCodeSearch alloc]init];

     [self setup];

    

     self.navigationItem.leftBarButtonItem =[[UIBarButtonItem alloc]initWithImage:[[UIImage imageNamed:@"return"]imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:@selector(backReturn)];

}

-(void)backReturn{

    if (self.selectBlock) {

        self.selectBlock(self.selectAddress, self.selectedCoordinate);

        [self.navigationController popViewControllerAnimated:YES];

    }

}

-(void)setup{

     [self.view addSubview:self.mapView];

    

    [self.view addSubview:self.tableview];

    

    [self.mapView addSubview:self.loactionView];

    

    [self.mapView addSubview:self.poiBackBtn];

    

     [self.poiBackBtn LX_SetShadowPathWith:[UIColor grayColor] shadowOpacity:0.5 shadowRadius:5 shadowSide:LXShadowPathBottom shadowPathWidth:3];

    

    FTWS(weakSelf);

    [self.poiBackBtn addClickBlock:^(UIButton *button) {

        

         [weakSelf.mapView setCenterCoordinate:weakSelf.userLocation.location.coordinate];

        

    }];

}

- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation

{

    //        NSLog(@"didUpdateUserLocation lat %f,long %f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude);

    [_mapView updateLocationData:userLocation];

    


    self.userLocation = userLocation;

    

    [self.mapView setCenterCoordinate:userLocation.location.coordinate];

   

    BMKReverseGeoCodeOption * option = [[BMKReverseGeoCodeOption alloc]init];

    option.reverseGeoPoint = userLocation.location.coordinate;

    BOOL flag = [_geocodesearch reverseGeoCode:option];

    

    if (flag) {

        

    }

    

    //更新位置之后必须停止定位,

    [_locService stopUserLocationService];

        

    

    

}


-(void)mapView:(BMKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{

    

    

    NSLog(@"地图拖动");


    [UIView animateWithDuration:0.30 animations:^{

        self.loactionView.centerY -=8;

    } completion:^(BOOL finished) {

        self.loactionView.centerY +=8;

    }];

    

    CGPoint touchPoint = self.mapView.center;

    

    CLLocationCoordinate2D touchMapCoordinate =

    [self.mapView convertPoint:touchPoint toCoordinateFromView:self.mapView];//这里touchMapCoordinate就是该点的经纬度了

    NSLog(@"touching %f,%f",touchMapCoordinate.latitude,touchMapCoordinate.longitude);

    

    //选择的上传地址

    self.selectedCoordinate = touchMapCoordinate;

    BMKReverseGeoCodeOption * option = [[BMKReverseGeoCodeOption alloc]init];

    option.reverseGeoPoint = touchMapCoordinate;

    BOOL flag = [_geocodesearch reverseGeoCode:option];


    if (flag) {

        

    }

    

}

#pragma mark---获取反编码的数据---

-(void)onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error

{

        BMKAddressComponent *component=[[BMKAddressComponent alloc]init];

        component=result.addressDetail;

    

    [self.dataA removeAllObjects];

    

    for (int i =0; i< result.poiList.count; i++) {

        BMKPoiInfo *info = result.poiList[i];

        FTBMKPoiInfo *ftInfo =[[FTBMKPoiInfo alloc]init];

        ftInfo.address = info.address;

        ftInfo.seleced = NO;

        if (i == 0) {

            ftInfo.seleced = YES;

            self.selectAddress = ftInfo.address;

        }

        [self.dataA addObject:ftInfo];

    }

    [self.tableview reloadData];

}


#pragma mark--- 定位的方法--

- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation

{

    [_mapView updateLocationData:userLocation];

    //    NSLog(@"heading is %@",userLocation.heading);

}

-(BMKMapView *)mapView{

    if (!_mapView) {

        _mapView =[[BMKMapView alloc]initWithFrame:CGRectMake(0, NAVH, Device_Width, 350)];

        _mapView.zoomLevel = 18;

        _mapView.minZoomLevel = 3;

        _mapView.maxZoomLevel = 21;

//        BMKLocationViewDisplayParam *displayParam = [[BMKLocationViewDisplayParam alloc]init];

//        displayParam.isRotateAngleValid = true;//跟随态旋转角度是否生效

//        displayParam.isAccuracyCircleShow = false;//精度圈是否显示

//        displayParam.locationViewOffsetX = 0;//定位偏移量(经度)

//        displayParam.locationViewOffsetY = 0;//定位偏移量(纬度)

//        [_mapView updateLocationViewWithParam:displayParam];

        

    }

    return _mapView;

}



-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    return self.dataA.count;

}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    FTPoiCell *cell =[tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

    if (!cell) {

        cell =[[FTPoiCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];

    }

    FTBMKPoiInfo *info = self.dataA[indexPath.row];

    cell.info = info;

    return cell;

}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    

    FTBMKPoiInfo *info = self.dataA[indexPath.row];

    self.selectAddress = info.address;

    

    [self.dataA enumerateObjectsUsingBlock:^(FTBMKPoiInfo * obj, NSUInteger idx, BOOL * _Nonnull stop) {

        

        if (obj == info) {

            obj.seleced = YES;

        }else{

            obj.seleced = NO;

        }

        

        [self.tableview reloadData];

    }];

    

    if (self.selectBlock) {

        self.selectBlock(self.selectAddress,self.selectedCoordinate);

        

        [self.navigationController popViewControllerAnimated:YES];

    }

    

}

-(UITableView *)tableview{

    

    if (!_tableview) {

        _tableview =[[UITableView alloc]initWithFrame:CGRectMake(0, self.mapView.bottom, Device_Width, Device_Height - self.mapView.bottom) style:UITableViewStylePlain];

        _tableview.delegate = self;

        _tableview.dataSource = self;

        _tableview.showsVerticalScrollIndicator = NO;

        _tableview.showsHorizontalScrollIndicator = NO;

        _tableview.tableFooterView = [UIView new];

        _tableview.rowHeight = 44;

        [_tableview registerNib:[UINib nibWithNibName:@"FTPoiCell" bundle:nil] forCellReuseIdentifier:@"cell"];

//        [_tableview registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];

        

    }

    return _tableview;

}

-(NSMutableArray *)dataA{

    if (!_dataA) {

        _dataA =[NSMutableArray array];

    }

    return _dataA;

}

-(UIImageView *)loactionView{

    if (!_loactionView) {

        _loactionView =[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"ditu_red"]];

        _loactionView.center = CGPointMake(self.mapView.width/2, self.mapView.height/2);

       

    }

    return _loactionView;

}

-(LxButton *)poiBackBtn{

    if (!_poiBackBtn) {

        _poiBackBtn =[LxButton LXButtonWithTitle:nil titleFont:nil Image:nil backgroundImage:nil backgroundColor:[UIColor whiteColor] titleColor:nil frame:CGRectMake(Device_Width - 75, self.mapView.height - 75, 50, 50)];

        [_poiBackBtn setFTCornerdious:25];

        UIImageView *imageView =[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"poi_back"]];

        

        imageView.center = CGPointMake(25, 25);

        [_poiBackBtn addSubview:imageView];

       

        

    }

    return _poiBackBtn;

}

@end




640.jpeg

  • 来自:  雪_晟

  • 链接:http://www.jianshu.com/p/d871aca6010a

  • 程序员大咖整理发布,转载请联系作者获得授权

0.gif

0?【点击成为Python大神】

地理编码 ,反编码 ,地理编解码

地理编码:把地名转换成位置信息 作用:把文字描述的 位置转换成地图上的经纬度; 反编码:把位置信息转换成文字 作用:可以点击地图上的某个位置 来获得文字的描述 地理编解码在编解码的时候...
  • qq_30062973
  • qq_30062973
  • 2016年08月16日 10:25
  • 376

百度地图“反geo检索发送失败”报错解决

刚才开发时候遇到了一个问题,百度地图调用反geo检索,总是第一次编译的时候成功,之后怎么编译或重新调用返回都是失败。 非常奇怪的问题。 网上有人提到mapManager被释放后地图引擎会停止工作,...
  • tcthek
  • tcthek
  • 2015年01月05日 11:48
  • 5067

定位、地理位置编码、地理位置反编码

本文地址:http://blog.csdn.net/zhenggaoxing/article/details/42527225 1 定位,主要是干啥呢? 1 获取位置相关数据  ...
  • huang2009303513
  • huang2009303513
  • 2015年01月15日 11:31
  • 2559

iOS百度地图反编码个人见解

点击上方“iOS开发”,选择“置顶公众号”关键时刻,第一时间送达!类似于微信中的发送位置,拖拽从新定位,以及反编码,列表附近的位置。百度地图拖拽更新位置.gif思路就是将一个UIImageView固定...
  • olsQ93038o99S
  • olsQ93038o99S
  • 2017年12月24日 00:00
  • 86

iOS 百度地图反编码地理位置信息

1:创建 _locService = [[BMKLocationService alloc]init];     _geocodesearch = [[BMKGeoCodeSearch alloc]...
  • darongzi1314
  • darongzi1314
  • 2015年10月27日 17:09
  • 1442

百度地图开发(二)之添加覆盖物 + 地理编码和反地理编码

之前写过一篇关于百度地图开发的blog,主要介绍了百度地图的基本地图的显示。     详见:Android百度地图开发(一)之初体验     下面来看一下地图上覆盖物的添加,以及地理编码和反地理编码。...
  • crazy1235
  • crazy1235
  • 2015年02月02日 00:05
  • 67868

CLLocation 正向编码和反向编码的实现

思路很简单: (1)创建CLLocation对象; (2)获取要检索的信息(地名,经纬度); (3)调用编码方法; 编码 导入#import #import "ViewController.h"...
  • CJXBShowZhouyujuan
  • CJXBShowZhouyujuan
  • 2016年11月21日 14:31
  • 582

iOS 百度地图定位与反地理编码

涉及到几个比较重要的函数  1.定位结束时返回用户经纬度的函数  /**  *用户位置更新后,会调用此函数  *@param userLocation 新的用户位置  */ - (...
  • sinat_31063657
  • sinat_31063657
  • 2016年03月30日 16:52
  • 2071

iOS 百度地图反编码

_geoSearch = [[BMKGeoCodeSearch alloc]init] ;     _geoSearch.delegate = self; [self reverseGeoSe...
  • qq_30023981
  • qq_30023981
  • 2017年02月22日 20:08
  • 624

谷歌地图开发:地理编码和反地理编码

谷歌地图Geocoding说明:内容主要来自谷歌官网的文档,谷歌地图android api地理和反地理编码反应迟钝内容有时不准确,这里使用的googlemap的webapi接口。嗯,需要vpn这个不多...
  • xiaohui2015
  • xiaohui2015
  • 2017年02月10日 18:12
  • 1925
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS百度地图反编码个人见解
举报原因:
原因补充:

(最多只允许输入30个字)