谷歌地图 - 平移和放大区域 - 放大或平移时不显示标记

时间:2009-07-07 06:32:05

标签: php javascript google-maps coordinates

我正在标记的服务器端实现一些基于边界的聚类,以便在我的谷歌地图上显示。我正在做的是我有一个函数,每当地图移动或平移或缩放时调用它,它接受地图的边界并进行ajax调用,然后服务器端脚本运行一个简单的SQL查询来检索标记和聚类它们。迄今为止,聚类部分运行良好,但有时getBounds似乎没有发送我认为正确的边界。

就像我可能会在地面上稍微平移地图一样,过去有标记的地区现在突然间没有标记而地图是空白的。我检查了sql查询,并从查询本身显示了一个与预期不同的边界。

看看下面的区域: Orginal WitH Markers No markers

第一个显示所有标记。

然而,接下来的一个只是向上和向左移动了一半,但是区域的一半与上一张图片相同,但根本没有标记。我已将问题与地图的getBounds函数隔离开来。

这是我的javascript代码,它获取边界并进行调用:

var bounds = map.getBounds();
var southWest = bounds.getSouthWest();

var northEast = bounds.getNorthEast();
var data = {ne:northEast.toUrlValue(), sw:southWest.toUrlValue(), zoom:map.getZoom()};
//something getting messed up in the code above this point

$.ajax({
    type: "POST",
    url: 'maps/get-markers',
    data: {object:$.toJSON(data)},
    dataType: 'json',

    success: function(response) {
        //code to add markers
    }
});

在我的服务器端代码中,这是用于根据坐标获取项目的php:

$data =  Zend_Json::decode(stripslashes($this->_request->getParam('object')));

//retrieve the variables from the GET vars
list($nelat, $nelng) = explode(',', $data['ne']);
list($swlat, $swlng) = explode(',',$data['sw']);

//clean the data
$nelng  =   (float)$nelng;
$swlng  =   (float)$swlng;
$nelat  =   (float)$nelat;
$swlat  =   (float)$swlat;

$ubound = $swlng > $nelng ? $swlng : $nelng;
$lbound = $swlng > $nelng ? $nelng : $swlng;

$sql = 'SELECT `a`.* FROM `locations` AS `a` WHERE (a.`longitude` > $lbound) AND (a.`longitude` < $ubound) AND';

$ubound = $swlat > $nelat ? $swlat : $nelat;
$lbound = $swlat > $nelat ? $nelat : $swlat;


$sql .= ' (a.`latitude` >= $lbound) AND (a.`latitude` <= $ubound)';

我怀疑它在javascript中的getbounds函数但需要尽快修复它。任何想法请:(

2 个答案:

答案 0 :(得分:1)

我的页面与您描述的页面完全相同。这是我如何获得界限:

var bounds = map.getBounds();
var sw = bounds.getSouthWest();
var ne = bounds.getNorthEast();
var s = sw.lat();
var w = sw.lng();
var n = ne.lat();
var e = ne.lng();

然后我将每个值发送到服务器。我之前使用如下查询检查了边界内的点:

WHERE (lat BETWEEN $sBound AND $nBound) AND (lng BETWEEN $wBound AND $eBound)

但是,我最近发现当边界区域包含国际日期行时,此查询失败。这看起来不像你遇到的问题(它可能在解析边界时发生),但它肯定是你应该考虑的事情。以下是我修复它的方法:

if ($wBound > $eBound) { // if bounds includes the intl. date line
    $sql .= "WHERE (lat BETWEEN $sBound AND $nBound) AND ((lng BETWEEN -180 AND $eBound) OR (lng BETWEEN $w AND 180))";
} else {
    $sql .= "WHERE (lat BETWEEN $sBound AND $nBound) AND (lng BETWEEN $wBound AND $eBound)";
}

答案 1 :(得分:1)

如果从字面上复制代码:

$sql .= ' (a.`latitude` >= $lbound) AND (a.`latitude` <= $ubound)';

那么问题可能只是你在PHP文字中使用单引号而不是双引号。因此,$ lbound和$ ubound插值不会发生,并且您使用的是无效的SQL查询。

尝试:

$sql .= " (a.`latitude` >= $lbound) AND (a.`latitude` <= $ubound)";