Mysql 在东北/西南边界内提取位置的SQL

Mysql 在东北/西南边界内提取位置的SQL,mysql,sql,geolocation,Mysql,Sql,Geolocation,我正在尝试获取一个SQL查询,以动态地提取城市范围内的事件。我有一个城镇/城市的列表,通过谷歌地理编码,我可以得到每个城市的东北和西南边界 我看过一些代码,解释了如何检查一个位置(按lat和long)是否在像美国这样的地方的范围内,但我读到这不适用于整个世界 我尝试过下面的公式,但似乎不起作用: AND ( ($swLat < $neLat AND lat BETWEEN $swLat AND $neLat) OR ($neLat < $swLa

我正在尝试获取一个SQL查询,以动态地提取城市范围内的事件。我有一个城镇/城市的列表,通过谷歌地理编码,我可以得到每个城市的东北和西南边界

我看过一些代码,解释了如何检查一个位置(按lat和long)是否在像美国这样的地方的范围内,但我读到这不适用于整个世界

我尝试过下面的公式,但似乎不起作用:

AND ( 
    ($swLat < $neLat AND lat BETWEEN $swLat AND $neLat) 
        OR 
    ($neLat < $swLat AND lat BETWEEN $neLat AND $swLat)
    AND 
    ($swLng < $neLng AND lng BETWEEN $swLng AND $neLng) 
        OR 
    ($neLng < $swLng AND lng BETWEEN $neLng AND $swLng)
)

问题是,当你的BBOX跨越日期线时,我在这里指出:关于sphinx,但同样适用于mysql

$where = "(lat BETWEEN $swLat AND $neLat)";
if ($neLng < $swLng) {
  $where .= " AND NOT (lng BETWEEN $neLng AND $swLng)";
} else {
  $where .= " AND (lng BETWEEN $swLng AND $neLng)";
}
$where=“(lat介于$swLat和$neLat之间)”;
如果($neLng<$swLng){
$where.=“和非(液化天然气介于$neLng和$swLng之间)”;
}否则{
$where.=“和(介于$swLng和$neLng之间的液化天然气)”;
}
使用负数过滤器排除东西方之间的项目(因为east longtitde值现在位于全局0的西部-只在横跨日期线的窄止点上留下结果)

弗兰克,你不应该经常碰到这个问题,因为不应该有任何城市跨越日期线


(可能会认为这段代码更干净,因为它避免了对纬度的冗余检查,并将其移动到PHP而不是mysel,但您也可以通过将NOT逻辑添加到
(lng介于$neLng和$swLng之间)
子句来修复代码)

您好,我刚刚在PHP函数中实现了这个功能,但它仍然没有返回正确的结果。我担心,我可以将该函数添加到我的问题中,这样您就可以看到它是否有帮助了?在您的示例中,我会说“边界框”查询很好-假设所讨论的城市是英国伯明翰:)错误可能在其他地方,可能您的数据没有像您所想的那样设置,或者查询是错误的。你说它“不起作用”,但不要谈论什么不起作用,或者为什么你认为它不起作用。是的,这个城市是英国伯明翰。我认为它不起作用,因为从查询中提取的事件位于伯恩茅斯和斯瓦内奇(离伯明翰很远)。我会仔细检查数据,但我确信纬度/经度是正确的。问题是之前的查询运行不正确。谢谢你的帮助!
function bounds_query($bounds) {

    $swLat = $_SESSION['search']['SW'][0];
    $swLng = $_SESSION['search']['SW'][1];
    $neLat = $_SESSION['search']['NE'][0];
    $neLng = $_SESSION['search']['NE'][1];

    $bounds .= ' AND (lat BETWEEN '.$swLat.' AND '.$neLat.')';
    if ($neLng < $swLng) {
      $bounds .= ' AND NOT (lng BETWEEN '.$neLng.' AND '.$swLng.')';
    } else {
      $bounds .= ' AND (lng BETWEEN '.$swLng.' AND '.$neLng.')';
    }

    return $bounds;
}
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts 
INNER JOIN lat_lng_post 
ON wp_posts.ID = lat_lng_post.post_id 
WHERE 1=1 
AND wp_posts.ID IN (10060,10293,...,10657) 
AND wp_posts.post_type = 'event' 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') 
AND lat_lng_post.lat = lat 
AND lat_lng_post.lng = lng 
AND (lat BETWEEN 52.385999 AND 52.5688762) AND (lng BETWEEN -2.0174336 AND -1.7098294)      
ORDER BY wp_posts.post_date DESC 
LIMIT 0, 10
$where = "(lat BETWEEN $swLat AND $neLat)";
if ($neLng < $swLng) {
  $where .= " AND NOT (lng BETWEEN $neLng AND $swLng)";
} else {
  $where .= " AND (lng BETWEEN $swLng AND $neLng)";
}