成都网站建设设计

将想法与焦点和您一起共享

ios开发地图定位,苹果app地图怎么定位

ios中使用mkmapview怎样开启定位

1、新建项目,将ios的提供位置服务和地图服务的库加入到项目中 点项目名-Build Phases点开Link Binary With Libraries

在剑阁等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站设计、成都网站建设 网站设计制作按需网站设计,公司网站建设,企业网站建设,成都品牌网站建设,网络营销推广,成都外贸网站建设,剑阁网站建设费用合理。

将CoreLocation和MapKit两个库加入到项目中,前者是ios的位置服务库,后者是操作MKMapView的库

2、新建UIViewController 控件布局和设置好关系属性。导入CoreLocation/CoreLocation.h和MapKit/MapKit.h

还要让控制器类实现MKMapViewDelegate协议

[objc] view plain copy print?

#import UIKit/UIKit.h

#import MapKit/MapKit.h

#import CoreLocation/CoreLocation.h

@interface MainViewController : UIViewControllerMKMapViewDelegate,UITextFieldDelegate

//经度

@property (weak, nonatomic) IBOutlet UITextField *longitudeText;

//纬度

@property (weak, nonatomic) IBOutlet UITextField *latitudeText;

//地图

@property (weak, nonatomic) IBOutlet MKMapView *mapView;

//自己经度

@property (weak, nonatomic) IBOutlet UILabel *longitudeLabel;

//自己纬度

@property (weak, nonatomic) IBOutlet UILabel *latitudeLabel;

//放置标注Button

- (IBAction)annotationAction:(id)sender;

@end

3、MKMapView可以通过 setShowsUserLocation:YES这个方法来获取自己的位置,并且当地图更新自己的位置后会调用

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation的一个协议的委托方法,我要在这个方法里面试实现当地图位置更新后/获取自己位置后对地图进行放大。

首先在viewDidLoad方法里对让地图调用setShowsUserLocation方法来实现地图的定位,并且设置MapView的委托类。

[objc] view plain copy print?

- (void)viewDidLoad

{

//设置MapView的委托为自己

[self.mapView setDelegate:self];

//标注自身位置

[self.mapView setShowsUserLocation:YES];

[super viewDidLoad];

}

然后实现-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation方法:

[objc] view plain copy print?

//MapView委托方法,当定位自身时调用

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{

CLLocationCoordinate2D loc = [userLocation coordinate];

//放大地图到自身的经纬度位置。

MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(loc, 250, 250);

[self.mapView setRegion:region animated:YES];

}

CLLocationCoordinate2D 是一个结构体记录经纬度,通过地图的获取的location来给其赋值。

运行一下程序地图载入的同时获得自身的位置,并且会自动放大到你所在的位置。

调试位置:

模拟器在运行的时候,可以自定义的设置其自身所在的位置

4、获取自身的经纬度显示在两个label上,还是在-(void)mapView:(MKMapView *)mapView

didUpdateUserLocation:(MKUserLocation *)userLocation方法里面实现,通过MKUserLocation这个类里面有经度和纬度的属性,直接拿出来显示在label上

ios开发中百度地图在4g网的情况下定位不准是怎么回事

(一)关于定位的一些设置

--------------------------------------------------------------------------------------------------------

//初始化定位服务

_locService = [[BMKLocationService alloc] init];

//设置距离过滤器(默认距离是米)

_locService.distanceFilter = 10;

//设置定位精度

_locService.desiredAccuracy = kCLLocationAccuracyBest;

//开启定位服务

[_locService startUserLocationService];

//指定定位:是否允许后台定位更新。默认为NO。只在iOS 9.0之后起作用

if ([[UIDevice currentDevice].systemVersion doubleValue] = 9) {

_locService.allowsBackgroundLocationUpdates = YES;

}

//设置定位的状态

_mapView.userTrackingMode = BMKUserTrackingModeNone;

//显示定位图层

_mapView.showsUserLocation = YES;

//设置定位图层自定义样式

BMKLocationViewDisplayParam *userlocationStyle = [[BMKLocationViewDisplayParam alloc] init];

//精度圈是否显示

userlocationStyle.isRotateAngleValid = YES;

//跟随态旋转角度是否生效

userlocationStyle.isAccuracyCircleShow = NO;

//定位图标

userlocationStyle.locationViewImgName = [UIImage imageNamed:@"图标名称"];

//更新参样式信息

[_mapView updateLocationViewWithParam:userlocationStyle];

--------------------------------------------------------------------------------------------------------

(二)关于当前定位位置

首先,显示当前位置,百度地图提供了三种模式:

typedef enum {

BMKUserTrackingModeNone = 0, /// 普通定位模式

BMKUserTrackingModeFollow, /// 定位跟随模式

BMKUserTrackingModeFollowWithHeading, /// 定位罗盘模式

} BMKUserTrackingMode;

使用下面代码就能设置定位状态:

//设置定位的状态

_mapView.userTrackingMode = BMKUserTrackingModeNone;

普通定位模式没有问题,但是如果设置定位跟随或定位罗盘模式,运行app,你会发现定位点确实是对应的状态,但是当你拖动地图的时候,你就会发现后两种模式,又变回了普通定位模式.

我问了百度地图的工程师,他们说这是当前的策略...

所以我感觉设置跟随模式和罗盘模式没有什么卵用...

关于用户方向更新后的设置

如上面(一)所述,定位点可是设置样式参数,当你自定义了定位图标后,你会发现定位图标确实换为了自己定义的图标,而且当用户方向更新后,定位图标是回发生旋转的,但是当你点击触摸屏幕后,定位图标马上变为初始的情况,并且用户方向更新,定位图标不在发生变化.

对于这种情况,我想了一个办法,就是使用系统的定位,在地图界面添加一个方向的图标,

- (void)viewDidLoad {

//版本号

if ([[UIDevice currentDevice].systemVersion doubleValue] = 8.0) {

//主动请求权限

[self.mgr requestAlwaysAuthorization];

}

if ([[UIDevice currentDevice].systemVersion doubleValue] = 9) {

self.mgr.allowsBackgroundLocationUpdates = YES;

}

//对系统定位进行设置

self.mgr.delegate = self;

[self.mgr startUpdatingLocation];

//开始监听(开始获取位置)

[self.mgr startUpdatingHeading];

}

//pragma mark -用户方向更新后,会调用此函数

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {

// 将获取到的角度转为弧度 = (角度 * π) / 180;

CGFloat angle = newHeading.magneticHeading * M_PI / 180;

// 旋转图片

self.compasspointer.transform = CGAffineTransformMakeRotation(-angle);

}

//pragma mark - 懒加载

- (CLLocationManager *)mgr

{

if (!_mgr) {

_mgr = [[CLLocationManager alloc] init];

}

return _mgr;

}(四)关于app切换到后台产生的问题

当app切换到后台再切换回前台,`mapView`可能会产生黑屏的情况,此时只需在

`AppDelegate.m`中的`applicationWillResignActive:(UIApplication

*)application`和`applicationDidBecomeActive:(UIApplication

*)application`添加如下代码:

- (void)applicationWillResignActive:(UIApplication *)application {

//程序将要进入后台

[BMKMapView willBackGround];

}

- (void)applicationDidBecomeActive:(UIApplication *)application {

//程序进入前台

[BMKMapView didForeGround];

}

(五)关于BMKLocationServiceDelegate

设置定位的委托有如下两种方式:

- 方式1:

- (void)viewDidLoad {

[super viewDidLoad];

_mapView.delegate = self;

_locService.delegate = self;

}

-(void)viewWillDisappear:(BOOL)animated {

[super viewWillDisappear:animated];

_locService.delegate = nil;

}

- 方式2

-(void)viewWillDisappear:(BOOL)animated {

[super viewWillDisappear:animated];

_locService.delegate = nil;

}

- (void)viewWillAppear:(BOOL)animated {

[super viewWillAppear:animated];

_locService.delegate = self;

}

上面两种方式的区别:

果在viewDidLoad里写定位委托的话,加载完mapView后,定位当前位置是可以正常显示,并且可以随着位置的变化,定位点也随之发生变化.如

果切换到后台,然后再切换回mapView界面,定位点还是会变化.但是会产生一个问题,当点击别的tabbar,切换到别的界面后,再切换回

mapView界面,定位点就不再随着位置的变化而发生变化了.

如果采用方式2的话,就会避免这种问题.

ios百度地图怎么定位当前位置

iOS百度地图 定位的实现

今天发现自己好笨啊。。。一直在搞定位,想为什么会是空的,原来定位也是需要代理去实现的

在初始化地图的时候,也就是在viewDidload里面是这样的

[objc] view plain copy

mapView.showsUserLocation = YES;

if (mapView.userLocation.location != nil)

{

NSLog(@"定位成功");

coor = [[mapView.userLocation location] coordinate];

NSLog(@"%f",coor.latitude);

NSLog(@"%f",coor.longitude);

}

BMKCoordinateRegion viewRegion = BMKCoordinateRegionMake(coor, BMKCoordinateSpanMake(0.02f,0.02f));

BMKCoordinateRegion adjustedRegion = [mapView regionThatFits:viewRegion];

[mapView setRegion:adjustedRegion animated:YES];

一直以为是这样的呢,因为设定了showUserLocation 在去取到当前的userLocation就好了呢,这样做是不会立马就定位到的,它内部的实现是在子线程去定位,

然后通过代理方法去更新当前的用户位置的,好晕啊,仔细一找 ,就找到了这个更新用户当前位置的代理方法

[objc] view plain copy

/**

*用户位置更新后,会调用此函数

*@param mapView 地图View

*@param userLocation 新的用户位置

*/

- (void)mapView:(BMKMapView *)mapView didUpdateUserLocation:(BMKUserLocation *)userLocation;

那么就去实现它好了,这个时候应该是定位到了用户的位置了,也就是这个userLocation了

[objc] view plain copy

#pragma mark mapViewDelegate 代理方法

- (void)mapView:(BMKMapView *)mapView1 didUpdateUserLocation:(BMKUserLocation *)userLocation

{

BMKCoordinateRegion region;

region.center.latitude = userLocation.location.coordinate.latitude;

region.center.longitude = userLocation.location.coordinate.longitude;

region.span.latitudeDelta = 0.2;

region.span.longitudeDelta = 0.2;

if (mapView)

{

mapView.region = region;

NSLog(@"当前的坐标是: %f,%f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude);

}

}

总结

实现定位必须

1.初始化mapview

2.设置mapview的showUserLocation的属性为YES

3.去实现didUpdateUserLocation代理来实现当前位置显示在可视范围内

小知识的积累,定是大财富的源泉。虚心学习,每天进步一点点。


标题名称:ios开发地图定位,苹果app地图怎么定位
浏览地址:http://chengdu.cdxwcx.cn/article/dsggish.html