背景
原来的代码内都使用的高德地图的sdk进行实现地图功能,但老板觉得高德地图的卫星图zoom放大到很大的时候,地图不清晰了,没有资源了。
本着面向boss开发的思想,决定换用谷歌的资源,但是iOS的高德地图的sdk,不支持图层叠加谷歌的资源(安卓就可以,可以哭一会儿)。直接使用谷歌的sdk很麻烦,苹果自带的mkmapkit可以叠加很多的地图资源,包括谷歌的等等。
介绍
谷歌本身的地图资源就是高德的,本次学习,不单单介绍怎么替换谷歌的资源,包括整个MKMapKit的一些简单的使用。
大部分网上很容易查到的使用方法,我这里就一笔带过,主要是写一些,开发mkmapkit中遇到的坑,和高德sdk中不太一样的地方。
简单使用
初始化
为了方便统一处理地图的类,我创建了一个view专门用来放这个地图的view
_mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, self.width, self.height)];
//旋转
_mapView.rotateEnabled = NO;
//指南针
_mapView.showsCompass = YES;
//比例尺
_mapView.showsScale = NO;
//3D旋转
_mapView.rotateEnabled = NO;
_mapView.delegate = self;
[self addSubview:_mapView];
- MKMapView的 mapType 设置地图类型
- MKMapTypeStandard :普通地图(左图)
- MKMapTypeSatellite :卫星云图 (中图)
- MKMapTypeHybrid :混合模式(普通地图覆盖于卫星云图之上 )
- MKMapTypeSatelliteFlyover: 3D立体卫星 (iOS9.0)
- MKMapTypeHybridFlyover: 3D立体混合 (iOS9.0)
- 地图的其他属性
- 操作项:
- 是否可缩放 zoomEnabled
- 是否可滚动 scrollEnabled
- 是否可旋转 rotateEnabled
- 显示项:
- 是否显示指南针 showsCompass (iOS9.0)
- 是否显示比例尺 showsScale (iOS9.0)
- 是否显示交通 showsTraffic (iOS9.0)
- 是否显示建筑 showsBuildings
- 操作项:
委托代理
这样地图就添加进去了,比较重要的代理
* 对地图上面的点,进行设置的代理,后面包括聚合效果也会在这里实现
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
}
* 对地图上的线,和线围城的区域进行设置的代理
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(nonnull id<MKOverlay>)overlay
{
}
* 点击大头针的反馈
// 点击大头针反馈
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
}
其他
本文多介绍一种方法,是点击地图反馈方法。在原来高德的sdk中,有这种代理,但是在mkmapkit中没有,需要自己实现。
首先在
- (void)viewDidLoad
中增加点击事件的监听
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapReceived:)];
singleTap.numberOfTapsRequired = 1;
singleTap.delegate = self;
[self.mapView addGestureRecognizer:singleTap];
然后开始实现点击事件
需要进行经纬度转换
- (void)singleTapReceived:(UIGestureRecognizer*)gestureRecognizer
{
CGPoint touchPoint = [gestureRecognizer locationInView:self.mapView];
CLLocationCoordinate2D touchMapCoordinate = [self.mapView convertPoint:touchPoint toCoordinateFromView:self.mapView];
// 得到点击后的经纬度地址,然后去执行下面的操作
}