百度地图开发API

注意点:
1.由于系统原因,iOS不允许使用第三方定位,因此地图SDK中的定位方法,本质上是对原生定位的二次封装。通过封装,开发者可更便捷的使用。此外,地图SDK中还提供了相应的定位图层(支持定位三态效果),帮助开发者显示当前位置信息。(百度地图坐标系统
WGS84坐标系:即地球坐标系,国际上通用的坐标系。
GCJ02坐标系:即火星坐标系,WGS84坐标系经加密后的坐标系。
BD09坐标系:即百度坐标系,GCJ02坐标系经加密后的坐标系。(该坐标系)
搜狗坐标系、图吧坐标系等,估计也是在GCJ02基础上加密而成的。 )
坐标
http://www.cnblogs.com/jay-dong/archive/2013/03/13/2957648.html
http://blog.csdn.net/m372897500/article/details/49799153

注:自iOS8起,系统定位功能进行了升级,SDK为了实现最新的适配,自v2.5.0起也做了相应的修改,开发者在使用定位功能之前,需要在info.plist里添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription):
NSLocationWhenInUseUsageDescription ,允许在前台使用时获取GPS的描述
NSLocationAlwaysUsageDescription ,允许永久使用GPS的描述

定位模式:

目前为止,BMKMapView的定位模式(userTrackingMode)有4种分别是:
1) BMKUserTrackingModeNone :普通定位模式,显示我的位置,我的位置图标和地图都不会旋转
2) BMKUserTrackingModeFollow : 定位跟随模式,我的位置始终在地图中心,我的位置图标会旋转,地图不会旋转
3) BMKUserTrackingModeFollowWithHeading : 定位罗盘模式,我的位置始终在地图中心,我的位置图标和地图都会跟着旋转
4) BMKUserTrackingModeHeading:普通定位+定位罗盘模式,显示我的位置,我的位置始终在地图中心,我的位置图标会旋转,地图不会旋转。即在普通定位模式的基础上显示方向。

 //设置自定义地图样式,会影响所有地图实例

    _mapView = [[BMKMapView alloc] initWithFrame:CGRectMake(0, 0, screenWidth, screenHeight * 0.2)];

    [self.view addSubview:_mapView];

    //注:必须在BMKMapView对象初始化之前调用
    //    NSString* path = [[NSBundle mainBundle] pathForResource:@"custom_config_清新蓝" ofType:@""];
    //    [BMKMapView customMapStyle:path];
    //    _mapView.mapType = BMKMapTypeNone;
    [_mapView setMapType:BMKMapTypeStandard];
//    _mapView.userTrackingMode = BMKUserTrackingModeNone;

    _locService = [[BMKLocationService alloc]init];

    displayParam = [[BMKLocationViewDisplayParam alloc]init];
    displayParam.isRotateAngleValid = true;//跟随态旋转角度是否生效
    displayParam.isAccuracyCircleShow = false;//精度圈是否显示
    displayParam.locationViewImgName= @"[email protected]";//定位图标名称
    displayParam.locationViewOffsetX = 0;//定位偏移量(经度)
    displayParam.locationViewOffsetY = 0;//定位偏移量(纬度)
    [_mapView updateLocationViewWithParam:displayParam];

    _geocodesearch = [[BMKGeoCodeSearch alloc]init];

    [_mapView setZoomLevel:14];

    [_locService startUserLocationService];
    //    _mapView.showsUserLocation = NO;//先关闭显示的定位图层
    _mapView.userTrackingMode = BMKUserTrackingModeNone;//设置定位的状态
    _mapView.showsUserLocation = YES;//显示定位图层


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

代理方法

#pragma mark - BMKMapViewDelegate

- (void)mapViewDidFinishLoading:(BMKMapView *)mapView {
//       UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"BMKMapView控件初始化完成" delegate:nil cancelButtonTitle:@"知道了" otherButtonTitles: nil];
//            [alert show];
//            alert = nil;
}

- (void)mapView:(BMKMapView *)mapView onClickedMapBlank:(CLLocationCoordinate2D)coordinate {
    NSLog(@"map view: click blank");
}

- (void)mapview:(BMKMapView *)mapView onDoubleClick:(CLLocationCoordinate2D)coordinate {
    NSLog(@"map view: double click");
}

/**
 *在地图View将要启动定位时,会调用此函数
 *@param mapView 地图View
 */
- (void)willStartLocatingUser
{
    NSLog(@"start locate");
}

/**
 *用户方向更新后,会调用此函数
 *@param userLocation 新的用户位置
 */
- (void)didUpdateUserHeading:(BMKUserLocation *)userLocation
{
    [_mapView updateLocationData:userLocation];
    getLocation = userLocation;
    [self updateLocalX:userLocation.location.coordinate];
    if (userLocation) {
        [_locService stopUserLocationService];
    }



}

/**
 *用户位置更新后,会调用此函数
 *@param userLocation 新的用户位置
 */
- (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation
{


    getLocation = userLocation;
    _mapView.zoomLevel = 5;
    NSSLog(@"didUpdateUserLocation lat %f,long %f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude);
    [_mapView updateLocationData:userLocation];

    [self updateLocalX:userLocation.location.coordinate];




    BMKCoordinateRegion region ;//表示范围的结构体
    region.center = userLocation.location.coordinate;//中心点
    region.span.latitudeDelta = 0.005;//经度范围(设置为0.1表示显示范围为0.2的纬度范围)
    region.span.longitudeDelta = 0.005;//纬度范围
    [_mapView setRegion:region animated:YES];
    _mapView.centerCoordinate =  userLocation.location.coordinate;

    if (userLocation) {
        [_locService stopUserLocationService];
    }

}

/**
 *在地图View停止定位后,会调用此函数
 *@param mapView 地图View
 */
- (void)didStopLocatingUser
{
    NSSLog(@"stop locate");
}

/**
 *定位失败后,会调用此函数
 *@param mapView 地图View
 *@param error 错误号,参考CLError.h中定义的错误号
 */
- (void)didFailToLocateUserWithError:(NSError *)error
{
    NSSLog(@"location error");
}
//反地理编码
-(void) onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error
{

    NSLog(@"%d",error);
    geoCodeResult = result;
//    NSArray* array = [NSArray arrayWithArray:_mapView.annotations];
//    [_mapView removeAnnotations:array];
//    array = [NSArray arrayWithArray:_mapView.overlays];
//    [_mapView removeOverlays:array];
//    if (error == 0) {
//        BMKPointAnnotation* item = [[BMKPointAnnotation alloc]init];
//        item.coordinate = result.location;
//        item.title = result.address;
//        [_mapView addAnnotation:item];
//        _mapView.centerCoordinate = result.location;
//        _mapView.zoomLevel = 3;
//        NSString* titleStr;
//        NSString* showmeg;
//        titleStr = @"反向地理编码";
//        showmeg = [NSString stringWithFormat:@"%@",item.title];
//
//        NSLog(@"%@",showmeg);
//        //        UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:titleStr message:showmeg delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定",nil];
//        //        [myAlertView show];
//    }

}

#pragma mark -配置搜索参数
- (void) setupSearchCode
{

    if (getLocation.location) {
        CLLocationCoordinate2D pt = getLocation.location.coordinate;
        BMKReverseGeoCodeOption *reverseGeocodeSearchOption = [[BMKReverseGeoCodeOption alloc]init];
        reverseGeocodeSearchOption.reverseGeoPoint = pt;
        BOOL flag = [_geocodesearch reverseGeoCode:reverseGeocodeSearchOption];
        if(flag)
        {
            NSLog(@"反geo检索发送成功");
        }
        else
        {
            NSLog(@"反geo检索发送失败");
        }
    }


}
//当界面将要销毁时,取消地图.定位.地理编码搜索的代理,置空对象.
-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [_mapView viewWillDisappear];

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

- (void)dealloc {
    if (_mapView) {
        _mapView = nil;
    }

    if (_locService) {
        _locService = nil;
    }

    if (_geocodesearch != nil) {
        _geocodesearch = nil;
    }
}

百度地图集成后不显示原因:1.申请的加密安全码是否正确
2.集成环境中添加Library,是否添加完全(先将要用到的百度库复制到项目文件夹下,然后通过TARGETS->Build Phases->Link Binary With Libraries -> + -> Add Other 将用到的百度地图库添加到项目中)
3.Framework Search Paths 中添加百度地图库所对应的项目中的相对路径文件夹 $(PROJECT_DIR)/EHR/ThirdParty/BaiduMapKit
4. 将BaiduMapAPI_Map.framework下的资源文件Resources添加到项目中,

你可能感兴趣的:(Obj-C,iOS)