苹果地图(MKmap)
1.基本调用
导入mapkit framework
import <mapkit/mapkit.h>
new MKMapView *_mapview
xib mapview -> mapview
2.定位
- 获取地理位置
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{//}}];
- 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到某个宫格的数组中给出每个宫格中点的平均位置