2017-10-07 72 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... 
}