Google지도 - 패닝 및 영역을 확대하는 - 확대하거나 팬을 확대하거나 팬에 표시되지 않음 마커
-
11-09-2019 - |
문제
Google지도에 표시 할 서버 엔드에서 일부 경계 기반 클러스터링을 구현하고 있습니다. 내가하고있는 것은 맵이 움직이거나 패닝 또는 확대 될 때마다 호출되는 함수가 있다는 것입니다. 맵의 한계를 취하고 Ajax 호출을하는 서버 측 스크립트는 간단한 SQL 쿼리를 실행하여 마커와 클러스터. 지금까지 클러스터링 부분이 잘 작동하지만 때로는 GetBounds가 내가 느끼는 올바른 경계를 보내지 않는 것 같습니다.
내가 측면에 약간의지도를 팬 그리고 이제 마커가있는 영역에 갑자기 마커가 모두 마커가없고지도는 비어있을 수 있습니다. SQL 쿼리를 확인했고 쿼리 자체에서 예상되는 것과는 엄청나게 다른 범위를 보여줍니다.
아래 지역을 살펴보십시오.
첫 번째는 모든 마커를 보여줍니다.
그러나 다음은 방금 맨 위와 왼쪽으로 조금 옮겨졌지만 지역의 절반은 이전 그림과 동일하지만 마커는 전혀 없습니다. 나는 맵의 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)";
등.