当前位置:首页 > 北京头条 > 北京经验

苹果地图(MKmap)

2024-04-17 13:45:38 来源:163健康
浏览量:

1.基本调用

导入mapkit framework

import <mapkit/mapkit.h>

new MKMapView *_mapview

xib mapview -> mapview

2.定位

  1. 获取地理位置

if([CLLocationManager locationServicesEnabled]){//定位功能开启的情况下进行定位_manager = [[CLLocationManager alloc] init];_manager.distanceFilter = kCLDistanceFilterNone;//距离筛选器,单位米(移动多少米才回调更新)_manager.desiredAccuracy = kCLLocationAccuracyBest; //精确度[_manager setDelegate:self];[_manager startUpdatingLocation];}

pragma mark – CLLocationManagerDelegate

//成功回调

  • (void)locationManager:(CLLocationManager *)managerdidUpdateToLocation:(CLLocation *)newLocationfromLocation:(CLLocation *)oldLocation//失败回调
  • (void)locationManager:(CLLocationManager *)managerdidFailWithError:(NSError *)error注意:

主线程调用

多次校准更精确

2)定位地理位置

CLLocationCoordinate2D location=CLLocationCoordinate2DMake(_latitude, _longitude);

MKCoordinateRegion region=MKCoordinateRegionMakeWithDistance(location, DEFAULTSPAN ,DEFAULTSPAN );MKCoordinateRegion adjustedRegion = [_mapView regionThatFits:region];[_mapView setRegion:adjustedRegion animated:YES];3)获得附近的信息

  • (void)fetchNearbyInfo{CLLocationDegrees latitude=116.13554;CLLocationDegrees longitude=38.413546;CLLocationCoordinate2D location=CLLocationCoordinate2DMake(latitude, longitude);

    MKCoordinateRegion region=MKCoordinateRegionMakeWithDistance(location, DEFAULTSPAN ,DEFAULTSPAN );

    MKLocalSearchRequest *requst = [[MKLocalSearchRequest alloc] init];requst.region = region;requst.naturalLanguageQuery = @"place"; //想要的信息MKLocalSearch *localSearch = [[MKLocalSearch alloc] initWithRequest:requst];

    [localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error){if (!error){[_nearbyInfoArray addObjectsFromArray:response.mapItems];//}else{//}}];

    1. naturalLanguageQuery 大家可以看到

    requst.naturalLanguageQuery = @"place"; //想要的信息这一句很重要,因为他要是一个NSString类型的字符串,但是往往不知道应该赋值什么,其实我试过了,只要是你能想到的英语单词(地面)几乎都能显示出来,如:

    医院:hospital

    旅馆:hotel

    小区:village

    学校:school

    这些都可以获得你想要的信息,当然你如果想要全部类型的可以使用place(我试了很多,发现这个最合适)

    2.苹果提供的这个接口,一次只会返回固定的10个数组,如果你有需求要获得多个的话,建议使用不同naturalLanguageQuery获得多次请求后将其拼组在一起(有什么好的办法,也求大神们评论告诉我)

    3.除了苹果地图提供这个接口外还有其他的地图也能获得,可以使用http协议获得,如:

    google接口:

http://maps.googleapis.com/maps/api/place/nearbysearch/json?location=%f,%f&language=en&radius=1000&sensor=false&key=%@

百度接口:

http://api.map.baidu.com/place/v2/search?&query=%@&location=%f,%f&radius=2000&output=json&ak=%@

具体使用方法,请参考官方文档,这里我就不介绍了。3.打点1.基本点void)addAnnotation:(id <MKAnnotation>)annotation;- (void)addAnnotations:(NSArray *)annotations;@protocol MKAnnotation <NSObject>// Center latitude and longitude of the annotion view.// The implementation of this property must be KVO compliant.@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;@optional// Title and subtitle for use by selection UI.@property (nonatomic, readonly, copy) NSString *title;@property (nonatomic, readonly, copy) NSString *subtitle;// Called as a result of dragging an annotation view.- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate NS_AVAILABLE(10_9, 4_0);@end头文件定义@interface CalloutMapAnnotation : NSObject <MKAnnotation>@property (nonatomic) CLLocationDegrees latitude;@property (nonatomic) CLLocationDegrees longitude;@property(nonatomic, copy) NSString *title;@property(nonatomic, copy) NSString *subtitle;@end2.冒泡(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view {    if ([view.annotation isKindOfClass:[REVClusterPin class]]) {        if (_calloutAnnotation && _calloutAnnotation.coordinate.latitude == view.annotation.coordinate.latitude&&            _calloutAnnotation.coordinate.longitude == view.annotation.coordinate.longitude) {            return;        }        if (_calloutAnnotation) {            [mapView removeAnnotation:_calloutAnnotation];            _calloutAnnotation = nil;        }        _calloutAnnotation = [[CalloutMapAnnotation alloc]                              initWithLatitude:view.annotation.coordinate.latitude                              andLongitude:view.annotation.coordinate.longitude];        _calloutAnnotation.title = view.annotation.title;        [mapView addAnnotation:_calloutAnnotation];    }}- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view {    if (_calloutAnnotation && ![view isKindOfClass:[CallOutAnnotationView class]] && !_isShowLevelMood) {        if (_calloutAnnotation.coordinate.latitude == view.annotation.coordinate.latitude&&            _calloutAnnotation.coordinate.longitude == view.annotation.coordinate.longitude) {            CalloutMapAnnotation *oldAnnotation = _calloutAnnotation;            _calloutAnnotation = nil;            dispatch_async(dispatch_get_main_queue(), ^{                [mapView removeAnnotation:oldAnnotation];            });        }    }}- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {    if ([annotation isKindOfClass:[CalloutMapAnnotation class]]) {        CallOutAnnotationView *annotationView = (CallOutAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CalloutView"];        if (!annotationView) {            annotationView = [[CallOutAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"CalloutView"];            JingDianMapCell  *cell = [[[NSBundle mainBundle] loadNibNamed:@"JingDianMapCell" owner:self options:nil] objectAtIndex:0];            [annotationView.contentView addSubview:cell];                    }    }}注:轮播冒泡只需要遍历点逐个select就行4.聚合聚合使用了第三方库REVClusterMap,原理:在- (void) mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated中,进行计算:排除屏幕外的点画出4*4的宫格块遍历所有点,将点add到某个宫格的数组中给出每个宫格中点的平均位置