【问题标题】:Load markers from database for the visible area从数据库中为可见区域加载标记
【发布时间】:2012-01-28 19:31:21
【问题描述】:

我正在尝试从包含每个标记的 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
        );

    }

【问题讨论】:

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


    【解决方案1】:

    通常,您会期望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 中有效,但你明白了。

    【讨论】:

    • 酷,这是逆转比赛的好方法:)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多