Você pode ouvir o dragend
evento e, se o mapa for arrastado para fora dos limites permitidos, mova-o de volta para dentro. Você pode definir seus limites permitidos em um LatLngBounds
objeto e usar o contains()
método para verificar se o novo centro de latitude / longitude está dentro dos limites.
Você também pode limitar o nível de zoom com muita facilidade.
Considere o seguinte exemplo: Fiddle Demo
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Google Maps JavaScript API v3 Example: Limit Panning and Zoom</title>
<script type="text/javascript"
src="http://maps.google.com/maps/api/js?sensor=false"></script>
</head>
<body>
<div id="map" style="width: 400px; height: 300px;"></div>
<script type="text/javascript">
// This is the minimum zoom level that we'll allow
var minZoomLevel = 5;
var map = new google.maps.Map(document.getElementById('map'), {
zoom: minZoomLevel,
center: new google.maps.LatLng(38.50, -90.50),
mapTypeId: google.maps.MapTypeId.ROADMAP
});
// Bounds for North America
var strictBounds = new google.maps.LatLngBounds(
new google.maps.LatLng(28.70, -127.50),
new google.maps.LatLng(48.85, -55.90)
);
// Listen for the dragend event
google.maps.event.addListener(map, 'dragend', function() {
if (strictBounds.contains(map.getCenter())) return;
// We're out of bounds - Move the map back within the bounds
var c = map.getCenter(),
x = c.lng(),
y = c.lat(),
maxX = strictBounds.getNorthEast().lng(),
maxY = strictBounds.getNorthEast().lat(),
minX = strictBounds.getSouthWest().lng(),
minY = strictBounds.getSouthWest().lat();
if (x < minX) x = minX;
if (x > maxX) x = maxX;
if (y < minY) y = minY;
if (y > maxY) y = maxY;
map.setCenter(new google.maps.LatLng(y, x));
});
// Limit the zoom level
google.maps.event.addListener(map, 'zoom_changed', function() {
if (map.getZoom() < minZoomLevel) map.setZoom(minZoomLevel);
});
</script>
</body>
</html>
Captura de tela do exemplo acima. O usuário não conseguirá arrastar mais ao sul ou ao leste neste caso:
if (x < minX) x = minX;
eif (x > maxX) x = maxX;
não se excluem? Por que você centraliza a tela nas coordenadas minX / maxX e maxX / maxY embora elas não sejam coordenadas de centro?dragend
evento, você pode usardraggable: false
na instância do mapa ( exemplo de trabalho )center_changed
evento em vez dedragend
.A melhor maneira de restringir o nível de zoom seria usar as opções
minZoom
/ emmaxZoom
vez de reagir aos eventos?Ou as opções podem ser especificadas durante a inicialização do mapa, por exemplo:
Consulte: Referência da API JavaScript V3 do Google Maps
fonte
Boas notícias. A partir da versão 3.35 da Maps JavaScript API, lançada em 14 de fevereiro de 2019, você pode usar a nova
restriction
opção para limitar a janela de visualização do mapa.De acordo com a documentação
fonte: https://developers.google.com/maps/documentation/javascript/reference/map#MapRestriction
Então, agora você acabou de adicionar a opção de restrição durante a inicialização do mapa e isso. Dê uma olhada no exemplo a seguir que limita a janela de visualização à Suíça
Eu espero que isso ajude!
fonte
Para limitar o zoom em v.3 +. na configuração do mapa, adicione o nível de zoom padrão e os níveis de zoom minZoom ou maxZoom (ou ambos, se necessário) são de 0 a 19. Você deve declarar o nível de zoom surdo se a limitação for necessária. todos são sensíveis a maiúsculas e minúsculas!
fonte
Uma maneira muito melhor de limitar o intervalo ... usei a lógica contém do pôster acima.
fonte
this.googleMap
vez demap
para o segundo ouvinte? Também não deveriadragStart
serdragStartCenter
? Por último, o que émapBounds
?Isso pode ser usado para centralizar novamente o mapa em um local específico. Era disso que eu precisava.
fonte
fonte
Aqui está minha variante para resolver o problema de limitação da área visível.
strictBounds
é um objeto donew google.maps.LatLngBounds()
tipo.self.gmap
armazena um objeto Google Map (new google.maps.Map()
).Realmente funciona, mas não se esqueça de levar em consideração apenas as hemorróidas ao cruzar o 0º meridiano e os paralelos se seus limites os cobrirem.
fonte
Por algum motivo
não funcionou para mim (talvez um problema do hemisfério sul). Tive que mudar para:
Espero que ajude alguém.
fonte
Uma solução é, se você souber a lat / lng específica.
Se não tiver lat / lng específico
ou
fonte
Em meados de 2016 , não havia uma maneira oficial de restringir a área visível. A maioria das soluções ad-hoc para restringir os limites tem uma falha, porque não restringem os limites exatamente para caber na visualização do mapa, elas apenas o restringem se o centro do mapa estiver fora dos limites especificados. Se você quiser restringir os limites para imagens de sobreposição como eu, isso pode resultar em um comportamento como o ilustrado abaixo, onde o mapa de subjacência é visível sob nossa sobreposição de imagem:
Para resolver esse problema, criei uma biblioteca , que restringe os limites com sucesso para que você não possa deslocar-se para fora da sobreposição.
No entanto, como outras soluções existentes, ele tem um problema de "vibração". Quando o usuário move o mapa de forma agressiva o suficiente, depois de soltar o botão esquerdo do mouse, o mapa ainda continua a fazer panorâmica por si mesmo, diminuindo gradualmente a velocidade. Eu sempre coloco o mapa de volta nos limites, mas isso resulta em uma espécie de vibração. Este efeito panorâmico não pode ser interrompido por nenhum meio fornecido pela API Js no momento. Parece que até que o Google adicione suporte para algo como map.stopPanningAnimation (), não seremos capazes de criar uma experiência tranquila.
Exemplo usando a biblioteca mencionada, a experiência de limites estritos mais suave que consegui obter:
A biblioteca também é capaz de calcular a restrição mínima de zoom automaticamente. Em seguida, ele restringe o nível de zoom usando
minZoom
o atributo do mapa.Esperançosamente, isso ajude alguém que deseja uma solução que respeite totalmente os limites dados e não queira permitir que eles sejam ultrapassados.
fonte
Isso pode ser útil.
O nível de zoom pode ser personalizado de acordo com a necessidade.
fonte
e.g. only between levels 6 and 9
, ele define o nível de zoom padrão e remove a IU padrão (ou seja,+
/-
), que é um pouco exagero.