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

Selecting geographic points within a bounding box using SQLite and PHP?

我正在编写一个 PHP/SQLite 后端 API,它需要 return 地理边界框内的所有点。这将用于通过 AJAX 调用检索 Google 地图可见区域内的标记。

这是一开始听起来超级容易做的事情之一,只需做一个

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 度经度。现在上面的查询将 select 指向边界框外!

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

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

您的代码必须检测这种情况 (minLng > maxLng) 并相应地更改查询。

好的,我想我明白了。

我最终创建了一个不同的查询,具体取决于 south 是否大于 north 纬度 and/or 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...
}