Zoom e Região do MKMapView

Estou familiarizado com o uso da API Javascript do Google Maps. Recentemente, comecei a usar o framework MapKit para um projeto de iphone, mas estou tendo dificuldades para descobrir o zoom e definir uma região no mapa.

Na API do Google Maps, costumava usar níveis de zoom inteiro como 8, 9, 10, além da function direta setZoom (). O único método equivalente que posso ver na estrutura do MapKit é setRegion: animated. Pelo que entendi, preciso definir os valores “delta” de latitude e longitude de uma região para especificar o nível de zoom. Mas eu realmente não tenho idéia do que esses valores representam (eu li a documentação).

Quando eu uso um delegado MKMapView e rastreio os valores de intervalo em resultados de método delegado regionDidChange não parecem correlacionar uns aos outros. Tudo bem quando eu diminuo o zoom e vejo que os valores de span delta estão aumentando conforme especificado na documentação. Mas de repente eu arrasto o mapa sem zoom e os valores delta se tornam 0.0.

Alguém pode, por favor, explicar qual é o ponto de referência para esses espaços e delta? Ou existe algum algoritmo para converter um nível de zoom inteiro (como 9) para esses valores delta?

Como pergunta bônus existe alguma maneira de especificar um nível de zoom mínimo-máximo em um MKMapView 🙂

obrigado

Primeiro de tudo, o MKMapView não usa / tem um conjunto predefinido de níveis de zoom, como o Google Maps faz.

Em vez disso, a área visível de um MKMapView é descrita usando MKCoordinateRegion , que consiste em dois valores:

  1. centro (o ponto central da região) e
  2. span (o tamanho da área visível ao redor do centro).

O ponto central deve ser óbvio (é o ponto central da região).

No entanto, span (que é um MKCoordinateSpan ) consiste em:

  1. latitudeDelta (a distância vertical representada pela região) e
  2. longitudeDelta (a distância horizontal representada pela região).

Um breve exemplo. Aqui está um brinquedo MKCoordinateRegion:

  1. Centro:
    • latitude: 0
    • longitude: 0
  2. período:
    • latitudeDelta: 8
    • longitudeDelta: 6

A região poderia ser descrita usando suas coordenadas mín e máximas como segue:

  1. coordenada min (ponto inferior esquerdo):
    • latitude: -4
    • longitude: -3
  2. coordenada máxima (ponto superior direito):
    • latitude: 4
    • longitude: 3

Assim, você pode especificar os níveis de zoom em torno de um ponto central usando um MKCoordinateSpan de tamanho apropriado. Como uma aproximação dos níveis de zoom numérico do Google, você pode fazer engenharia reversa dos tamanhos de intervalo que o Google usa para um determinado nível de zoom e criar um intervalo de acordo. O Google descreve suas regiões de visualização da mesma forma que o MKMapView, como um centro + span, para que você possa extrair esses valores do Google Maps.

Quanto a restringir a região, você pode jogar com este método delegado:

mapView:regionWillChangeAnimated 

por exemplo, redimensionando a região de volta aos seus níveis de zoom permitidos. (Mais ou menos da mesma forma como as visualizações de tabela permitem que você role para fora da borda, mas, então, encheckboxrá de novo no lugar.) No entanto, sua milhagem pode variar, uma vez que não a usei para essa finalidade.

btw, há correções / melhorias definitivas no OS 3.1 para aspectos do MapKit que estavam me dando problemas em 3.0.

Se você preferir usar níveis explícitos de zoom em vez de definir um MKCoordinateSpan, escrevi uma categoria que adiciona suporte para especificar o nível de zoom de um MKMapView. O código pode ser encontrado aqui .

O intervalo é em graus de latitude e longitude. Existe um método para construir estruturas MKCoordinateRegion que leva distância, em vez disso. Pode ser que você esteja usando MKCoordinateRegionMakeWithDistance para especificar o intervalo e, em seguida, ao verificá-lo em regionDidChange, estará vendo no período de latitude / longitude, que é como ele é armazenado em uma estrutura MKCoordinateRegion.

Até onde eu sei, os níveis de zoom de inteiros não estão disponíveis ou são úteis quando se trabalha com o MKMapKit. Eu pessoalmente prefiro usar as figuras de span, é mais flexível.

Você não pode especificar zoom máximo e mínimo, e eu não sei de uma maneira de invadir. MKMapKit é realmente muito fraco agora, estou muito desapontado com a falta de resources.

Uma comparação rápida dos níveis de zoom de um local usando maps.google.com inspecionando a cadeia de consulta do link mostra que os valores de span e dx aumentam por um fator de 2:

  (0.005334, 0.011834) starting span (0.010668, 0.023668) dx: x2, dy: x2 (0.021335, 0.047337) dx: x2, dy: x2 (0.042671, 0.094671) dx: x2, dy: x2 ... 

A categoria de Brant no MKMapView funciona bem. No entanto, parece que não foi atualizado para suportar dispositivos mais recentes com canvass de retina ao calcular mapSizeInPixels.

Pode ser corrigido substituindo esta linha:

 CGSize mapSizeInPixels = mapView.bounds.size; 

Com esta linha:

 CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);