位置情報サービスを初めて開始すると、通常、移動しているかどうかに関係なく、複数の位置情報の更新が表示されます。入ってくる位置を調べると、 「ウォームアップ」している間、静止に達するまでhorizontalAccuracy
、一連の位置がますます正確に (つまり、値がどんどん小さくなって) 表示されることがわかります。horizontalAccuracy
horizontalAccuracy
特定の値を下回るまで、これらの初期位置を無視できます。または、起動時に、(a) 新しい場所と古い場所の間の距離が古い場所の距離よりも小さい場合、horizontalAccuracy
および (b)horizontalAccuracy
新しい場所の距離がそれよりも短い場合は、以前の場所を無視することができます。前の場所の。
たとえば、CLLocation
オブジェクトの配列と、最後に描画されたパスへの参照を維持しているとします。
@property (nonatomic, strong) NSMutableArray *locations;
@property (nonatomic, weak) id<MKOverlay> pathOverlay;
さらに、場所の更新ルーチンが場所の配列に追加し、パスを再描画する必要があることを示していると仮定しましょう。
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
NSLog(@"%s", __FUNCTION__);
CLLocation* location = [locations lastObject];
[self.locations addObject:location];
[self addPathToMapView:self.mapView];
}
したがってaddPathToMapView
、最後の位置よりも精度が低く、それらの間の距離が最新の位置の精度よりも小さい場合、最後の位置から 2 番目の位置を削除できます。
- (void)addPathToMapView:(MKMapView *)mapView
{
NSInteger count = [self.locations count];
// let's see if we should remove the penultimate location
if (count > 2)
{
CLLocation *lastLocation = [self.locations lastObject];
CLLocation *previousLocation = self.locations[count - 2];
// if the very last location is more accurate than the previous one
// and if distance between the two of them is less than the accuracy,
// then remove that `previousLocation` (and update our count, appropriately)
if (lastLocation.horizontalAccuracy < previousLocation.horizontalAccuracy &&
[lastLocation distanceFromLocation:previousLocation] < lastLocation.horizontalAccuracy)
{
[self.locations removeObjectAtIndex:(count - 2)];
count--;
}
}
// now let's build our array of coordinates for our MKPolyline
CLLocationCoordinate2D coordinates[count];
NSInteger numberOfCoordinates = 0;
for (CLLocation *location in self.locations)
{
coordinates[numberOfCoordinates++] = location.coordinate;
}
// if there is a path to add to our map, do so
MKPolyline *polyLine = nil;
if (numberOfCoordinates > 1)
{
polyLine = [MKPolyline polylineWithCoordinates:coordinates count:numberOfCoordinates];
[mapView addOverlay:polyLine];
}
// if there was a previous path drawn, remove it
if (self.pathOverlay)
[mapView removeOverlay:self.pathOverlay];
// save the current path
self.pathOverlay = polyLine;
}
要するに、次の場所よりも精度が低い場所を取り除くだけです。必要に応じて、剪定プロセスをさらに積極的に行うこともできますが、そこにはトレードオフがありますが、うまくいけば、これはアイデアを示しています。