Получение результатов по широте и долготе из SQLite - PullRequest
0 голосов
/ 16 октября 2018

У меня есть таблица базы данных с событиями.Каждое событие имеет местоположение (широта и долгота).Я пишу API, чтобы отображать их на карте с помощью API Карт Google.Я хочу отображать записи только в тех границах, на которые в данный момент указывает карта.Итак, я получаю границы карты и передаю их в API.

var sql = `
  SELECT * 
  FROM event e 
  WHERE 1=1
`;
if(opts.status){
  sql += `AND e.status = '${opts.status}'`
}
if(opts.north){
  sql += `
          AND e.latitude IS NOT NULL
          AND e.latitude < ${opts.north}
        `
}
if(opts.south){
  sql += `
          AND e.latitude IS NOT NULL
          AND e.latitude > ${opts.south}
        `
}
if(opts.west){
  sql += `
          AND e.longitude IS NOT NULL
          AND e.longitude > ${opts.west}
        `
}
if(opts.east){
  sql += `
          AND e.longitude IS NOT NULL
          AND e.longitude < ${opts.east}
        `
}

Этот подход работает очень хорошо, за исключением случаев, когда карта пересекает линию 180 °.Тогда я получаю 0 результатов.Вот результат SQL в этой ситуации:

   SELECT * 
   FROM event e 
   WHERE 1=1

           AND e.status = 'approved'

           AND e.latitude IS NOT NULL
           AND e.latitude < 66.00592309328745

           AND e.latitude IS NOT NULL
           AND e.latitude > -16.496223071414896

           AND e.longitude IS NOT NULL
           AND e.longitude > 170.34568706699213

           AND e.longitude IS NOT NULL
           AND e.longitude < -46.216812933007816

Мой вопрос: как я могу справиться с этим, чтобы он дал мне точные результаты?

1 Ответ

0 голосов
/ 23 октября 2018

Я думаю, вы должны попробовать что-то вроде:

AND ((e.longitude > ${opts.west}
     AND e.longitude < ${opts.east}
     AND  ${opts.east} > ${opts.west})
OR ((e.longitude > ${opts.west}
     OR e.longitude < ${opts.east})
     AND  ${opts.east} < ${opts.west}))

А может быть, сделать то же самое для широты?

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