数据库
首页 > 数据库> > php-从数据库中为可见区域加载标记

php-从数据库中为可见区域加载标记

作者:互联网

我正在尝试从数据库中加载标记(实际上是自定义叠加层),该数据库包含每个标记的经度和纬度.我只想在Google地图的当前可见区域中加载标记.

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

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

效果很好…除了当我当前在google地图的两个重复世界之间寻找时.

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

    }

解决方法:

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

标签:google-maps-api-3,google-maps-markers,php
来源: https://codeday.me/bug/20191201/2083585.html