从SQLite按纬度和经度获取结果

时间:2018-10-16 07:00:18

标签: javascript node.js sqlite

我有一个带有事件的数据库表。每个事件都有一个位置(纬度和经度)。我正在编写一个API,以便可以使用Google Maps API在地图上显示它们。我只想在地图当前指向的范围内显示记录。因此,我得到了地图的边界并将其传递给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 :(得分:0)

我认为您应该尝试以下方法:

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}))

也许对纬度也一样吗?