Eu tenho um conjunto de pontos que quero plotar em um Google Map incorporado (API v3). Eu gostaria que os limites acomodassem todos os pontos, a menos que o nível de zoom esteja muito baixo (ou seja, diminua o zoom demais). Minha abordagem tem sido assim:
var bounds = new google.maps.LatLngBounds();
// extend bounds with each point
gmap.fitBounds(bounds);
gmap.setZoom( Math.max(6, gmap.getZoom()) );
Isso não funciona. A última linha "gmap.setZoom ()" não altera o nível de zoom do mapa se chamado diretamente após fitBounds.
Existe uma maneira de obter o nível de zoom de um limite sem aplicá-lo ao mapa? Outras idéias para resolver isso?
Respostas:
Editar : Veja o comentário de Matt Diamond abaixo.
Entendi! Tente o seguinte:
Modifique para suas necessidades.
fonte
Resolvi um problema semelhante em um dos meus aplicativos. Fiquei um pouco confuso com a descrição do problema, mas acho que você tem o mesmo objetivo que eu ...
No meu aplicativo, eu queria plotar um ou mais marcadores e garantir que o mapa estivesse mostrando todos eles. O problema era que, se eu confiasse apenas no método fitBounds, o nível de zoom seria maximizado quando houvesse um único ponto - isso não seria bom.
A solução foi usar fitBounds quando havia muitos pontos e setCenter + setZoom quando havia apenas um ponto.
fonte
Eu vim a esta página várias vezes para obter a resposta e, embora todas as respostas existentes tenham sido super úteis, elas não resolveram exatamente o meu problema.
Basicamente, descobri que o evento 'zoom_changed' impedia que a interface do usuário do mapa "pulasse", o que aconteceu quando eu esperei pelo evento "ocioso".
Espero que isso ajude alguém!
fonte
fitBounds()
se estiver usandozoom_changed
bounds_changed
, porquezoom_changed
não precisa ser acionado no caso em quefitBounds
mantém o nível de zoom. Minha tentativa jsfiddle.net/rHeMp/10 não confirma isso, mas não se deve confiar em um comportamento indefinido.Eu consertei isso configurando o maxZoom com antecedência e removendo-o depois. Por exemplo:
fonte
Se não me engano, suponho que você queira que todos os seus pontos sejam visíveis no mapa com o maior nível de zoom possível. Consegui isso inicializando o nível de zoom do mapa para 16 (não tenho certeza se é o nível de zoom mais alto possível na V3).
Depois disso eu fiz as coisas de limites:
Resultado: Sucesso!
fonte
Eu uso:
Isso usará o menor de 24 e o nível de zoom necessário de acordo com o seu código, no entanto, provavelmente altera o zoom de qualquer maneira e não se importa com o quanto você diminuiu o zoom.
fonte
Por favor tente isto:
fonte
Eu tive o mesmo problema e consegui resolvê-lo usando o código a seguir. Este
google.maps.addListenerOnce()
evento listener ( ) será acionado apenas uma vez, logo após amap.fitBounds()
execução. Portanto, não há necessidade deidle
.Inicialmente, define o nível de zoom apropriado e permite ao usuário aumentar e diminuir o zoom além do nível de zoom inicial, porque o ouvinte de eventos expirou. Por exemplo, se apenas
google.maps.addListener()
fosse chamado, o usuário nunca seria capaz de aumentar o zoom além do nível de zoom indicado (no caso, 4). Desde que implementamosgoogle.maps.addListenerOnce()
, o usuário poderá aumentar o zoom para qualquer nível que escolher.fonte
Teve o mesmo problema, necessário para ajustar muitos marcadores no mapa. Isso resolveu meu caso:
bounds.extend(objLatLng)
)Execute fitbounds APÓS o mapa ser concluído:
fonte
Encontrei uma solução que faz a verificação antes de ligar,
fitBounds
para você não aumentar o zoom e diminuir o zoom repentinamenteVocê terá que brincar um pouco com a variável minLatSpan para chegar onde quiser. Isso variará com base no nível de zoom e nas dimensões da tela do mapa.
Você também pode usar longitude em vez de latitude
fonte
Vi muitas soluções incorretas ou muito complicadas, então decidi postar uma solução elegante e funcional .
O motivo
setZoom()
que não funciona como você espera é quefitBounds()
é assíncrono, portanto não garante que atualizaria imediatamente o zoom, mas sua ligaçãosetZoom()
depende disso.O que você pode considerar é definir a
minZoom
opção de mapa antes de ligarfitBounds()
e limpá-la após a conclusão (para que os usuários ainda possam diminuir o zoom manualmente, se quiserem):Além disso, se você também quiser limitar o zoom máximo, poderá aplicar o mesmo truque com a
maxZoom
propriedadeVeja os documentos do MapOptions .
fonte
Eu uso isso para garantir que o nível de zoom não exceda um nível definido, para que eu saiba que as imagens de satélite estarão disponíveis.
Adicione um ouvinte ao
zoom_changed
evento. Isso tem o benefício adicional de controlar também o controle de zoom na interface do usuário.Execute apenas
setZoom
se for necessário; portanto, umaif
instrução é preferível aMath.max
ouMath.min
Para evitar diminuir o zoom muito:
fonte
Nesta função, você precisa adicionar dinamicamente metadados para armazenar o tipo de geometria apenas porque a função aceita qualquer geometria.
"fitGeometries" é uma função JSON que estende um objeto de mapa.
"geometries" é uma matriz javascript genérica, não uma MVCArray ().
fonte
este trabalho é para mim com a API v3, mas com a configuração de zoom fixo:
fonte
Como eu, se você não está disposto a brincar com os ouvintes, esta é uma solução simples que eu criei: Adicione um método no mapa que funcione estritamente de acordo com seus requisitos, como este:
em seguida, você pode ligar em
map.fitLmtdBounds(bounds)
vez demap.fitBounds(bounds)
definir os limites sob o intervalo de zoom definido ... oumap.fitLmtdBounds(bounds,3,5)
substituir o intervalo de zoom.fonte
Por favor, tente isso.
Se isso for útil para você.
Muito bem sucedida
fonte
Após o cálculo das fronteiras, você pode verificar a distância entre o canto superior esquerdo e o inferior direito; então, você pode entender o nível de zoom testando a distância (se a distância estiver muito longe, o nível de zoom seria baixo), então você pode selecionar se usa o método definido ou o setZoom.
fonte
Não gosto de sugerir, mas se você deve tentar - primeira chamada
gmap.fitBounds(bounds);
Em seguida, crie um novo Thread / AsyncTask, deixe-o dormir por 20 a 50 ms ou mais e chame
gmap.setZoom( Math.max(6, gmap.getZoom()) );
do thread da interface do usuário (use um manipulador ou o
onPostExecute
método para AsyncTask).Não sei se funciona, apenas uma sugestão. Fora isso, você teria que calcular o nível de zoom de seus pontos, verificar se está muito baixo, corrigi-lo e ligar para
gmap.setZoom(correctedZoom)
fonte
Se 'bounds_changed' não estiver sendo disparado corretamente (às vezes o Google parece não aceitar coordenadas perfeitamente), considere usar 'center_changed'.
O evento 'center_changed' é acionado toda vez que fitBounds () é chamado, embora seja executado imediatamente e não necessariamente após a movimentação do mapa.
Em casos normais, 'inativo' ainda é o melhor ouvinte de eventos, mas isso pode ajudar algumas pessoas a enfrentar problemas estranhos com suas chamadas fitBounds ().
Ver retorno de chamada fitBounds do google maps
fonte
Para entrar em contato com outra solução - descobri que a abordagem "escute bounds_changed e depois defina um novo zoom" não funcionou de maneira confiável para mim. Acho que às vezes estava ligando
fitBounds
antes que o mapa fosse totalmente inicializado e a inicialização estava causando um evento bounds_changed que usaria o ouvinte, antes defitBounds
alterar os limites e o nível de zoom. Acabei com este código, que parece funcionar até agora:fonte
Para mim, a solução mais fácil foi a seguinte:
fonte
fonte
Tudo o que fiz foi:
E funciona na API V3.
fonte