使用SQLite和PHP在边界框中选择地理点?

时间:2017-10-07 12:11:54

标签: php sqlite google-maps-api-3 geospatial postgis

我正在编写一个需要返回地理边界框内所有点的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解决这个问题?

2 个答案:

答案 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)并相应地更改查询。