2017-05-19 6 views
0

私のプロジェクトでは、私はすべての5秒のために成功裏に緯度と経度を取得しています、と私は、データベースに保存していますが、私はすべての5秒ごと30メートルの距離の位置データが欲しい....距離と時間に基づいて位置の緯度と経度を取得したいですか?

これはViewControllerをで私のコードです

あなたがNSPredicateを作成するための最小値と最大緯度、経度の値を見つける必要があります.M

//When I click button this method called... 

- (IBAction)getLocationDetails:(UIButton *)sender { 
[self CurrentLocationIdentifier]; 
timer = [NSTimer scheduledTimerWithTimeInterval:5.0f 
             target:self 
             selector:@selector(CurrentLocationIdentifier) 
             userInfo:nil 
             repeats:YES]; 

} 

-(void)CurrentLocationIdentifier { 

//---- For getting current gps location 
locationManager = [[CLLocationManager alloc]init]; 
locationManager.delegate = self; 
locationManager.distanceFilter = kCLDistanceFilterNone; 
locationManager.desiredAccuracy = kCLLocationAccuracyBest; 

[locationManager startUpdatingLocation]; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { 

currentLocation = [locations objectAtIndex:0]; 
self.longitudeString = @(currentLocation.coordinate.longitude).stringValue; 
self.latitudeString = @(currentLocation.coordinate.latitude).stringValue;  
[locationManager stopUpdatingLocation]; 
manager.delegate = nil; 

NSLog(@"New longitude %@", self.longitudeString); 
NSLog(@"New latitude %@", self.latitudeString); 

dispatch_async(dispatch_get_main_queue(), ^{ 


CLGeocoder *geocoder = [[CLGeocoder alloc] init] ; 
[geocoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray *placemarks, NSError *error) 
{ 
    NSString *CountryArea; 

    if (!(error)) 
    { 
     CLPlacemark *placemark = [placemarks objectAtIndex:0]; 
     NSLog(@"\nCurrent Location Detected.......\n"); 
//    NSLog(@"placemark : %@",placemark); 
     NSString *locatedAt = [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "]; 
     NSString *address = [[NSString alloc]initWithString:locatedAt]; 
     NSLog(@"Address : %@", address); 
     self.addressString = [[NSString alloc]initWithString:address]; 

[self saveData]; 
} 
    else 
    { 
     NSLog(@"Geocode failed with error %@", error); 
     NSLog(@"\nCurrent Location Not Detected\n"); 
     //return; 
     CountryArea = NULL; 
    } 

}]; 


}); 

// Here is the distance calculation... 
CLLocation *startLocation = [[CLLocation alloc] initWithLatitude:currentLocation.coordinate.latitude longitude:currentLocation.coordinate.longitude]; 
CLLocation *endLocation = [[CLLocation alloc] initWithLatitude:currentLocation.coordinate.latitude longitude:currentLocation.coordinate.longitude]; 
CLLocationDistance distance = [startLocation distanceFromLocation:endLocation]; 

if (distance == 0) { 
    NSLog(@"Distance.... %f", distance); 
} 


} 


- (void)saveData { 

NSManagedObject * managedObj = [[NSManagedObject alloc]initWithEntity:self.GPSDatabaseED insertIntoManagedObjectContext:self.ad.managedObjectContext]; 

[managedObj setValue:self.longitudeString forKey:@"longitude"]; 
[managedObj setValue:self.latitudeString forKey:@"latitude"]; 
[managedObj setValue:self.addressString forKey:@"address"]; 
[managedObj setValue:self.UDIDString forKey:@"udid"]; 


NSError * errorObj; 

[self.ad.managedObjectContext save:&errorObj]; 


if (errorObj) { 

    NSLog(@"Something goes wrong"); 
}else 
{ 
    NSLog(@"Saved Successfully"); 
} 


} 

答えて

2

はここで可能なソリューションです。ラジアン

  1. コンバート度

    -(float)deg2rad:(float)degrees{ 
         return degrees * M_PI/180; 
    } 
    
  2. KMにおける最小及び最大の緯度、経度の値//距離値を求める(30メートル)

    float searchDistance = 0.03; 
    
    float minLat = userLocation.coordinate.latitude - (searchDistance/69); 
    
    float maxLat = userLocation.coordinate.latitude + (searchDistance/69); 
    
    float minLon = userLocation.coordinate.latitude - searchDistance/fabs(cos([self deg2rad:userLocation.coordinate.latitude])*69); 
    
    float maxLon = userLocation.coordinate.longitude + searchDistance/fabs(cos([self deg2rad:userLocation.coordinate.latitude])*69); 
    
  3. 次のように述語を作成します。

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"latitude <= %f AND latitude >= %f AND longitude <= %f AND longitude >= %f", maxLat, minLat, maxLon, minLon]; 
    

これはuserLocation周りの正方形を作成します、それはあなたのための完全な助けすることができます。

+0

エラーが発生しています ')' – Marking

+0

アップデートの回答を確認してください。 – Lalji

+0

minLonとmaxLonの計算にエラーがあります。それは緯度を使用すべきではなく、経度のみを使うべきです:float minLon = userLocation.coordinate。経度 - searchDistance/fabs(cos([self deg2rad:userLocation.coordinate。経度]))* 69); float maxLon = userLocation.coordinate.longitude + searchDistance/fabs(cos([self deg2rad:userLocation.coordinate。経度])* 69); – Andrey

関連する問題