Как получить набор результатов из таблицы SQLite, используя переменные широты и долготы в качестве критериев? - PullRequest
0 голосов
/ 09 ноября 2010

Мне нужно создать таблицу SQLite, которая будет состоять из следующих столбцов:

  1. Имя
  2. Адрес
  3. Город
  4. ProvinceState
  5. PostalZipCode
  6. Страна
  7. PhoneNumber
  8. Широта
  9. Долгота

Мне нужно отправить запрос нав этой таблице, где я передаю переменные широты и долготы, которые были вычислены из позиции пользователя с помощью CLLocation, и извлекаю строки, наиболее близкие к той, которую я передаю. Однако моя проблема:

  1. Какой тип столбца должны быть Широта и Долгота, чтобы я мог вытянуть соответствующие строки?Должны ли столбцы быть строками или чем-то еще?Какого типа должны быть мои переменные, которые я передаю?Должны ли они быть Strings, Doubles или что-то еще?В настоящее время я использую их как строки в своем коде, но я не уверен, что это лучший подход.Это важно, потому что в случае продольных координат значения будут отрицательными.Как бы я принял это во внимание, когда я делаю свой SQL-вызов?

  2. В настоящее время таблица довольно мала.Однако в будущем эта таблица, безусловно, станет довольно большой, и я не хочу извлекать ВСЕ значения из таблицы, а скорее отфильтровать нерелевантные значения и получить только те, которые необходимы.Я думаю, что я бы сделал это, чтобы получить те строки, пары широта / долгота которых были численно ближе всего к тем, которые я передаю. Как бы я создал SQL-запрос, который бы соответствовал этому в Objective-C?

Ответы [ 2 ]

1 голос
/ 09 ноября 2010

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

Полагаю, вам может помочь следующий алгоритм:

  • ввести дополнительные столбцы:
    • LatitudeIdx int = round (Latitude * ScaleFactor)
    • LongitudeIdx int = round (Longitude * ScaleFactor)
  • определить значение для ScaleFactor, которое будет соответствовать вашим потребностям
  • определить индекс (LatitudeIdx, LongitudeIdx)
  • запрос данных к вам с использованием значений LatiduteIdx и LongitudeIdx (это будет операция быстрого просмотра индекса)

Чего вы добьетесь с помощью * столбцов Idx и ScaleFactor фактически разбивает ваши данные на ячейки одинакового размера. Размер ячейки фактически равен 1 / географическим градусам ScaleFactor, то есть примерно 111 км / ScaleFactor.

Таким образом, когда вы извлекаете данные с определенными значениями LatitudeIdx и LongitudeIdx, вы фактически получаете все точки, попадающие в ячейку, определенную этими значениями, то есть фильтруете свои точки данных. После этого вы вычисляете расстояния до точки интереса и выбираете ближайшую (вы можете сделать это непосредственно в запросе и отсортировать по расстоянию, чтобы получить нужную точку за один проход).

0 голосов
/ 09 ноября 2010

Написание запросов в sqlite аналогично написанию запросов на любом другом языке SQL. Исходя из моего понимания вашего вопроса, я думаю, что вы должны хранить широту и долготу как двойные.

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