Você deve usar a CameraUpdate
classe para realizar (provavelmente) todos os movimentos programáticos do mapa.
Para fazer isso, primeiro calcule os limites de todos os marcadores da seguinte maneira:
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Marker marker : markers) {
builder.include(marker.getPosition());
}
LatLngBounds bounds = builder.build();
Em seguida, obtenha um objeto de descrição de movimento usando a fábrica CameraUpdateFactory
:
int padding = 0; // offset from edges of the map in pixels
CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
Por fim, mova o mapa:
googleMap.moveCamera(cu);
Ou se você quiser uma animação:
googleMap.animateCamera(cu);
Isso é tudo :)
Esclarecimento 1
Quase todos os métodos de movimento exigem que o Map
objeto tenha passado no processo de layout. Você pode esperar que isso aconteça usando a addOnGlobalLayoutListener
construção. Detalhes podem ser encontrados nos comentários a esta resposta e nas respostas restantes. Você também pode encontrar um código completo para definir a extensão do mapa usando addOnGlobalLayoutListener
aqui .
Esclarecimento 2
Um comentário observa que o uso desse método para apenas um marcador resulta no zoom do mapa definido para um nível de zoom "bizarro" (que eu acredito ser o nível máximo de zoom disponível para um determinado local). Eu acho que isso é esperado porque:
- A
LatLngBounds bounds
instância terá northeast
propriedade igual a southwest
, significando que a parte da área da terra coberta por isso bounds
é exatamente zero. (Isso é lógico, pois um único marcador não tem área.)
- Ao passar
bounds
para CameraUpdateFactory.newLatLngBounds
você, solicite essencialmente um cálculo desse nível de zoom que bounds
(com área zero) cubra toda a visualização do mapa.
- Você pode realmente executar esse cálculo em um pedaço de papel. O nível de zoom teórico que é a resposta é + ∞ (infinito positivo). Na prática, o
Map
objeto não suporta esse valor, portanto ele é fixado em um nível máximo mais razoável permitido para um determinado local.
Outra maneira de colocá-lo: como o Map
objeto pode saber qual nível de zoom deve escolher para um único local ? Talvez o valor ideal deva ser 20 (se representar um endereço específico). Ou talvez 11 (se representa uma cidade). Ou talvez 6 (se representa um país). A API não é tão inteligente e a decisão é sua.
Portanto, você deve simplesmente verificar se markers
possui apenas um local e, se houver, usar um dos seguintes:
CameraUpdate cu = CameraUpdateFactory.newLatLng(marker.getPosition())
- vá para a posição do marcador, deixe o nível de zoom atual intacto.
CameraUpdate cu = CameraUpdateFactory.newLatLngZoom(marker.getPosition(), 12F)
- vá para a posição do marcador, defina o nível de zoom para o valor escolhido arbitrariamente 12.
addOnGlobalLayoutListener()
oupost()
com um apropriadoRunnable
. Esta é exatamente a razão pela qual não é possível obter as coordenadas da tela do marcadoronCreate
- consulte stackoverflow.com/q/14429877/1820695 No entanto, você pode usar alguns métodos antes mesmo que o layout ocorra - por exemplo.CameraUpdateFactory.newLatLngBounds()
com 4 params .Google Map V2
A solução a seguir funciona no Android Marshmallow 6 (API 23, API 24, API 25, API 26, API 27, API 28). Também funciona no Xamarin.
fonte
assim
por exemplo, seu mapa do Google está dentro de RelativeLayout:
fonte
Não consegui usar o onGlobalLayoutlistener, então aqui está outra solução para evitar o
"Map size can't be 0. Most likely, layout has not yet occured for the map view. Either wait until layout has occurred or use newLatLngBounds(LatLngBounds, int, int, int) which allows you to specify the map's dimensions."
erro:fonte
A partir desse código, estou exibindo vários marcadores com zoom específico na tela do mapa.
// Variáveis declaradas
// Método para adicionar vários pontos de marcador com o ícone de desenho
// Para adicionar vários marcadores visíveis no mapa
fonte
Nota - Esta não é uma solução para a pergunta original. Esta é uma solução para um dos subproblemas discutidos acima .
Solução para @andr Esclarecimento 2 -
É realmente problemático quando há apenas um marcador nos limites e, devido a isso, o nível de zoom é definido para um nível muito alto ( nível 21 ). E o Google não fornece nenhuma maneira de definir o nível máximo de zoom neste momento. Isso também pode acontecer quando houver mais de um marcador, mas todos eles são bem próximos um do outro. Também o mesmo problema ocorrerá.
Solução - Suponha que você queira que seu mapa nunca ultrapasse o nível de zoom 16. Depois de fazer -
Verifique se o nível de zoom ultrapassou o nível 16 (ou o que você quiser) -
E se esse nível for maior que 16, o que será apenas se houver muito menos marcadores ou se todos estiverem muito próximos um do outro, basta diminuir o zoom do mapa nessa posição específica, definindo o nível de zoom para 16.
Dessa forma, você nunca terá o problema do nível de zoom "bizarro" explicado muito bem por @andr também.
fonte
isso ajudaria .. do google apis demos
para obter informações claras, consulte este URL. https://github.com/googlemaps/android-samples/blob/master/ApiDemos/app/src/main/java/com/example/mapdemo/MarkerDemoActivity.java
fonte
Eu tive um problema semelhante, usando o seguinte código resolveu o problema:
CameraUpdateFactory.newLatLngBounds(bounds, 200, 200, 5)
geralmente as diferenças de localização no meu caso não passam de duas cidades vizinhas.zoom para ajustar todos os marcadores no mapa google maps v2
fonte
Mostrar todos os marcadores com mapa do Google
Nestes métodos, armazene todos os marcadores e faça zoom automaticamente para mostrar todos os marcadores no mapa do google.
fonte
Use o método "getCenterCoordinate" para obter a coordenada central e use em CameraPosition.
fonte
Eu tenho uma outra maneira de fazer essa mesma coisa funciona perfeitamente. então, a idéia por trás de mostrar todos os marcadores na tela, precisamos de um centro de comprimento e nível de zoom. Aqui está a função que fornecerá os dois e precisará de todos os objetos Latlng do marcador como entrada.
Esta função retorna o objeto Pair que você pode usar como
em vez de usar o preenchimento para manter os marcadores longe dos limites da tela, você pode ajustar o zoom em -1.
fonte
http://i64.tinypic.com/2qjybh4.png
http://i63.tinypic.com/flzwus.png
http://i63.tinypic.com/112g5fm.png
fonte