从数据库加载可见区域的标记

时间:2012-01-28 19:31:22

标签: php google-maps-api-3 google-maps-markers

我正在尝试从我的数据库加载标记(实际上是自定义叠加),其中包含每个标记的lat和lng。我想只加载谷歌地图当前可见区域中的标记。

我所做的是获取地图边界并计算最大值和最小值lat和lng。每次我拖动或更改缩放时,我都会使用ajax发送这些边界,然后使用sql查询从我的数据库中检索正确的标记,如下所示:

    AND lat BETWEEN :minLat AND :maxLat
    AND lng BETWEEN :minLng AND :maxLng

这很好......除非我正在查看谷歌地图的两个重复世界之间。

enter image description here

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
        );

    }

2 个答案:

答案 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)

问题是你使用了错误的界限。您需要获取像素绑定而不是坐标边界。如果你得到像素绑定,那么我认为查询可以工作,因为没有这样的问题。