terça-feira, 27 de abril de 2010

Marcadores como resposta de um serviço por bounding box

Quando temos uma aplicação em Google Maps (ou OpenLayers, ou outra) e fazemos uma chamada a um serviço dando como parâmetros uma bounding box, geralmente utilizamos o resultado para adicionar marcadores ao mapa (com ou sem informação associada) em que as coordenadas dos marcadores a adicionar fazem parte da resposta do serviço.

Se fizermos chamadas sucessivas a esse serviço, por exemplo na sequência de um evento "moveend" registado, teremos que garantir que não vamos adicionar ao mapa marcadores já existentes.

Assim, de forma a que não existam marcadores duplicados é necessário percorrer a resposta do serviço (ou uma cópia desta) e testar se já existe algum marcador sobre o mapa com as mesmas coordenadas. Isso pode ser feito recorrendo a uma função a qual recebe como parâmetro as coordenadas a testar:


function isOnTheMap(latlng) {
for (var i=0; i < markers.length ; ++i) {
if ( markers[i].getLatLng().equals(latlng)) {
return true;
}
}
return false;
}


Outra questão consiste em garantir que os marcadores que já estavam sobre o mapa e que não façam parte da bounding box, sejam removidos do mapa. Ou seja, garantir que não existem marcadores adicionados ao mapa fora da vieweport. Mais uma vez podemos recorrer a uma função:


function removeMarkers() {
var tmpMarkers = markers;
for (var i = 0; i < tmpMarkers.length; ++i) {
var marker = tmpMarkers[i];
if (bounds.containsLatLng(marker.getLatLng())) {
continue;
}
map.removeOverlay(marker);
markers.splice(i,1);
}
}

Neste caso poderá também ser necessário garantir a remoção de eventuais eventos registados.

Para que ambos exemplos resultem é ainda necessário que aquando da criação de cada marcador seja este adicionado a um array que vá guardando os nossos marcadores:


markers.push(marker);




Sem comentários:

Enviar um comentário