2013-04-08 113 views
1

我正在進行一個API調用,它應該返回某個區域內的點列表。獲取某個區域內的座標

這將在地圖上使用,因此對API的調用具有所有四個角點的座標。
該區域將始終爲矩形,不會被旋轉。

目前,我使用的是下面的算法用於限制的結果:

$lat_limits = array(min($bottom_left_lat, $top_left_lat), max($bottom_left_lat, $top_left_lat)); 
$lon_limits = array(min($top_left_lon, $top_right_lon), max($top_left_lon, $top_right_lon)); 

我的問題是:

  1. 這是搜索的最佳方式是什麼?
  2. 是否有任何PHP庫/幫助函數更適合此用途?

謝謝!

+2

'WHERE lat BETWEEN $ lat_min AND $ lat_max AND lng BETWEEN $ lng_min AND $ lng_max',並在您的lat和lng列上放置索引。請記住,如果left_lng> right_lng您的窗口跨越日期線,您需要將它分成+/- 180度的兩個框。 – Sammitch 2013-04-08 18:04:03

+0

感謝您的快速回復。這與我使用的查詢是一樣的。不過,我對'left_lng> right_lng'這個案例的評論的第二部分不甚瞭解。你能解釋更多嗎? – 2013-04-08 18:08:27

+2

經度一般從西向東遞增,但跨越經度從180度變爲-180度的國際日期線除外。如果您在跨越此線的框中使用相同的查詢,您將獲得所有經度*在框外的結果。您需要檢測條件並將查詢條件分成2個框,從$ lng_left到180和-180到$ lng_right。 – Sammitch 2013-04-08 18:12:13

回答

1

簡單:

WHERE lat BETWEEN $lat_min AND $lat_max AND lng BETWEEN $lng_min AND $lng_max 

,並把你的緯度和經度列的索引,以便更好地優化查詢。

請記住,如果left_lng> right_lng您的窗口橫跨日期行,您需要將它分成+/- 180度的2個框。

經度通常從西向東遞增,但跨越經度從180度變爲-180度的國際日期線除外。如果您在跨越此線路的框中使用相同的查詢,您將獲得箱外所有經度的結果。您需要檢測條件並將查詢條件分爲2個框,從lng_left到180和-180到lng_right。

+0

你的窗戶覆蓋北極或南極的特殊情況如何? – dashmug 2015-01-26 22:34:58