谷歌地图折线不完美渲染

12

我正在使用最新的Google Maps API for iOS绘制折线。我正在逐点构建折线,但当我缩小地图时,折线从地图中消失(不是字面意义上的消失),而当我放大时,它只会显示直线。

Zoomed in view 这是缩放后折线的样子

Zoomed out view 这是缩放前折线的样子

以下是我的绘制折线的函数:

RCPolyline *polyline = [[RCPolyline alloc] init];
[polyline drawPolylineFromPoint:self.selectedEmployee.location toPoint:location];

我已经重写了RCPolyline的init:方法,使其类似于这样

- (instancetype)init {
self = [super init];
if (self) {
    self.strokeWidth = 5.0f;
    self.strokeColor = UIColor.redColor;
    self.geodesic = YES;
    self.map = [RCMapView sharedMapView];
}
return self;}

drawPolylineFromPoint:toPoint:就是这样实现的

 - (void)drawPolylineFromPoint:(CLLocation *)pointX toPoint:(CLLocation *)pointY {
      GMSMutablePath *path = [GMSMutablePath path];
      [path addCoordinate:pointX.coordinate];
      [path addCoordinate:pointY.coordinate];
      self.path = path;} 

我猜你的折线路径数据太多了。 - wf9a5m75
@wf9a5m75 这与此有什么关系? - Nitish Makhija
绘制路径点会占用内存。点越多,Google Maps SDK for iOS 使用的内存就越多。我想这就是原因。 为了减少路径点数,您可以对其进行编码。 在这里查看 https://dev59.com/Kovda4cB1Zd3GeqPViZB - wf9a5m75
@wf9a5m75 我解决了我的问题,并提供了答案,包括我犯错的地方,但还是感谢你的建议。 - Nitish Makhija
2个回答

4
我找到了问题所在,我之前创建了 RCPolyline 类的本地实例并从中调用构建折线的方法,但我的目的是要创建一个全局对象来存储 RCPolyline 实例并更新该实例的 GMSPath

类似这样:

- (instancetype)initWithMap:(GMSMapView *)mapView {
    self = [super init];
    if (self) {
      self.strokeWidth = 4.0f;
      self.strokeColor = [UIColor redColor];
      self.geodesic = YES;
      self.map = mapView;
      self.mutablePath = [GMSMutablePath path];
    }
      return self;}

现在我正在从同一实例中调用此方法。

- (void)appendPolylineWithCoordinate:(CLLocation *)location {
    [self.mutablePath addCoordinate:location.coordinate];
    self.path = self.mutablePath;}

PS: RCPolylineGMSPolyline的子类。


-1

试试这段代码。

- (void)fetchPolylineWithOrigin:(CLLocation *)origin destination:(CLLocation *)destination {

    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:lat longitude:longg zoom:12];
    GMSMapView *mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
    mapView.myLocationEnabled = YES;
    self.view = mapView;
    GMSMarker *marker = [[GMSMarker alloc] init];
    marker.position = CLLocationCoordinate2DMake(-33.86, 151.20);
    marker.map = mapView;
    NSString *originString = [NSString stringWithFormat:@"%f,%f", origin.coordinate.latitude, origin.coordinate.longitude];
    NSString *destinationString = [NSString stringWithFormat:@"%f,%f", destination.coordinate.latitude, destination.coordinate.longitude];
    NSString *directionsAPI = @"https://maps.googleapis.com/maps/api/directions/json?";
    NSString *directionsUrlString = [NSString stringWithFormat:@"%@&origin=%@&destination=%@&mode=driving&key=%@&alternatives=true", directionsAPI, originString, destinationString,@"YOUR API KEY"];
    NSURL *directionsUrl = [NSURL URLWithString:directionsUrlString];
    NSURLSessionDataTask *fetchDirectionsTask = [[NSURLSession sharedSession] dataTaskWithURL:directionsUrl completionHandler:
                                                 ^(NSData *data, NSURLResponse *response, NSError *error)
                                                 {
                                                     NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
                                                     if(error)
                                                     {
                                                         return;
                                                     }
                                                     NSArray *routesArray = [json objectForKey:@"routes"];
                                                     GMSPolyline *polyline = nil;
                                                     int i=1;
                                                     for (id route in routesArray)
                                                     {
                                                         NSDictionary *routeDict = [route valueForKey:@"overview_polyline"];
                                                         NSString *points = [routeDict objectForKey:@"points"];
                                                         GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] init];
                                                         GMSPath *path = [GMSPath pathFromEncodedPath:points];
                                                         polyline = [GMSPolyline polylineWithPath:path];
                                                         polyline.strokeWidth = 3;
                                                         if(i==1)
                                                         {
                                                             polyline.strokeColor = [UIColor greenColor];

                                                         }else if(i==2)
                                                         {
                                                             polyline.strokeColor = [UIColor redColor];
                                                         }else{
                                                             polyline.strokeColor = [UIColor blueColor];
                                                         }
                                                         i = i+1;

                                                         bounds = [bounds includingCoordinate:marker.position];
                                                         polyline.map=mapView;
                                                     }
                                                 }];
    [fetchDirectionsTask resume];
}

我没有使用API来获取两个坐标之间的路线。我正在记录用户移动时的位置数据并将其绘制出来。 - Nitish Makhija

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接