0

ユーザーの位置情報を扱うアプリケーションがあります

私のコードは

 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"DoctorTable" inManagedObjectContext:[myData managedObjectContext]];
[fetchRequest setEntity:entity];


passedLat = @"32.067288";
passedLng = @"33.325347";
NSPredicate *predicate = [NSPredicate predicateWithFormat:

                          @"( ( ((%f  -  lat) * (%f  -  lat)) + ((%f - lng) * (%f - lng)) ) <  %f)"
                          " and kind  == 0"

                          , passedLat.doubleValue, passedLat.doubleValue, passedLng.doubleValue, passedLng.doubleValue, [self calcDist:DoctorDistance], nil];

[fetchRequest setPredicate:predicate];

問題は、述語の最初のセクションです。

@"( ( ((%f  -  lat) * (%f  -  lat)) + ((%f - lng) * (%f - lng)) ) <  %f)"

passlat または paessedlng に関係なく、常に true です。私もそれを置き換えようとしました

 @"(((2-2)*(3-3)) <> 0)"

これもtrueと評価されます

[self calcDist:DoctorDistance] が 0.00005 を返すことにも注意してください。

4

2 に答える 2

0

座標間の差を二乗していることに気付きましたが、単純な距離値と比較しています。

述語の外で計算を行うことをお勧めします。

float passedLat = 32.067288;
float passedLng = 33.325347;

float distance = [self calcDist:DoctorDistance]; 
float lowerLat = passedLat - distance; 
float upperLat = passedLat + disstance;
float lowerLng = passedLng - distance;
float upperLng = passedLng + distance; 

fetchRequest.predicate = [NSPredicate predicateWithFormat: 
        @"(lat < %f && lat > %f) && (lng < %f && lng > %f)", 
         upperLat, lowerLat, upperLng, lowerLng];

.

注意: もちろん、地球は平面ではなく遠心楕円体であるため、これは距離の近似値にすぎないことは承知しています。

于 2013-04-28T13:08:11.730 に答える