使用 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...
}
我正在编写一个 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...
}