使用MapKit我应该使用Directions还是制作自己的路线叠加层?

时间:2015-12-03 10:48:31

标签: iphone swift mapkit mkoverlay directions

我是任何编程的绝对初学者,但我正在尝试通过使用MapKit创建一个在地图上显示(我的!)路线的iOS应用程序来学习。沿途有注释和特定信息。

我有两个问题。

  1. 更好/更容易,尝试在注释之间使用MapKit方向,以便MapKit在路上显示路径(我想要)(我必须在每个注释之间获取路线,否则路线不会总是如此)我要展示的那个!)或以某种方式制作我的路线的叠加图像并使用它?

  2. 如果最好使用叠加层,我如何制作叠层并确保它位于正确的位置并放大和缩小?

  3. 我找到了很多关于如何添加叠加层的教程,但似乎找不到有关如何制作可在应用中使用的教程。

1 个答案:

答案 0 :(得分:0)

在地图上设置图像是实现此功能的不良方法。对于路径绘图,Apple提供了MKPolyline。这将关注你对缩放系数保持其位置的所有关注。

请查看以下有关折线绘图的信息

iPhone: How to draw line between two points on MapKit?

http://pinkstone.co.uk/how-to-draw-an-mkpolyline-on-a-map-view/

最终,您的目标将是以某种方式通过内置方向API或像Google Direction API这样的第三方面获得Lat-long中间位置。

枚举这些位置并在地图上绘制折线。如果您将来尝试使用Google地图,那么相同的逻辑和事情就会存在。只是Mehtods和Classes将被更改。

- (void)drawLine {

    // remove polyline if one exists
    [self.mapView removeOverlay:self.polyline];

    // create an array of coordinates from allPins
    CLLocationCoordinate2D coordinates[self.allPins.count];
    int i = 0;
    for (Pin *currentPin in self.allPins) {
        coordinates[i] = currentPin.coordinate;
        i++;
    }

    // create a polyline with all cooridnates
    MKPolyline *polyline = [MKPolyline polylineWithCoordinates:coordinates count:self.allPins.count];
    [self.mapView addOverlay:polyline];
    self.polyline = polyline;

    // create an MKPolylineView and add it to the map view
    self.lineView = [[MKPolylineView alloc]initWithPolyline:self.polyline];
    self.lineView.strokeColor = [UIColor redColor];
    self.lineView.lineWidth = 5;

}

修改

如果您希望使用GOOGLE API和GOOGLE地图

-(void)drawPathFrom:(CLLocation*)source toDestination:(CLLocation*)destination{    

    NSString *baseUrl = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/directions/json?origin=%f,%f&destination=%f,%f&sensor=true", source.coordinate.latitude,  source.coordinate.longitude, destination.coordinate.latitude,  destination.coordinate.longitude];

    NSURL *url = [NSURL URLWithString:[baseUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    NSLog(@"Url: %@", url);
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        if(!connectionError){
            NSDictionary *result        = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
            NSArray *routes             = [result objectForKey:@"routes"];
            if([routes isKindOfClass:[NSArray class]] && routes.count>0){
                NSDictionary *firstRoute    = [routes objectAtIndex:0];
                NSString *encodedPath       = [firstRoute[@"overview_polyline"] objectForKey:@"points"];

                GMSPolyline *polyPath       =  [GMSPolyline polylineWithPath:[GMSPath pathFromEncodedPath:encodedPath]];
                polyPath.strokeColor        = [UIColor blueColor];
                polyPath.strokeWidth        = 3.5f;
                polyPath.map                = _mapView;

            }
        }
    }];

}