苹果地图(MapKit)总结


1.基本调用

  1. 导入mapkit framework

  2. #import <mapkit/mapkit.h>

  3. new MKMapView *_mapview

  4. 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 *)manager
 didUpdateToLocation:(CLLocation *)newLocation
       fromLocation:(CLLocation *)oldLocation
//失败回调
- (void)locationManager:(CLLocationManager *)manager
       didFailWithError:(NSError *)error

注意:

  1. 主线程调用

  2. 多次校准更精确

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接口:

https://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;
 
@end

2.冒泡

(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中,进行计算:

  1. 排除屏幕外的点

  2. 画出4*4的宫格块

  3. 遍历所有点,将点add到某个宫格的数组中

  4. 给出每个宫格中点的平均位置

苹果地图(MapKit)总结

你可能感兴趣的:(注释,聚合,地图,overlay,MapView,MapKit,打点)