IOS开发中地图实现国内高德地图、国外Google地图逻辑

App需求如下:
1,App连接蓝牙设备,此时App端开始记录GPS位置信息;
2,App蓝牙连接断开,此时App端统计GPS位置轨迹,并绘制在地图上显示

使用2种地图原因:高德地图国外显示不了、Google地图国内显示不了
注:还有一个原因是因为通过手机系统SDK获取得到的GPS位置有偏移
系统SDK得到的位置为国际标准WGS-84
国内的位置标准为GCJ-02(火星坐标)

由于业务需求,我在App启动的时候,就做了判断当前位置是否在国内,然后统计数据保存一个(国内、外)状态至数据库。
逻辑如下:
1,App启动,使用CLLocationManager获取到location
2,使用CLGeocoder *geocoder = [[CLGeocoder alloc] init];

[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        BOOL isChina = NO;
        if (placemarks.count > 0) {
            CLPlacemark * placemark = placemarks[0];
            //通过该判断是为CN,还有HK,TW等,自行判断吧
            isChina = [placemark.ISOcountryCode isEqualToString:@"CN"];
        }        
    }];

3,当isChina为YES时,使用高德地图来获取位置更新
当isChina为NO时,使用系统SDK来获取位置更新
(代码就不贴粗来了,应该难不到谁吧?)
4,这个时候就是贴代码的时候了【Google地图轨迹绘制】

        //默认显示【北京】也可以不设置默认
        GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:39.7072013727
                                                                longitude:116.5429835110
                                                                     zoom:12];
        _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
   //创建轨迹路径集合
   GMSMutablePath *path = [GMSMutablePath path];
    for(MALocationModel *m in locations){
        [path addLatitude:m.latitude longitude:m.longitude];        
    }
    //轨迹线图对象
    _polyline = [GMSPolyline polylineWithPath:path];
    _polyline.strokeWidth = 5;
    _polyline.map = _mapView;
    //设置地图轨迹屏幕可视区域
    GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] initWithPath:path];
    GMSCameraPosition *position = [_mapView cameraForBounds:bounds insets:UIEdgeInsetsZero];
    _mapView.camera = position;

到了这里,地图轨迹基本就出来了(上面insets:UIEdgeInsetsZero可以自行设置)。
4.1添加起点图标【自定义View】

    CLLocationCoordinate2D position_start = CLLocationCoordinate2DMake(latitude,longitude);
    GMSMarker *start = [GMSMarker markerWithPosition:position_start];
    start.title = nil;
    start.icon = [UIImage imageNamed:@"record_map_start_icon"];
    start.map = _mapView;

注意问题:有可能轨迹地图显示的zoomlevel需要手动调整下
[_mapView animateToZoom:[self levelWithMileage:10]];【如下】


image.png

5,高德地图轨迹绘制【上代码】

self.mapView = [[MAMapView alloc] initWithFrame:self.bounds];
        self.mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        self.mapView.delegate = self;
        self.mapView.showsCompass = NO;
        self.mapView.showsScale = NO;
        self.mapView.zoomLevel = 17;
//显示轨迹
-(void)showDefaultMap
{
    NSMutableArray *arr = [NSMutableArray array];
    for(MALocationModel *m in self.recordInfo.locations){
        MATracePoint *point = [[MATracePoint alloc] init];
        point.latitude = m.latitude;
        point.longitude = m.longitude;
        [arr addObject:point];
    }
    
    CLLocationCoordinate2D start = CLLocationCoordinate2DMake(((MATracePoint *)[arr firstObject]).latitude, ((MATracePoint *)[arr firstObject]).longitude);
    CLLocationCoordinate2D end = CLLocationCoordinate2DMake(((MATracePoint *)[arr lastObject]).latitude, ((MATracePoint *)[arr lastObject]).longitude);
    
    [self addAnnotationWithCooordinate:start title:@"start"];
    [self addAnnotationWithCooordinate:end title:@"end"];
    
    self.processedOverlays = [NSMutableArray array];
    [self addFullTrace:arr toMapView:self.mapView];
}

//添加图标
-(void)addAnnotationWithCooordinate:(CLLocationCoordinate2D)coordinate title:(NSString *)title
{
    MAPointAnnotation *annotation = [[MAPointAnnotation alloc] init];
    annotation.coordinate = coordinate;
    annotation.title    = title;
    annotation.subtitle = @"CustomAnnotationView2";
    
    [self.mapView addAnnotation:annotation];
}



- (void)addFullTrace:(NSArray<MATracePoint*> *)tracePoints toMapView:(MAMapView *)mapView
{
    [self.mapView hiddenHUD];
    
    //此类用于定义一个由多个点相连的多段线
    MAMultiPolyline *polyline = [self makePolyLineWith:tracePoints];
    if(!polyline) {
        return;
    }
    
    [self.processedOverlays addObject:polyline];
    [mapView addOverlays:self.processedOverlays];
    
    UIEdgeInsets edge = UIEdgeInsetsMake(20, 20, 20, 20);
    if (_showSetting) {
        edge = UIEdgeInsetsMake(50, 30, 50, 30);
    }
    [mapView setVisibleMapRect:polyline.boundingMapRect edgePadding:edge animated:NO];
    
    [mapView setZoomLevel:[self levelWithMileage:self.recordInfo.distance/1000.f] animated:NO];
}

//划线
- (MAMultiPolyline *)makePolyLineWith:(NSArray<MATracePoint*> *)tracePoints {
    if(tracePoints.count == 0) {
        return nil;
    }
    CLLocationCoordinate2D *pCoords = malloc(sizeof(CLLocationCoordinate2D) * tracePoints.count);
    if(!pCoords) {
        return nil;
    }
    for(int i = 0; i < tracePoints.count; ++i) {
        MATracePoint *p = [tracePoints objectAtIndex:i];
        CLLocationCoordinate2D *pCur = pCoords + i;
        pCur->latitude = p.latitude;
        pCur->longitude = p.longitude;
    }
    //分段绘制,根据经纬度坐标数据生成多段线
    MAMultiPolyline *polyline = [MAMultiPolyline polylineWithCoordinates:pCoords count:tracePoints.count drawStyleIndexes:@[@10, @60]];
    if(pCoords) {
        free(pCoords);
    }
    return polyline;
}

//绘制覆盖物
#pragma mark - MAMapViewDelegate
- (MAOverlayRenderer *)mapView:(MAMapView *)mapView rendererForOverlay:(id <MAOverlay>)overlay
{
    if ([overlay isKindOfClass:[MAMultiPolyline class]])
    {
        MAPolylineRenderer *polylineView = [[MAPolylineRenderer alloc] initWithPolyline:(MAPolyline *)overlay];
        
        polylineView.lineWidth   = 6.f;
        polylineView.strokeColor = RGB(0, 182, 249);
        //路线填充图片
        polylineView.strokeImage = [UIImage imageNamed:@"icon_map_arrow"];
        polylineView.lineJoinType = kCGLineJoinRound;//连接类型
        polylineView.lineCapType = kCGLineCapRound;//端点类型
        
        
        return polylineView;
    }
    
    return nil;
}

- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MAPointAnnotation class]]) {
        static NSString *ident = @"pointIdent";
        MAAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:ident];
        
        if (annotationView == nil)
        {
            annotationView = [[MAAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ident];
            // must set to NO, so we can show the custom callout view.
            annotationView.canShowCallout = NO;
            annotationView.draggable = YES;
        }
        
        if ([annotation.title isEqualToString:@"start"]) {
            annotationView.image = [UIImage imageNamed:@"record_map_start_icon"];
        }else if ([annotation.title isEqualToString:@"end"]){
            annotationView.image = [UIImage imageNamed:@"record_map_end_icon"];
        }
        
        return annotationView;
    }
    return nil;
}


-(int)levelWithMileage:(CGFloat)mileage
{
    int level = 15;
    if (mileage > 1000) {
        level = 3;
    }else if (mileage > 500){
        level = 4;
    }else if (mileage > 200){
        level = 5;
    }else if (mileage > 100){
        level = 6;
    }else if (mileage > 50){
        level = 7;
    }else if (mileage > 30){
        level = 8;
    }else if (mileage > 20){
        level = 9;
    }else if (mileage > 10){
        level = 10;
    }else if (mileage > 5){
        level = 11;
    }else if (mileage > 1){
        level = 13;
    }else{
        level = 14;
    }
    
    return level;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容