美文网首页程序员
iOS原生地图,模拟飞行器时时定位,画出飞行轨迹!

iOS原生地图,模拟飞行器时时定位,画出飞行轨迹!

作者: shyizne | 来源:发表于2017-04-26 15:28 被阅读0次

    什么都不说先上效果图:

    1.导入地图所需的MapKit架包

    2.创建位置管理器,请求授权

    self.mgr= [CLLocationManagernew];

    if([self.mgrrespondsToSelector:@selector(requestWhenInUseAuthorization)]) {

    [self.mgrrequestWhenInUseAuthorization];

    }

    3.设置三种模式的地图

    switch(sender.selectedSegmentIndex) {

    case0:

    self.myMapView.mapType=MKMapTypeStandard;

    break;

    case1:

    self.myMapView.mapType=MKMapTypeSatellite;

    break;

    case2:

    self.myMapView.mapType=MKMapTypeHybrid;

    break;

    default:

    break;

    }

    4.封装大头针类

    +(instancetype)myMKAnnotationViewWithMapView:(MKMapView*)mapView{

    staticNSString*ID =@"datouzhen";

    MyMKAnnotationView*annoView = (MyMKAnnotationView*)[mapViewdequeueReusableAnnotationViewWithIdentifier:ID];

    if(annoView ==nil) {

    annoView = [[MyMKAnnotationViewalloc]initWithAnnotation:nilreuseIdentifier:ID];

    annoView.image= [UIImageimageNamed:@"飞行器"];

    annoView.canShowCallout=true;

    }

    returnannoView;

    }

    5.设置大头针以及大头针飞行时的动画,和规划路线

    -(void)mapView:(MKMapView*)mapView didAddAnnotationViews:(NSArray *)views{

    for(MKAnnotationView*annoViewinviews) {

    //1.记录原本的位置

    if([annoView.annotationisKindOfClass:[MKUserLocationclass]]) {

    return;

    }

    CGRectendFrame = annoView.frame;

    //2.设置起点

    if(self.annotaArray.count==0) {

    annoView.frame=CGRectMake(annoView.frame.origin.x, annoView.frame.origin.y, endFrame.size.width, endFrame.size.height);

    }else{

    XYAnnotationXY*XY =self.annotaArray.lastObject;

    annoView.frame=CGRectMake(XY.x, XY.y, endFrame.size.width, endFrame.size.height);

    }

    //3.将位置还原

    [UIViewanimateWithDuration:0.2animations:^{

    annoView.frame= endFrame;

    if(self.sportLineArray.count>1){

    NSLog(@"%lu",(unsignedlong)self.sportLineArray.count);

    //[self drawSportLineLocationArray:self.sportLineArray];

    [selfdrawLineWithLocationArray:self.sportLineArray];

    }

    }];

    }

    }

    6.采用用手点击,来模拟飞行器飞行时的位置,反编码获取点。

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event{

    //1.获取点击的这个点

    CGPointpoint = [[touchesanyObject]locationInView:self.myMapView];

    XYAnnotationXY*anniXY = [XYAnnotationXYnew];

    anniXY.x= point.x;

    anniXY.y= point.y;

    if(self.annotaArray.count==2) {

    [self.annotaArrayremoveLastObject];

    [self.annotaArrayinsertObject:anniXYatIndex:0];

    }

    if(self.annotaArray.count==1) {

    [self.annotaArrayinsertObject:anniXYatIndex:0];

    }

    if(self.annotaArray.count==0) {

    [self.annotaArrayaddObject:anniXY];

    }

    //2.将点转化成经纬度

    CLLocationCoordinate2DCoordinate = [self.myMapViewconvertPoint:pointtoCoordinateFromView:self.myMapView];

    MyAnnotationModel*annotationModel = [MyAnnotationModelnew];

    annotationModel.coordinate= Coordinate;

    CLGeocoder*geocoder = [CLGeocodernew];

    CLLocation*location = [[CLLocationalloc]initWithLatitude:Coordinate.latitudelongitude:Coordinate.longitude];

    if(self.sportLineArray.count==0) {

    [self.sportLineArrayaddObject:location];

    }elseif(self.sportLineArray.count==1){

    [self.sportLineArrayaddObject:location];

    }elseif(self.sportLineArray.count==2){

    [self.sportLineArrayremoveObjectAtIndex:0];

    [self.sportLineArrayaddObject:location];

    }

    [geocoderreverseGeocodeLocation:locationcompletionHandler:^(NSArray *_Nullableplacemarks,NSError*_Nullableerror) {

    if(placemarks==0||error) {

    return;

    }

    CLPlacemark*placemark = [placemarkslastObject];

    annotationModel.title= placemark.locality;

    annotationModel.subtitle= placemark.name;

    }];

    for(id annotataion2inself.myMapView.annotations) {

    if([annotataion2isKindOfClass: annotationModel.class]) {

    [self.myMapViewremoveAnnotation:annotataion2];

    }

    }

    [self.myMapViewaddAnnotation:annotationModel];

    }

    7.规划路线

    -(void)drawLineWithLocationArray:(NSArray*)sportLineArray{

    intpointCount = (int)sportLineArray.count;

    CLLocationCoordinate2D*coordinateArray = (CLLocationCoordinate2D*)malloc(pointCount *sizeof(CLLocationCoordinate2D));

    for(inti = pointCount-2; i < pointCount; ++i) {

    CLLocation*location = [sportLineArrayobjectAtIndex:i-pointCount+2];

    coordinateArray[i-pointCount+2] = [locationcoordinate];

    }

    self.sportPolyline= [MKPolylinepolylineWithCoordinates:coordinateArraycount:2];

    //跟踪画图

    //[self.myMapView setVisibleMapRect:[self.sportPolyline boundingMapRect]];

    [self.myMapViewaddOverlay:self.sportPolyline];

    free(coordinateArray);

    coordinateArray =NULL;

    }

    8.设置遮盖物,渲染。

    - (MKOverlayRenderer*)mapView:(MKMapView*)mapView rendererForOverlay:(id)overlay{

    MKPolylineRenderer*render = [[MKPolylineRendereralloc]initWithPolyline:overlay];

    if([overlayisKindOfClass:[self.sportPolylineclass]]) {

    render.lineWidth=3;

    render.strokeColor= [UIColoryellowColor];

    }

    returnrender;

    }

    相关文章

      网友评论

        本文标题:iOS原生地图,模拟飞行器时时定位,画出飞行轨迹!

        本文链接:https://www.haomeiwen.com/subject/vdwizttx.html