Расстояние между координатами Long Lat с использованием SQLITE - PullRequest
4 голосов
/ 28 мая 2010

У меня есть sqlite db с длинными и широчайшими магазинами, и я хочу найти 5 ближайших магазинов.

Так что следующий код работает нормально.

    if(sqlite3_prepare_v2(db, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {


    while (sqlite3_step(compiledStatement) == SQLITE_ROW) {

        NSString *branchStr = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
        NSNumber *fLat = [NSNumber numberWithFloat:(float)sqlite3_column_double(compiledStatement, 1)];
        NSNumber *fLong = [NSNumber numberWithFloat:(float)sqlite3_column_double(compiledStatement, 2)];

        NSLog(@"Address %@, Lat = %@, Long = %@", branchStr, fLat, fLong);
        CLLocation *location1 = [[CLLocation alloc] initWithLatitude:currentLocation.coordinate.latitude longitude:currentLocation.coordinate.longitude];
        CLLocation *location2 = [[CLLocation alloc] initWithLatitude:[fLat floatValue] longitude:[fLong floatValue]];

        NSLog(@"Distance i meters: %f", [location1 getDistanceFrom:location2]);
        [location1 release];
        [location2 release];
    }       
}

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

  1. Лучше ли поместить расстояние обратно в строку sqlite, у меня есть строка, когда я прохожу через базу данных. Как я могу это сделать? Я использую инструкцию UPDATE? У кого-нибудь есть кусок кода, чтобы помочь мне.

  2. Я могу прочитать sqlite в массив, а затем отсортировать массив. Вы рекомендуете это по вышеупомянутому подходу? Это более эффективно?

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

Ответы [ 2 ]

6 голосов
/ 01 июня 2010

Самый быстрый способ найти близлежащие местоположения в SQL - это использовать формулу Хаверсайна в запросе SQL. Сделайте поиск Google для sqlite и Haversine, и вы найдете реализацию.

Вот тот, который я использовал раньше:

http://www.thismuchiknow.co.uk/?p=71

0 голосов
/ 01 июня 2010

Вы должны пройти через каждый элемент только один раз, так что сложность довольно хорошая. вам нужен своего рода Deque-контейнер фиксированного размера, своего рода связанный список или массив фиксированного размера, фиксированный размером 5, тем количеством магазинов, которое вы хотите получить в каждой точке. всегда добавляйте магазин с минимальным расстоянием до Deque. после пробежки по вашей базе данных у вас есть 5 ближайших магазинов в вашей деке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...