проверить, есть ли заданная широта и долгота в наборе широта / долгота в sqlite - PullRequest
1 голос
/ 01 июля 2010

В моем приложении для iphone есть таблица sqlite с широтами и долготами США ( Все метеостанции США ).Что такое запрос sqlite, чтобы проверить, входят ли заданные широта и долгота в набор широты / долготы в sqlite?

Я имею в виду, что у меня есть набор широты и долготы Нью-Йорка как (42.75,73.80), (37, -122) но я ищу с широтой / долготой около Нью-Йорка, например (42.10,73.20)

Как определить, что это (42.10,73.20) около Нью-Йорка?

  • Ответ для mtoepper

Пользовательские функции в SQLITE (например, ACOS)

//Include this code in your project
static void ACOSFunc(sqlite3_context *context, int argc, sqlite3_value **argv)
{
    assert(argc == 1);
    if (sqlite3_value_type(argv[0]) == SQLITE_NULL) {
        sqlite3_result_null(context);
        return;
    }
    double input = sqlite3_value_double(argv[0]);
    sqlite3_result_double(context, acos(input)  );
}

И добавьте это после создания подключения к базе данных.

sqlite3_create_function(db.sqliteHandle, "ACOS", 1, SQLITE_UTF8, NULL, &ACOSFunc, NULL, NULL);

Ответы [ 4 ]

4 голосов
/ 01 июля 2010

Я не использовал это раньше, но попробуйте запрос ниже:

SELECT id, (3959 * acos (cos (радианы (37)) * cos (радианы (широта)) * cos (радианы (lng) - радианы (-122)) + sin (радианы (37)) * sin (радианы (широты)))) AS расстояние ОТ маркеров ХАВИМА расстояние <25 ЗАКАЗАТЬ НА расстояние ЛИМИТ 0, 20; </p>

Этот запрос отлично работает в SQL, поэтому попробуйте это .. Надеюсь, он будет работать в SQLite.

Ура, Pragnesh

2 голосов
/ 01 июля 2010

Для повышения производительности вы можете также рассмотреть возможность хранения пар широта / длинная, которые представляют ограничивающую рамку вокруг каждой реальной точки широта / длинная, которые имеют точку интереса в центре.

Тогда вы просто делаете простую проверку, чтобы увидеть, находится ли интересующий вас лат / лонг внутри поля.

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

1 голос
/ 02 июля 2010

Великий Прагнеш.Работает очень хорошо.Кажется, вы хорошо разбираетесь в проблемах с iphone.

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

Предполагается, что ваша таблица выглядит примерно так:

stations:
id      | name     | lat     | lng
1617760 | Hilo, HI | 19.7303 | -155.0558

запрос будет

SELECT COUNT(*) FROM stations WHERE lat=? AND lng=?

(где "?" - параметры)

Если совпадений нет, вы получите 0, иначе 1 (при условии, что у вас нет нескольких станций в одной точке;))

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