どのハードウェアが場所を取得しているかを制御しようとしているわけではありません。より高い精度が必要な場合は、 から提供された精度を確認し、必要CLLocation
なものでない場合は破棄できます。
別の方法として、私が書いたこのコードを使用して、一連の読み取り値を平均化することもできます。オブジェクトの配列を渡すCLLocation
と、1 つの平均位置が返されます。私は自分のアプリの 1 つでそれを使用しており、非常に高い精度が得られます (5 つ以上の場所を使用する場合、通常は 1 メートル以内)。
- (CLLocation *) averageLocations: (NSArray *) loci
{
double tempLat=0,tempLong=0,tempAlt=0,tempAccH=0,tempAccV=0,tempCourse=0,tempSpeed=0,tempTime=0;
for (CLLocation *loc in loci)
{
tempLat += loc.coordinate.latitude;
tempLong += loc.coordinate.longitude;
tempAlt += loc.altitude;
tempAccH += loc.horizontalAccuracy;
tempAccV += loc.verticalAccuracy;
tempCourse += loc.course;
tempSpeed += loc.speed;
tempTime += loc.timestamp.timeIntervalSinceReferenceDate;
}
double ratio = (double) loci.count;
CLLocationCoordinate2D tempCoord = CLLocationCoordinate2DMake(tempLat/ratio, tempLong/ratio);
NSDate *tempDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:tempTime/ratio];
CLLocation *temp = [[CLLocation alloc] initWithCoordinate:tempCoord
altitude:tempAlt/ratio
horizontalAccuracy:tempAccH/ratio
verticalAccuracy:tempAccV/ratio
course:tempCourse/ratio
speed:tempSpeed/ratio
timestamp:tempDate];
return temp;
}