2014-05-16 5 views
5

Ich versuche, ein benutzerdefiniertes Overlay in Google Maps für iOS mit GMSTileURLConstructor zu zeichnen.GMSTileURLConstructor gibt seltsame Daten für Zoom zurück

ich den folgenden Code bin mit meiner 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]; 
    }; 

zu bekommen, wenn ich die URL ausloggen, Zoom und zoomlevel ich die folgenden Informationen erhalten:

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

Zur gleichen Zeit , Ich zeichne den Kamerazoom auf, wenn die Kamera wechselt

Welche

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

Kann jemand die Diskrepanz in Zoomstufe Wert erklären und wie haben sie entsprechend anzupassen anmeldet?

+0

Welche Version von Google Map SDK verwenden Sie? 1.8.0 oder 1.7.2? – Ricky

+0

Sieht aus wie 1.7.2. – Jeremy1026

+0

Haben Sie das jemals gelöst? – funkybro

Antwort

6

Nachdem ich einige der Forschung getan hat, glaube ich, die Art und Weise Google behandelt die Zoomstufe für GMSTileLayer mit Zoomstufe für die camera of mapView nicht gleich ist.

GMSTileLayer Klassenreferenz

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

Bei Zoomstufe 0 der ganzen Welt ist ein Platz, der von einer einzelnen Kachel bedeckt, und der Koordinaten x und y beide 0 für diese Fliese. In Zoomstufe 1, ist die Welt mit 4 Kacheln bedeckt, wobei x und y 0 oder 1 sind, und so weiter.

Für die mapView Kamera

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

Die Zoomstufe der Kamera bestimmt den Maßstab der Karte. Bei größeren Zoom-Ebenen mehr Details können auf dem Bildschirm gesehen werden, während bei kleineren Zoom-Ebenen mehr der Welt auf dem Bildschirm zu sehen ist. Bei Zoomstufe 0 ist der Maßstab der Karte so bemessen, dass die gesamte Welt eine Breite von etwa 256 Punkten hat.

Wenn Sie den Zoomfaktor um 1 erhöhen, verdoppelt sich die Breite der Welt auf dem Bildschirm . Daher ist bei der Zoomstufe N die Breite der Welt ungefähr 256 * 2N, d.h. bei Zoomstufe 2 ist die gesamte Welt ungefähr 1024 Punkte breit. Beachten Sie, dass die Zoomstufe keine ganze Zahl sein muss. Der Bereich der Zoomstufen, der von der Karte zugelassen wird, hängt von einer Anzahl von Faktoren einschließlich Standort, Kartentyp und Bildschirmgröße ab.

Der Zoom für GMSTileLayer ist NSUInteger während der Zoom für camera ist float.Der Zoom für GMSTileLayer wird verwendet, um die Anzahl der Kacheln zu bestimmen. Während der Zoom für die Kamera verwendet wird, um die Anzahl der Punkte basierend auf der Formel 256 * 2N zu bestimmen.

Ich könnte falsch liegen, aber ich denke, beide Zoomstufen würden nicht übereinstimmen.

Nicht so verwandt: Google hat gerade iOS Maps SDK V1.8.1 veröffentlicht, das ein Problem im Zusammenhang mit GMSTileLayer gelöst und auch einen Absturz behoben hat.

+0

.... Wussten Sie, dass Google dieses Problem inzwischen gelöst hat? – user836026