2014-05-16 6 views
5

Sto cercando di disegnare una sovrapposizione personalizzata su Google Maps per iOS utilizzando GMSTileURLConstructor.GMSTileURLConstructor restituisce strani dati per lo zoom

Sto usando il seguente codice per ottenere il mio URL

GMSTileURLConstructor urls = ^(NSUInteger x, NSUInteger y, NSUInteger zoom) { 
     NSString *url = @""; 

     for (NSDictionary *limits in [selectedPropertyMap objectForKey:@"property_map_zoom_levels"]) { 
      int zoomLevel = [[limits objectForKey:@"level"] intValue]; 
      int tileMinX = 0; 
      int tileMaxX = 0; 
      int tileMinY = 0; 
      int tileMaxY = 0; 

      if ([limits objectForKey:@"tile_min_x"] != (id)[NSNull null]) { 
       tileMinX = [[limits objectForKey:@"tile_min_x"] intValue]; 
      } 
      if ([limits objectForKey:@"tile_max_x"] != (id)[NSNull null]) { 
       tileMaxX = [[limits objectForKey:@"tile_max_x"] intValue]; 
      } 
      if ([limits objectForKey:@"tile_min_y"] != (id)[NSNull null]) { 
       tileMinY = [[limits objectForKey:@"tile_min_y"] intValue]; 
      } 
      if ([limits objectForKey:@"tile_max_y"] != (id)[NSNull null]) { 
       tileMaxY = [[limits objectForKey:@"tile_max_y"] intValue]; 
      } 

      if (zoomLevel == (unsigned long)zoom) { 
       if ((tileMinX <= x) && (tileMaxX >= x) && (tileMinY <= y) && (tileMaxY >= y)) { 
        url = [NSString stringWithFormat:@"%@%@/%@/%@/%lu_%lu.png", MAP_URL, [property objectForKey:@"id"], [limits objectForKey:@"property_map_id"], [limits objectForKey:@"id"], (unsigned long)x, (unsigned long)y]; 
        NSLog(@"url -> %@/zoom %lu/%i",url, (unsigned long)zoom, zoomLevel); 
        return [NSURL URLWithString:url]; 
       } 
      } 
     } 
     return [NSURL URLWithString:url]; 
    }; 

Quando annoto l'URL, zoom e zoomLevel ottengo le seguenti informazioni:

2014-05-16 17:25:15.621 Application[24491:61003] url -> <BASEURL>/16/9/19/159786_195303.png/zoom 19/19

Allo stesso tempo, , Sto registrando lo zoom della fotocamera quando cambia la fotocamera

- (void)mapView:(GMSMapView *)mapView didChangeCameraPosition:(GMSCameraPosition *)position { 
    zoomLevelLabel.text = [NSString stringWithFormat:@"ZL: %.2f",position.zoom]; 
    NSLog(@"camera changed - zoom %f",position.zoom); 
    [self hideMarkersBasedOnZoom:position.zoom]; 
    if(position.zoom > 21) { 
     GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:position.target.latitude longitude:position.target.longitude zoom:21]; 
     [mapView_ setCamera:camera]; 
    } 
} 

che registra

2014-05-16 17:25:15.640 Application[24491:60b] camera changed - zoom 18.022364

Qualcuno può spiegare la discrepanza in termini di valore livello di zoom e come ce l'ha abbinare in modo appropriato?

+0

Quale versione di Google Map SDK in uso? 1.8.0 o 1.7.2? – Ricky

+0

Sembra 1.7.2. – Jeremy1026

+0

Hai mai risolto questo? – funkybro

risposta

6

Dopo che ho fatto qualche ricerca, credo che il modo in cui Google gestisce il livello di zoom per GMSTileLayer non è lo stesso con il livello di zoom per la camera of mapView.

GMSTileLayer Classe Riferimento

https://developers.google.com/maps/documentation/ios/reference/interface_g_m_s_tile_layer

A livello di zoom 0 tutto il mondo è un quadrato coperto da una singola piastrella, e le coordinate x ed y sono entrambi 0 per quella tessera. A livello di zoom 1, , il mondo è coperto da 4 riquadri con x e y pari a 0 o 1 e così via.

per la fotocamera MapView

https://developers.google.com/maps/documentation/ios/views#zoom

Il livello di zoom della fotocamera determina la scala della mappa. A maggiori livelli di zoom si possono vedere più dettagli sullo schermo, mentre a più piccoli livelli di zoom più del mondo può essere visto sullo schermo. Al livello di zoom 0, , la scala della mappa è tale che il mondo intero ha una larghezza di circa 256 punti pari a .

Aumentare il livello di zoom di 1 raddoppia la larghezza del mondo nella schermata . Quindi a livello di zoom N, la larghezza del mondo è approssimativamente di 256 * 2N, cioè, con il livello di zoom 2, il mondo intero è di circa 1024 punti di larghezza. Si noti che il livello di zoom non deve essere un numero intero. L'intervallo di livelli di zoom consentito dalla mappa dipende da un numero di fattori tra cui posizione, tipo di mappa e dimensioni dello schermo.

Lo zoom per GMSTileLayer è NSUInteger mentre lo zoom per camera è float.Lo zoom per GMSTileLayer viene utilizzato per determinare il numero di piastrelle . Mentre lo zoom per la fotocamera viene utilizzato per determinare il numero di punti in base alla formula 256 * 2N.

Potrei sbagliarmi ma penso che entrambi i livelli di zoom non sarebbero stati abbinati.

Non così collegato: Google ha appena rilasciato iOS Maps SDK V1.8.1 che ha risolto un problema relativo a GMSTileLayer e ha anche risolto un arresto anomalo.

+0

.... Sapevi che Google ha già risolto i problemi? – user836026