本文介绍了跟踪用户位置.MKPolyline从UTC坐标(0,0)绘制到当前位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在制作一个跟踪用户走的路线的应用.我为 horizo​​ntalAccuracy > 0的每个位置更新都删除了 MKPointAnnotation .然后,我试图从一个点到另一个绘制一条 MKPolyline .从按下开始按钮开始.在按下开始按钮之前, MKMapView 显示当前位置,这是正确的.当我按下开始按钮时,我希望看到点注释和从一个点到另一个点绘制的多段线.

I am making an app that tracks the route a user takes. I am dropping MKPointAnnotation for each location updates with horizontalAccuracy >0. Then I'm trying to draw a MKPolyline from one point to another. This begins when start button is pressed.Before pressing the start button the MKMapView shows the current location, which is correct. When I press start button I expect to see the point annotation and a polyline drawn from one point to another.

但是,按下开始键后,我会看到一条从UTC坐标(赤道和UTC子午线)绘制到我当前位置的折线.

didUpdateLocation 委托调用不会报告任何此类位置.这是代码...

didUpdateLocation delegate call of CLLocationManager doesn't report any such location when printed using NSLog.Here is the code...

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations;
{
    CLLocationCoordinate2D coordinates[locations.count];
    int index=0;
    for (CLLocation *location in locations)
    {
        #ifdef DEBUG
        NSLog(@"received co-ordinates:\nlatitude:%f \nlongitude:%f",location.coordinate.latitude,location.coordinate.longitude);
        #endif

        [self centerMapWithCoordinates:location.coordinate];


        // Add an annotation
        if (location.horizontalAccuracy>0)
        {
            MKPointAnnotation *point = [[MKPointAnnotation alloc] init];
            point.coordinate = location.coordinate;
//            if (location.speed>0)
//            {
                point.title = [NSString stringWithFormat:@"%0.2f Kmph",(location.speed*3600/1000)];
//            }
            [self centerMapWithCoordinates:location.coordinate];
            [mapView addAnnotation:point];
            CLLocationCoordinate2D coordinate = location.coordinate;
            coordinates[index] = coordinate;
            index++;
        }
    }

    MKPolyline *polyline = [MKPolyline polylineWithCoordinates:coordinates count:index+1];
    [mapView addOverlay:polyline];

}

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay;
{
    if ([overlay isKindOfClass:[MKPolyline class]])
    {
        MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithPolyline:overlay];

        renderer.strokeColor = [[UIColor orangeColor] colorWithAlphaComponent:0.7];
        renderer.lineWidth   = 3;

        return renderer;
    }

    return nil;
}

我做错了什么?如何摆脱不必要的折线?

What am I doing wrong? How do I get rid of this unneeded polyline?

如果您提供代码,请在ObjC中这样做.谢谢.

If you give code, pleae do so in ObjC. Thanks.

注意:

在浏览应用程序后,我注意到所有选定的坐标(通过图钉注释显示)相对于上述相同的UTC坐标都有一条折线.看到这张图片...

I noticed after navigating app that all selected coordinates (show by pin annotations) have a polyline with respect to the same above mentioned UTC co-ordinate. See this picture...

推荐答案

即使在Apple开发人员论坛上,我也找不到答案.我与Apple一起打开了一个技术支持实例,结果发现我正在增加将C数组的大小设置为所需值的索引,从而导致从坐标(0.0,0.0)绘制折线.

I couldn't get the answer to this even on Apple developer forums. I opened a Technical Support Instance with Apple and turns out I was incrementing the index that would set the size of the C array to by one more than required which resulted into polylines being drawn from co-ordinates (0.0, 0.0).

我将代码更改为此...

I changed the code to this...

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations;
{
#ifdef DEBUG
    NSLog(@"locations array %@",locations);
#endif
    for (int i=0; i<locations.count;i++)
    {
        if (i+1 <locations.count) {
            if (locations[i].horizontalAccuracy>locations[i+1].horizontalAccuracy) {
                currentLocation = locations[i+1];
            }
        }
        else
        {
            currentLocation = locations[i];
        }

    }

#ifdef DEBUG
    NSLog(@"current location: %@",currentLocation);
#endif
    [locationArray addObject:currentLocation];
    [self centerMapWithCoordinates:currentLocation.coordinate];
    MKPointAnnotation *point = [[MKPointAnnotation alloc] init];
    point.coordinate = currentLocation.coordinate;
    [mapView addAnnotation:point];
    CLLocationCoordinate2D coordinates[2];
    if (previousLocation!=nil)
    {
        coordinates[0]= previousLocation.coordinate;
        coordinates[1]=currentLocation.coordinate;
        MKPolyline *polyline = [MKPolyline polylineWithCoordinates:coordinates count:2];
        [mapView addOverlay:polyline];
    }
    else
    {
        previousLocation=[currentLocation copy];
    }



}

这篇关于跟踪用户位置.MKPolyline从UTC坐标(0,0)绘制到当前位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-04 04:28
查看更多