Google지도 - 패닝 및 영역을 확대하는 - 확대하거나 팬을 확대하거나 팬에 표시되지 않음 마커

StackOverflow https://stackoverflow.com/questions/1090690

문제

Google지도에 표시 할 서버 엔드에서 일부 경계 기반 클러스터링을 구현하고 있습니다. 내가하고있는 것은 맵이 움직이거나 패닝 또는 확대 될 때마다 호출되는 함수가 있다는 것입니다. 맵의 한계를 취하고 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 기능을 의심하지만 최대한 빨리 수정해야합니다. 모든 아이디어를 제발 :(

도움이 되었습니까?

해결책

나는 당신이 당신의 설명과 똑같은 방식으로 작동하는 페이지가 있습니다. 내가 바운드를 얻는 방법은 다음과 같습니다.

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

다른 팁

이것이 문자 그대로 코드에서 복사 된 경우 :

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

그런 다음 문제는 단순히 PHP 리터럴에서 두 배가 아닌 단일 따옴표를 사용한다는 것일 수 있습니다. 따라서 $ lbound 및 $ ubound 보간은 발생하지 않으며 유효하지 않은 SQL 쿼리를 사용하고 있습니다.

노력하다:

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

등.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top