zoukankan      html  css  js  c++  java
  • IOS开发中绘制地图线路

    地图应用经常会涉及到线路的绘制问题,ios下可以使用MKMapView进行地图开发,使用

    MKOverlayView进行线路的绘制。

    使用MKMapView添加MKMap.framework 和CoreLocation.framework并导入

    MapKit.h头文件。

    新建一个基于视图的工程,修改头文件:

     

    1 #import <UIKit/UIKit.h>  
    2 #import <MapKit/MapKit.h>  
    3 #import "CloMKAnnotation.h"  
    4 @interface CloViewController : UIViewController<CLLocationManagerDelegate, MKMapViewDelegate, UIActionSheetDelegate>{  
    5     MKMapView *cloMapView;  
    6     MKPolyline *routeLine;  
    7 }  
    8   
    9 @property (nonatomic, strong)  NSMutableArray *locations;  

    修改实现代码,在.m中添加如下代码:

      1 #import "CloViewController.h"  
      2   
      3 @interface CloViewController ()  
      4   
      5 @end  
      6   
      7 @implementation CloViewController  
      8 @synthesize locations;  
      9   
     10 - (void)viewDidLoad  
     11 {  
     12     [super viewDidLoad];  
     13     // Do any additional setup after loading the view, typically from a nib.  
     14     cloMapView = [[MKMapView alloc] initWithFrame:[self.view bounds]];  
     15     [cloMapView setMapType:MKMapTypeHybrid];  //设置地图类型 地图/卫星/两者结合  
     16     [cloMapView setShowsUserLocation:YES];      //显示当前位置  
     17     [cloMapView setDelegate:self];  
     18       
     19     CLLocationManager *locationManager = [[CLLocationManager alloc] init];  
     20     //设置CLLocationManager实例委托和精度  
     21     [locationManager setDelegate:self];  
     22     [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];  
     23     //设置距离筛选器,表示至少移动100米才通知委托更新  
     24     [locationManager setDistanceFilter:100.f];  
     25     //启动更新请求  
     26 //    [locationManager startUpdatingLocation];  
     27       
     28     locations = [[NSMutableArray alloc] init];  
     29     float latitude = 39.8127;    //维度  
     30     float longitude = 116.2967;  //经度  
     31     for (int i = 0; i < 10; i++) {  
     32           
     33         [locations addObject:[NSString stringWithFormat:@"%f,%f", latitude + 0.01*i, longitude + 0.01*i]];  
     34 //            NSLog(@"locations:%i",locations.count);  
     35     }  
     36       
     37     //地图初始  
     38     CLLocationCoordinate2D coords;  
     39     coords.latitude = 39.9127;  
     40     coords.longitude = 116.3967;  
     41     float zoomlevel = 0.22;  
     42     MKCoordinateRegion region = MKCoordinateRegionMake(coords, MKCoordinateSpanMake(zoomlevel, zoomlevel));  
     43     [cloMapView setRegion:[cloMapView regionThatFits:region] animated:YES];  
     44       
     45     [cloMapView addOverlay:[self makePolylineWithLocations:locations]];  
     46     [self.view addSubview:cloMapView];  
     47       
     48 }  
     49   
     50 - (void)viewDidUnload  
     51 {  
     52     [super viewDidUnload];  
     53     // Release any retained subviews of the main view.  
     54     cloMapView = nil;  
     55 }  
     56   
     57 - (void)dealloc{  
     58     [cloMapView release];  
     59     [super dealloc];  
     60 }  
     61   
     62 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
     63 {  
     64     return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);  
     65 }  
     66   
     67   
     68 //显示菜单选项  
     69 - (void)showActionSheet :(id)sender{  
     70     UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:nil   
     71                                                               delegate:self   
     72                                                      cancelButtonTitle:@"取消"  
     73                                                 destructiveButtonTitle:@"添加足迹"  
     74                                                      otherButtonTitles:@"分享",@"详细",@"删除", nil];  
     75     [actionSheet setDelegate:self];  
     76     [actionSheet showInView:self.view];  
     77     [actionSheet release];  
     78 }  
     79   
     80 //根据坐标点生成线路  
     81 - (MKPolyline *)makePolylineWithLocations:(NSMutableArray *)newLocations{  
     82     MKMapPoint *pointArray = malloc(sizeof(CLLocationCoordinate2D)* newLocations.count);  
     83     for(int i = 0; i < newLocations.count; i++)    
     84     {    
     85         // break the string down even further to latitude and longitude fields.     
     86         NSString* currentPointString = [newLocations objectAtIndex:i];    
     87         NSArray* latLonArr = [currentPointString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@","]];  
     88         CLLocationDegrees latitude  = [[latLonArr objectAtIndex:0] doubleValue];    
     89         //        NSLog(@"latitude-> %f", latitude);  
     90         CLLocationDegrees longitude = [[latLonArr objectAtIndex:1] doubleValue];    
     91         CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude);    
     92         //        NSLog(@"point-> %f", point.x);  
     93           
     94         if (i == 0 || i == locations.count - 1) {//这里只添加起点和终点作为测试  
     95             CloMKAnnotation *ann = [[CloMKAnnotation alloc] init];  
     96             [ann setCoordinate:coordinate];  
     97             [ann setTitle:[NSString stringWithFormat:@"纬度:%f", latitude]];  
     98             [ann setSubtitle:[NSString stringWithFormat:@"经度:%f", longitude]];  
     99             [cloMapView addAnnotation:ann];  
    100         }  
    101         pointArray[i] = MKMapPointForCoordinate(coordinate);  
    102     }    
    103       
    104     routeLine = [MKPolyline polylineWithPoints:pointArray count:newLocations.count];  
    105     free(pointArray);  
    106     return routeLine;  
    107 }  
    108 #pragma mark-  
    109 #pragma CLLocationManager delegate method  
    110 //位置变化后会调用  
    111 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{  
    112     //可在此处更新用户位置信息  
    113 //    cloMapView.userLocation  
    114     NSLog(@"oldLocation:%@", [oldLocation description]);  
    115     NSLog(@"newLocation:%@", [newLocation description]);  
    116     NSLog(@"distance:%@", [newLocation distanceFromLocation:oldLocation]);  
    117     //位置变化添加新位置点  
    118     [locations addObject:[NSString stringWithFormat:@"%f,%f", newLocation.coordinate.latitude, newLocation.coordinate.longitude]];  
    119     //删除进线路,更新新轨迹  
    120     [cloMapView removeOverlay:routeLine];  
    121     [cloMapView addOverlay:[self makePolylineWithLocations:locations]];  
    122   
    123 }  
    124   
    125 #pragma MKMapView delegate method  
    126 //添加坐标点大头针  
    127 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{  
    128     if (![annotation isKindOfClass:[CloMKAnnotation class]]) {  
    129         return nil;  
    130     }  
    131     static NSString *identifier = @"Annotation";  
    132     MKPinAnnotationView *pinAnnotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];  
    133     if (pinAnnotationView == nil) {  
    134         pinAnnotationView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier] autorelease];  
    135     }  
    136     pinAnnotationView.animatesDrop = YES;  
    137     pinAnnotationView.canShowCallout = YES;  
    138     pinAnnotationView.draggable = YES;  
    139     UIButton *detailBtn = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];  
    140     [detailBtn addTarget:self action:@selector(showActionSheet:) forControlEvents:UIControlEventTouchUpInside];  
    141     pinAnnotationView.rightCalloutAccessoryView = detailBtn;  
    142       
    143     return pinAnnotationView;  
    144 }  
    145   
    146 - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view didChangeDragState:(MKAnnotationViewDragState)newState fromOldState:(MKAnnotationViewDragState)oldState{  
    147       
    148 }  
    149   
    150 //画线  
    151 - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay{  
    152     NSLog(@"return overLayView...");  
    153     if ([overlay isKindOfClass:[MKPolyline class]]) {  
    154         MKPolylineView *routeLineView = [[[MKPolylineView alloc] initWithPolyline:routeLine] autorelease];  
    155         routeLineView.strokeColor = [UIColor blueColor];  
    156         routeLineView.lineWidth = 3;  
    157         return routeLineView;  
    158     }  
    159     return nil;  
    160 }  
    161   
    162 @end  

    这里主要是为了测试,初始时 locations坐标点自定义的,实际中是根据用户的位置动态生成的一系列坐标点。具体可在下面方法中实现

    1 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

    另外用户的实时位置可用

    1 cloMapView.userLocation = newLocation进行设置,然后显示在地图上。

    运行效果

  • 相关阅读:
    LeetCode 230. 二叉搜索树中第K小的元素(Kth Smallest Element in a BST)
    LeetCode 216. 组合总和 III(Combination Sum III)
    LeetCode 179. 最大数(Largest Number)
    LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)
    LeetCode 114. 二叉树展开为链表(Flatten Binary Tree to Linked List)
    LeetCode 106. 从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inorder and Postorder Traversal)
    指针变量、普通变量、内存和地址的全面对比
    MiZ702学习笔记8——让MiZ702变身PC的方法
    你可能不知道的,定义,声明,初始化
    原创zynq文章整理(MiZ702教程+例程)
  • 原文地址:https://www.cnblogs.com/myios/p/3718547.html
Copyright © 2011-2022 走看看