我有一个带有事件的数据库表。每个事件都有一个位置(纬度和经度)。我正在编写一个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
我的问题是,我该如何处理,这样才能给我准确的结果?
答案 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}))
也许对纬度也一样吗?