SQL-запрос для запросов соседних интересных мест на основе lat/long - SQLite

Учитывая базу данных, которая содержит три поля:

Близость долготы широты

Где Lat и Long являются координатами GPS, и Близость (некоторая единица - ноги? Секунды? Минуты?)

И, учитывая текущий GPS пользователя lat/long...

Я хочу записать SQL-запрос, который получит все строки, где пользователь в "Близости" тех строк.

И прием: Это должно работать в SQLite, который только поддерживает довольно примитивные типы данных. Никакой обман и доверие SQL Server (или некоторый другой продукт, который обеспечивает лучшие функции геопространства).

Какие-либо предложения?

11
задан starblue 3 July 2010 в 18:48
поделиться

3 ответа

Вот пользовательская функция на основе C для sqlite [скопирована из ссылок, указанных ниже]. Это можно использовать в приложении для iOS. Предполагается, что у вас есть столбцы с именами широта и долгота, и вычисляется разница между ними и любыми указанными вами координатами широты и долготы. Отличное описание, работает как есть.

 #define DEG2RAD (градусы) (градусы * 0.01745327) // градусы * пи более 180
static void distanceFunc (sqlite3_context * context, int argc, sqlite3_value ** argv)
{
 // проверяем наличие четырех аргументов (lat1, lon1, lat2, lon2)
assert (argc == 4);
 // проверяем, что все четыре аргумента не равны нулю
if (sqlite3_value_type (argv [0]) == SQLITE_NULL || sqlite3_value_type (argv [1]) == SQLITE_NULL ||
sqlite3_value_type (argv [2]) == SQLITE_NULL ||
sqlite3_value_type (argv [3]) == SQLITE_NULL) {
sqlite3_result_null (контекст);
возвращение;
}

// получаем четыре значения аргумента
двойной lat1 = sqlite3_value_double (argv [0]);
двойной lon1 = sqlite3_value_double (argv [1]);
двойной лат2 = sqlite3_value_double (argv [2]);
двойной lon2 = sqlite3_value_double (argv [3]);

// конвертируем lat1 и lat2 в радианы сейчас, чтобы не делать это дважды ниже
двойной lat1rad = DEG2RAD (lat1);
двойной lat2rad = DEG2RAD (lat2);

// применяем сферический закон косинусов к нашим широтам и долготе и соответствующим образом устанавливаем результат

// 6378.1 - приблизительный радиус Земли в километрах
sqlite3_result_double (context, acos (sin (lat1rad) * sin (lat2rad) + cos (lat1rad) * cos (lat2rad) * cos (DEG2RAD (lon2) - DEG2RAD (lon1))) *
6378,1);
}

Это определяет расстояние функции SQL (Широта1, Долгота1, Широта2, Долгота2), который возвращает расстояние (в километрах). между двумя точками.

Чтобы использовать эту функцию, добавьте приведенный выше код ...и затем добавьте эту строку сразу после вызова sqlite3_open:

 sqlite3_create_function (sqliteDatabasePtr, "distance", 4, SQLITE_UTF8, NULL, & distanceFunc, NULL, NULL);

… где sqliteDatabasePtr - указатель базы данных, возвращаемый вашим вызовом в sqlite3_open.

Предположим, у вас есть таблица с названием "Местоположение", в которой столбцы называются Широта и долгота (оба типа double), содержащие значения в градусов, затем вы можете использовать эту функцию в своем SQL следующим образом:

 SELECT * FROM Locations ORDER BY Distance (Latitude, Longitude, 51.503357, -0.1199)

В этом примере местоположения в вашей базе данных упорядочиваются в зависимости от того, насколько далеко вдали они находятся от «Лондонского глаза», который находится на 51,503357, -0,1199.

РЕДАКТИРОВАТЬ:

Исходная ссылка http://www.thismuchiknow.co.uk/?p=71 мертва, поэтому, как кто-то упомянул в комментарии, вы можете использовать эту ссылку: https://web.archive.org/web/20160808122817/http://www.thismuchiknow.co.uk/?p=71 , чтобы получить эту веб-страницу

7
ответ дан 3 December 2019 в 09:18
поделиться

Формула Хаверсина - это то, что вам нужно. . Недостаточно использовать простую формулу евклидова расстояния, потому что кривизна Земли влияет на расстояние между двумя точками.

Создание локатора магазинов с помощью PHP, MySQL и Google Maps - это статья о реализации этого решения с MySQL, но SQLite не поддерживает триггерные функции.

Ознакомьтесь с ответами в Расчет расстояния по большому кругу с помощью SQLite здесь, в Stack Overflow, чтобы получить дополнительные советы по расширению функций SQLite, чтобы вы могли решить эту проблему.

3
ответ дан 3 December 2019 в 09:18
поделиться

Вы также знаете, что есть плагин для SQLite под названием Spatialite, который имеет все те же функции, что и PostGIS и SQLServer? Я предполагаю, что вы пытаетесь использовать SQLLite на iPhone или в браузере или что-то в этом роде. В противном случае я НАСТОЯТЕЛЬНО рекомендую пространственный.

2
ответ дан 3 December 2019 в 09:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: