0

CoreLocation フレームワークからの GPS 位置を使用して、各行が NSMutableDictionary である NSMutableArray をソートしたいと考えています。

これは、POI の配列の例です

arrayCampi = (
{
    cap = 28100;
    "cell_phone" = "";
    championship = "IBL 1D";
    citta = Novara;
    division = "";
    email = "";
    fax = 0321457933;
    indirizzo = "Via Patti, 14";
    latitude = "45.437174";
    league = "";
    longitude = "8.596029";
    name = "Comunale M. Provini";
    naz = Italy;
    prov = NO;
    reg = Piemonte;
    sport = B;
    surname = "Elettra Energia Novara 2000";
    telefono = 03211816389;
    webaddress = "http://www.novarabaseball.it/";
})

昇順モードで各行のフィールド「緯度」と「経度」を使用して、この配列を自分の場所 (緯度と経度) で並べ替える必要があります (最初の行は私に最も近い POI です)。

私はこの解決策を試しましたが成功しませんでした:

+ (NSMutableArray *)sortBallparkList:(NSMutableArray *)arrayCampi location:(CLLocation *)myLocation  {

    if ([arrayCampi count] == 0) {
        return arrayCampi;
    }

    if (myLocation.coordinate.latitude == 0.00 &&
        myLocation.coordinate.longitude == 0.00) {
        return arrayCampi;
    }

    NSMutableArray *sortedArray = [NSMutableArray arrayWithArray:arrayCampi];

    BOOL finito = FALSE;
    NSDictionary *riga1, *riga2;

    while (!finito) {
        for (int i = 0; i < [sortedArray count] - 1; i++) {

            finito = TRUE;
            riga1 = [sortedArray objectAtIndex: i];
            riga2 = [sortedArray objectAtIndex: i+1];

            CLLocationDistance distanceA = [myLocation distanceFromLocation:
                                            [[CLLocation alloc]initWithLatitude:[[riga1 valueForKey:@"latitude"] doubleValue]                                             
                                                                      longitude:[[riga1 valueForKey:@"longitude"] doubleValue]]];
            CLLocationDistance distanceB = [myLocation distanceFromLocation:
                                            [[CLLocation alloc]initWithLatitude:[[riga2 valueForKey:@"latitude"] doubleValue]
                                                                      longitude:[[riga2 valueForKey:@"longitude"] doubleValue]]];
            if (distanceA > distanceB) {
                [riga1 retain];
                [riga2 retain];

                [sortedArray replaceObjectAtIndex:i+1 withObject:riga2];
                [sortedArray replaceObjectAtIndex:i withObject:riga1];

                [riga1 release];
                [riga2 release];

                finito = FALSE;
            }
        }
    }

    return sortedArray;
}

他の解決策でも、誰かが私を助けることができますか?

アレックス。

4

3 に答える 3

2

緯度と経度で並べ替えても、特定の座標から最も近い場所は得られません。近似*) として、ピタゴラスを使用できます (高校で習ったことを覚えていますか?):

float distance = sqrtf(powf((origLat-destLat),2)+powf((origLon-destLon), 2));

キーを使用して辞書に追加し、次の@"distance"ようにソートするだけです

NSArray *sorted = [arrayOfDictionaries sortedArrayUsingDescriptors:
     @[[NSSortDescriptor sortDescriptorWithKey:@"distance" ascending:YES]]];

*) 理論上、2 点間の距離は楕円体の表面上の曲線であるため、近似値です。

于 2012-10-11T14:17:19.273 に答える
0
[arrayCampi sortedArrayUsingSelector:@selector(compare:)];

   - (NSComparisonResult)compare:(NSDictionary *)otherObject {

    if ([[self objectForKey:@"key"] isEqual:[otherObject objectForKey:@"key"]]) {
        return NSOrderedSame;
    }
    else if (//condition) {
        return NSOrderedAscending;
    }
    else {
        return NSOrderedDescending;
    }
}

カスタムオブジェクトを含むNSMutableArrayを並べ替える方法をご覧ください

于 2012-10-11T14:13:35.093 に答える
0

独自のソートアルゴリズムを実装する必要はないと思います。そこに準備ができているものがあります:-)私はNSSortDescriptorを見ることをお勧めします。

また、地理座標はNSNumberではなくNSString形式で保持するため、クラスでNSStringオブジェクトを比較するための独自のNSPredicateを作成する必要があります。(@"123"が@"1.23"より大きいかどうかは覚えていません。つまり、特殊記号'。'を意味します)

于 2012-10-11T14:15:37.137 に答える