我正在尝试从我的数据库加载标记(实际上是自定义叠加),其中包含每个标记的lat和lng。我想只加载谷歌地图当前可见区域中的标记。
我所做的是获取地图边界并计算最大值和最小值lat和lng。每次我拖动或更改缩放时,我都会使用ajax发送这些边界,然后使用sql查询从我的数据库中检索正确的标记,如下所示:
AND lat BETWEEN :minLat AND :maxLat
AND lng BETWEEN :minLng AND :maxLng
这很好......除非我正在查看谷歌地图的两个重复世界之间。
sql查询将不再适用于那些映射边界(sw和ne),因为每个绑定来自它们各自的世界。然后我不会检索任何标记。
示例:澳大利亚大约是lng = 150,在这种情况下我会有 minLng = 25(sw)和maxLng = 0(ne)......显然150不在0到25之间,即使我现在正在看澳大利亚。
我没有看到有关该特定问题的任何问题...... 有什么想法解决这个问题?我做错了什么?
编辑:我终于解决了我的问题......这就是我所做的:
// normal case
if( $swLng < $neLng )
{
$ANDOR_lng = "AND";
}
// Case where world repeated
else
{
$ANDOR_lng = "OR";
}
$dql = "SELECT MYSTUFF ...
AND lat BETWEEN :latA AND :latB
AND ( lng > :lngA ".$ANDOR_lng." lng < :lngB )";
$parameters = array(
'latA' => $swLat,
'latB' => $neLat,
'lngA' => $swLng,
'lngB' => $neLng
);
}
答案 0 :(得分:3)
通常,您希望w
(西经)小于e
(东经),即:
:minLng < :maxLng
但是,当边界框包含180(或-180)的子午线时,这不是真的。在这些情况下,查询的这一部分永远不会返回true:
( lng > :minLng AND lng < :maxLng )
您可以做的是交换:minLng
和:maxLng
,以便上述假设再次成为现实:
if(:minLng > :maxLng) {
:minLng, :maxLng = :maxLng, :minLng
}
如果你看一下上面的地图,那就与你在绘制它时所做的一致:sw
角的经度比ne
角更大。
警告:我多年没有编写PHP代码,我不知道你是否可以实际a, b = b, a
交换它们的值,我只知道它适用于Python,但你明白了。< / p>
答案 1 :(得分:0)
问题是你使用了错误的界限。您需要获取像素绑定而不是坐标边界。如果你得到像素绑定,那么我认为查询可以工作,因为没有这样的问题。