широта / долгота найти ближайшую широту / долготу - комплексный sql или комплексный расчет - PullRequest
157 голосов
/ 10 февраля 2010

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

Структура таблицы:

id
latitude
longitude
place name
city
country
state
zip
sealevel

Ответы [ 18 ]

3 голосов
/ 03 марта 2016
simpledb.execSQL("CREATE TABLE IF NOT EXISTS " + tablename + "(id INTEGER PRIMARY KEY   AUTOINCREMENT,lat double,lng double,address varchar)");
            simpledb.execSQL("insert into '" + tablename + "'(lat,lng,address)values('22.2891001','70.780154','craftbox');");
            simpledb.execSQL("insert into '" + tablename + "'(lat,lng,address)values('22.2901396','70.7782428','kotecha');");//22.2904718 //70.7783906
            simpledb.execSQL("insert into '" + tablename + "'(lat,lng,address)values('22.2863155','70.772108','kkv Hall');");
            simpledb.execSQL("insert into '" + tablename + "'(lat,lng,address)values('22.275993','70.778076','nana mava');");
            simpledb.execSQL("insert into '" + tablename + "'(lat,lng,address)values('22.2667148','70.7609386','Govani boys hostal');");


    double curentlat=22.2667258;  //22.2677258
    double curentlong=70.76096826;//70.76096826

    double curentlat1=curentlat+0.0010000;
    double curentlat2=curentlat-0.0010000;

    double curentlong1=curentlong+0.0010000;
    double curentlong2=curentlong-0.0010000;

    try{

        Cursor c=simpledb.rawQuery("select * from '"+tablename+"' where (lat BETWEEN '"+curentlat2+"' and '"+curentlat1+"') or (lng BETWEEN         '"+curentlong2+"' and '"+curentlong1+"')",null);

        Log.d("SQL ", c.toString());
        if(c.getCount()>0)
        {
            while (c.moveToNext())
            {
                double d=c.getDouble(1);
                double d1=c.getDouble(2);

            }
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
2 голосов
/ 24 августа 2016

Найти ближайших пользователей к моему:

Расстояние в метрах

На основе формулы Винсенти

У меня есть таблица пользователя:

+----+-----------------------+---------+--------------+---------------+
| id | email                 | name    | location_lat | location_long |
+----+-----------------------+---------+--------------+---------------+
| 13 | xxxxxx@xxxxxxxxxx.com | Isaac   | 17.2675625   | -97.6802361   |
| 14 | xxxx@xxxxxxx.com.mx   | Monse   | 19.392702    | -99.172596    |
+----+-----------------------+---------+--------------+---------------+

SQL:

-- my location:  lat   19.391124   -99.165660
SELECT 
(ATAN(
    SQRT(
        POW(COS(RADIANS(users.location_lat)) * SIN(RADIANS(users.location_long) - RADIANS(-99.165660)), 2) +
        POW(COS(RADIANS(19.391124)) * SIN(RADIANS(users.location_lat)) - 
       SIN(RADIANS(19.391124)) * cos(RADIANS(users.location_lat)) * cos(RADIANS(users.location_long) - RADIANS(-99.165660)), 2)
    )
    ,
    SIN(RADIANS(19.391124)) * 
    SIN(RADIANS(users.location_lat)) + 
    COS(RADIANS(19.391124)) * 
    COS(RADIANS(users.location_lat)) * 
    COS(RADIANS(users.location_long) - RADIANS(-99.165660))
 ) * 6371000) as distance,
users.id
FROM users
ORDER BY distance ASC

радиус земли: 6371000 (в метрах)

2 голосов
/ 10 февраля 2010

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

1 голос
/ 13 июня 2018

MS SQL Edition здесь:

        DECLARE @SLAT AS FLOAT
        DECLARE @SLON AS FLOAT

        SET @SLAT = 38.150785
        SET @SLON = 27.360249

        SELECT TOP 10 [LATITUDE], [LONGITUDE], SQRT(
            POWER(69.1 * ([LATITUDE] - @SLAT), 2) +
            POWER(69.1 * (@SLON - [LONGITUDE]) * COS([LATITUDE] / 57.3), 2)) AS distance
        FROM [TABLE] ORDER BY 3
1 голос
/ 03 июля 2017

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

1 голос
/ 10 февраля 2010

Похоже, вы должны просто использовать PostGIS, SpatialLite, SQLServer2008 или Oracle Spatial. Все они могут ответить на этот вопрос для вас с пространственным SQL.

1 голос
/ 08 сентября 2010
0 голосов
/ 10 февраля 2010

Эта проблема совсем не сложная, но она усложняется, если вам нужно ее оптимизировать.

Что я имею в виду, у вас есть 100 мест в вашей базе данных или 100 миллионов? Это имеет большое значение.

Если количество мест невелико, выведите их из SQL в код, просто выполнив ->

Select * from Location

Как только вы введете их в код, рассчитайте расстояние между каждым широтой и долготой и вашим оригиналом по формуле Хаверсайна и отсортируйте его.

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