2017-10-07 65 views
0

我在写一个PHP/SQLite后端API,需要返回地理边界框内的所有点。这将用于通过AJAX调用来检索Google Map可见区域内的标记。使用SQLite和PHP在边界框内选择地理点?

它的那些听起来超级容易在第一次做的一件事,只是做一个

SELECT * FROM markers WHERE lat <= :maxLat AND lat >= :minLat 
    AND lng <= :maxLng AND lng >= :minLng; 

但是假设边界框

minLat = 13 
maxLat = 14 
minLng = -178 
maxLng = 179 

即跨-180/180度经度。现在上面的查询将改为选择边界框外的点!

如何使用SQLite和PHP解决此问题?

回答

1

在这种情况下,数据库中的所需数据不包含在一个矩形内,而是包含在两个矩形内。

您的代码必须检测到此案例(minLng>maxLng)并相应地更改查询。

+0

就这样,发布了一个完整的答案。 – BadCash

2

好吧,我想我明白了。

我结束了创建依赖于不同的查询,如果south大于north的纬度和/或west大于east为经度,将它们结合起来,这样总共有4个可能的查询是。

// $coords = ['lngW'=>179, 'lngE'=>-178, 'latS'=>13, 'latN'=>14]; 

$whereLng = $coords['lngE'] < $coords['lngW'] ? 
    '(lng >= :lngW OR lng <= :lngE)' : 
    '(lng >= :lngW AND lng <= :lngE)'; 

$whereLat = $coords['latN'] < $coords['latS'] ? 
    '(lat >= :latS OR lat <= :latN)' : 
    '(lat >= :latS AND lat <= :latN)'; 

$getStmt = $this->db->prepare(
    "SELECT * FROM places WHERE $whereLng AND $whereLat" 
); 

if($getStmt->execute($coords)){ 
    // Do something... 
}