2013-04-08 290 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