Nano Hash - криптовалюты, майнинг, программирование

iPhone: сортировка по местоположению

Я работаю над приложением для iPhone, где у меня есть список пользователей в NSMutableArray, как показано ниже.

myMutableArray: (
    {
        FirstName = Getsy;
        LastName = marie;
        Latitude = "30.237314";
        Longitude = "-92.461008";
    },
    {
        FirstName = Angel;
        LastName = openza;
        Latitude = "30.260329";
        Longitude = "-92.450414";
    },
    {
        FirstName = Sara;
        LastName = Hetzel;
        Latitude = "30.2584499";
        Longitude = "-92.4135357";
    }
)

Мне нужно отсортировать пользователей на основе местоположения, которое находится рядом с моим местоположением, путем вычисления широты и долготы. Я не могу добиться этого до сих пор. Может ли кто-нибудь помочь мне с предоставлением некоторых образцов?

ОБНОВЛЕНО: я пытаюсь, как показано ниже, как предложил Mr.sch. Пожалуйста, проверьте мой обновленный код. Это нормально?

    NSArray *orderedUsers = [myMutableArray sortedArrayUsingComparator:^(id a,id b) {
    NSArray *userA = (NSArray *)a;
    NSArray *userB = (NSArray *)b;
    CGFloat aLatitude = [[userA valueForKey:@"Latitude"] floatValue];
    CGFloat aLongitude = [[userA valueForKey:@"Longitude"] floatValue];
    CLLocation *participantALocation = [[CLLocation alloc] initWithLatitude:aLatitude longitude:aLongitude];

    CGFloat bLatitude = [[userA valueForKey:@"Latitude"] floatValue];
    CGFloat bLongitude = [[userA valueForKey:@"Longitude"] floatValue];
    CLLocation *participantBLocation = [[CLLocation alloc] initWithLatitude:bLatitude longitude:bLongitude];

    CLLocation *myLocation = [[CLLocation alloc] initWithLatitude:locationCoordinates.latitude longitude:locationCoordinates.longitude];

    CLLocationDistance distanceA = [participantALocation distanceFromLocation:myLocation];
    CLLocationDistance distanceB = [participantBLocation distanceFromLocation:myLocation];
    if (distanceA < distanceB) {
        return NSOrderedAscending;
    } else if (distanceA > distanceB) {
        return NSOrderedDescending;
    } else {
        return NSOrderedSame;
    }
}];

Спасибо!

16.02.2012

  • Привет, Гетси, смотри мой ответ ниже.. 16.02.2012
  • Можете ли вы проверить, равен ли myMutableArray нулю или он пуст непосредственно перед первой строкой в ​​добавленном вами коде. 16.02.2012
  • Ты замечательный! Большое спасибо! 17.02.2012
  • Нет, вам нужно использовать userB для bLatitude и bLongitude. 12.08.2014

Ответы:


1

Прежде всего, вам нужно рассчитать расстояние между вашим текущим местоположением и местоположением каждого другого пользователя.

Говоря математически, вот пример Wolfram|Alpha.

Теперь «программно» вы можете использовать CLLocation, вот пример:

(CLLocationDistance)getDistanceFrom:(const CLLocation *)location

Но сначала вам нужно будет создать объект местоположения из вашей широты и долготы. Ты можешь использовать:

(id)initWithLatitude:(CLLocationDegrees)latitude longitude:(CLLocationDegrees)longitude
16.02.2012
  • Большое тебе спасибо! Как я могу перебрать всех пользователей и сравнить их местоположение с моим текущим местоположением и разобраться? 16.02.2012
  • Вы можете перебирать все объекты, используя обычный for loop, и использовать метод: [array objectAtIndex:theIndex]; 16.02.2012
  • Да, но смысл итерации, мне нужно разобраться. 16.02.2012

  • 2

    Вы можете рассчитать расстояние (географическое, а не плоскость!) между вашим положением и каждым из этих элементов. ' позиции и порядок по этому значению.

    16.02.2012
  • Привет, спасибо за ответ. Даже не расчет, я хотел бы также знать, как я могу перебрать всех пользователей и добиться этого. 16.02.2012

  • 3
    You may solve your problem in following way
    1)Firstly store all above values in separate array Like latArray ,longArray,nameArray
    2)Now get the distance between location(longArray,latArray) from your current location.
    Then store these distances in separate Array(distanceArray).
    
    //getDistance Between currentLocation and desired Location
    -(void *)getDistanceFromCurrentLocation{  
    for(int val=0;val<[latArray count];val++){
    NSString *dis_From_Current_Location;
    dis_From_Current_Location =nil;
    
    CGFloat str_Longitude=[[defaults objectForKey:@"long"]floatValue];
    CGFloat str_Latitude=[[defaults objectForKey:@"lati"]floatValue]; 
       //Suppose this is your current location 
    
    CGFloat lat1= [[latArray objectAtIndex:val]floatValue];
        //these array for lat
    CGFloat long1=[[longArray objectAtIndex:val]floatValue];
        //these array for longArray
    CLLocation *location1 = [[CLLocation alloc] initWithLatitude:lat1 longitude:long1];
    CLLocation *location2 = [[CLLocation alloc] initWithLatitude:str_Latitude longitude:str_Longitude];
    CLLocationDistance dist=[location1 distanceFromLocation:location2];
    NSLog(@"Distance i meters: %f", [location1 distanceFromLocation:location2]);
    long long v = llabs(dist/1000);
    dis_From_Current_Location=[NSString stringWithFormat:@"%lld km",v];
    [location1 release];
    [location2 release];
    [distanceArray addObject: dis_From_Current_Location];
    //distanceArray is Global NsMutableArray.
    
    }
    }
    

    Теперь вы должны применить метод сортировки (выборка, пузырь) для сортировки расстояний.

    Одна вещь, которую нужно позаботиться, это то, что когда вы сортируете DistanceArray, пожалуйста, настройте значения nameArray в соответствии с DistanceArray См. Ниже код для сортировки DistanceArray и настройте значение nameArray.

    -(void)getSoretdArray{
    NSString * tempStr,*tempStr2;
    for(int i=0;i<[distanceArray count]; i++){
        for(int j=i+1;j<[distanceArray count]; j++){
            if([distanceArray objectAtIndex:j]>[distanceArray objectAtIndex:j+1]){
                tempStr=[distanceArray objectAtIndex:j];
                NSString* str= [distanceArray objectAtIndex:j+1];
                [ distanceArray insertObject:str atIndex:j];
                [distanceArray insertObject:tempStr atIndex:j+1] ;
                //also change the name of corresponding location.
                //you have to adjust the stored names in namArray for storing names of Corresponding Distances 
                tempStr2=[nameArray objectAtIndex:j];
                NSString* str1= [nameArray objectAtIndex:j+1];
                [ nameArray insertObject:str1 atIndex:j];
                [nameArray insertObject:tempStr2 atIndex:j+1] ;
    
    
            }
        }
    }
    

    }

    This will definitely work just try to use carefully
    
    16.02.2012
  • Спасибо .. Но я только что привел пример четырех полей, таких как имя, фамилия, широта и долгота. На самом деле у меня около 20 полей в массиве и около 50 таких массивов в изменяемом массиве. 16.02.2012
  • Нет проблем, вы можете следовать приведенному выше коду для того же самого. Он будет работать. И помимо этого, если вы действительно найдете этот ответ хорошим, как вам нужно, примите его или проголосуйте за него. 16.02.2012

  • 4
  • Привет, хорошо .. Что будет (Пользователь *) a, (Пользователь *) b в моем случае. У меня есть массив данных. 16.02.2012
  • a и b — два сравниваемых объекта. Поэтому вам нужно найти способ получить доступ к местоположению в каждом объекте, но это зависит от типа объектов, которые вы поместили в свой массив. 16.02.2012
  • Хорошо.. У меня два вопроса: 1. «getDistanceFrom» — это не что иное, как «distanceFromLocation»? 2. Поскольку у меня есть данные в NSMuableArray, как вы думаете, этот код будет проходить через каждый массив в нем? (или) я должен добавить любой цикл внутри? 16.02.2012
  • Да, ты прав. getDistanceFrom должно быть равно distanceFromLocation. И что касается второго вопроса, вам не нужно создавать цикл for, sortedArrayUsingComparator пройдет по всем элементам и вернет отсортированный массив. 16.02.2012
  • Хорошо, тогда вот мой вопрос, у меня есть изменяемый массив, тогда как я могу дать userB, если я не могу его зациклить (или) что-то вроде userB = [mymutablearray objectAtIndex:i]? 16.02.2012
  • userA = a; и userB = b;. На самом деле ** sortedArrayUsingComparator** будет (своего рода) перебирать массив и выполнять код в блоке (^(id a, id b) {...}) для пары из двух элементов a и b из массива. 16.02.2012
  • Пожалуйста, проверьте мой обновленный код, я скопировал в своем вопросе. Все в порядке? 16.02.2012

  • 5
  • В чем вопрос? 08.11.2017
  • Здесь я сортирую список местоположений в соответствии с текущим местоположением... 08.11.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..