我正在编写一个需要返回地理边界框内所有点的PHP / SQLite后端API。这将用于通过AJAX调用在Google Map的可见区域内检索标记。
这是其中一件听起来非常容易做的事情,只需做一个
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解决这个问题?
答案 0 :(得分:3)
好吧,我想我明白了。
我最终创建了一个不同的查询,具体取决于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...
}
答案 1 :(得分:1)
在这种情况下,数据库中的所需数据不包含在单个矩形中,而是包含在两个矩形中。
您的代码必须检测此情况(minLng
&gt; maxLng
)并相应地更改查询。