Sqlite на Android: как создать функцию sqlite dist db - для использования в приложении для расчета расстояния с использованием длинных длин - PullRequest
6 голосов
/ 28 февраля 2010

Мы создаем приложение для Android, которое будет использовать текущее местоположение пользователя (широта, долгота) и отображать 50 лучших мест вокруг текущего местоположения, отсортированные по расстоянию.

Эти места хранятся в БД SQLite. Мы планируем поставлять с БД sqlite с приложением.

Чтобы получить только 50 лучших ближайших мест, мы хотим определить функцию db DIST (для вычисления расстояния между двумя точками) и использовать ее в нашем запросе.

Как определить пользовательскую функцию SQLite для приложений Android? Какой будет вызов API Java для этого?

Мы успешно реализовали этот подход в нашем приложении для iPhone - с помощью Objective C.

Ответы [ 4 ]

5 голосов
/ 28 февраля 2010
1 голос
/ 26 января 2012

Обходным путем может быть выборка всех записей, где одно из значений (скажем, долгота) близко к текущему местоположению. Если вы используете этот столбец в качестве индекса, выборка будет очень быстрой.

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

0 голосов
/ 21 июля 2017

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

Это пример, но он не работает при пересечении 0 градусов, хотя вы можете сместить все широты / долготы для настройки.

Общее решение работает очень хорошо для упорядочения, но использует теорему Пифагора для вычисления относительного расстояния (примечание: в sqlite нет функции квадратного корня, но это не имеет значения).

 String calcDistance = "( ( (abs(" + cLat + ")  - " + Math.abs(lat) + ") * (abs(" + cLat + ")  - " + Math.abs(lat) + ") )" +
                    "+   ( (abs(" + cLng + ") - " + Math.abs(lng) + ") * (abs(" + cLng + ") - " + Math.abs(lng) + ") ) ) as calc_distance";

Если вам нужно зафиксировать это расстояние, вы можете настроить его, добавив 90 ко всем широтам и 180 ко всем долготам. Тогда вы могли бы избавиться от этих неприятных функций пресса.

0 голосов
/ 26 января 2012

Это можно сделать, но вы не можете загрузить это в базу данных из API Java. Вам нужно будет предоставить собственную реализацию библиотеки sqlite, которая расширена, чтобы обеспечить функции, которые вы хотите на уровне C. Это не весело, но работает хорошо. Имейте в виду, что у вас могут быть проблемы с устройствами Android, использующими нестандартные архитектуры.

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