2011-02-18 18 views
11

Harita bölgesini, tüm pin-ek açıklamaları aynı anda gösterecek şekilde ayarlamanızı öneriyorum (orta ve açık).iPhone MKMapView: Haritadaki tüm iğneler göstermek için haritayı göster

Uzun/lat koordinatlarını NSString'den double, resp. Onlarla hesaplamalar yapmak.

- (void)updateMemberPins{ 

//calculate new region to show on map 
double center_long = 0.0f; 
double center_lat = 0.0f; 
double max_long = 0.0f; 
double min_long = 0.0f; 
double max_lat = 0.0f; 
double min_lat = 0.0f; 

for (Member *member in members) { 

    //find min and max values 
    if ([member.locLat doubleValue] > max_lat) {max_lat = [member.locLat doubleValue];} 
    if ([member.locLat doubleValue] < min_lat) {min_lat = [member.locLat doubleValue];} 
    if ([member.locLong doubleValue] > max_long) {max_long = [member.locLong doubleValue];} 
    if ([member.locLong doubleValue] < min_long) {min_long = [member.locLong doubleValue];} 

    //sum up long and lang to get average later 
    center_lat = center_lat + [member.locLat doubleValue]; 
    center_long = center_long + [member.locLong doubleValue]; 
} 

//calculate average long/lat 
center_lat = center_lat/[members count]; 
center_long = center_long/[members count]; 

NSLog(@"center long: %d, center lat: %d", center_long, center_lat); 
NSLog(@"max_long: %d, min_long: %d, max_lat: %d, min_lat: %d", max_long, min_long, max_lat, min_lat); 

//create new region and set map 
CLLocationCoordinate2D coord = {latitude: center_lat, longitude: center_long}; 
MKCoordinateSpan span = MKCoordinateSpanMake(abs(max_lat) + abs(min_lat), abs(max_long) + abs(min_long)); 
MKCoordinateRegion region = {coord, span}; 
[resultMapView setRegion:region]; 

//remove all pins from map 
[resultMapView removeAnnotations:resultMapView.annotations]; 

//show member pins 
for (id member in members) { 
    [resultMapView addAnnotation:(Member *) member]; 
} 

}

log-çıkış sonucu olduğunu:

merkezi uzun: İşte kullanıyorum kodudur -1946827116, merkez lat: 1075651472

max_long: -6267216, min_long: 1076018553, max_lat: 0, min_lat: 0

Ben incelerim Bu problem, (yanlış) NSString'den double'a değerleri dönüştürmekten geliyor, ancak çalışmasını sağlamanın bir yolunu bulamıyorum ... Konum dizelerinin biçimi '43 .5686473 'gibidir.

Herhangi bir ipucu? Cheerz

+0

min max lat lon için başlangıç ​​değerleriniz yanlış. Şunları deneyin: double max_long = -360.0f; çift ​​min_long = 360.0f; çift ​​max_lat = -360.0f; çift ​​min_lat = 360.0f; – igrek

+0

ve açıklık hesaplamaları? neden onları ekleyin? Ve aynı zamanda abs çift int döndürmez yani fabs olmalıdır: MKCoordinateSpan span = MKCoordinateSpanMake (fabs (max_lat - min_lat), fabs (max_long - min_long)); – igrek

+0

Yine de teşekkürler, +1 biraz zaman – igrek

cevap

5

yerine NSLog() kısım böyle %d Değişim, %f kullanmalıdır) NSLog (çift değerini göstermek için:

NSLog(@"center long: %f, center lat: %f", center_long, center_lat); 
NSLog(@"max_long: %f, min_long: %f, max_lat: %f, min_lat: %f", max_long, min_long, max_lat, min_lat); 

Ayrıca MKMapView bölgeyi kullanarak kendi yapım daha basittir. Bir kez zoom oranı ile ayarlandığında, tek ihtiyacınız olan harita etrafında farklı koordinatlarla dinamik olarak hareket etmektir.

MKCoordinateRegion region = self.mapView.region; 
region.center = centerCoordinate; 
region.span.longitudeDelta /= ratioZoomMax; // Bigger the value, closer the map view 
region.span.latitudeDelta /= ratioZoomMax; 
[self.mapView setRegion:region animated:YES]; // Choose if you want animate or not 
+0

Hey Peter! Cevabınız için teşekkürler. NSLog ifadesi ile haklısınız. Ancak, bu tahmin yanlış hesaplara neden olmaz ... OranZoom varyantı güzel, ama bu oranı bilmiyorum. Harita üzerinde görünmesi gereken 'en dış koordinatlar' var ... – pawi

+0

Evet, yanlış Log-ifadesinin bana verdiği kötü numaralarla karıştırıldığımı ortaya çıkardı. Daha sonra, calc'ımda bazı hatalar yaptım - ve aynı zamanda kötü veriler (0, 0 koordinatları). – pawi

+0

"ratioZoomMax" öğesini daha geniş bir alan göstermek için daha küçük olacak ve birbirinden uzaktaki iğneleri gösterecek şekilde değiştirebilirsiniz. Kodunuzu tekrar okuyarak, merkez değerini bulmak için gereksiz ek yaptığınızı keşfettim.Daha önce de düşündüğünüz gibi, merkezi bulmak için, sadece '' [count count] ' – petershine

22

benzer bir şey arayanlar için son çalışma kodu:

- (void)updateMemberPins{ 

    //remove all pins from map 
    [resultMapView removeAnnotations:resultMapView.annotations]; 

    if ([members count] > 0) { 

     @try { 
      //calculate new region to show on map   
      Member *firstMember = [members objectAtIndex:0]; 
      double max_long = [firstMember.locLong doubleValue]; 
      double min_long = [firstMember.locLong doubleValue]; 
      double max_lat = [firstMember.locLat doubleValue]; 
      double min_lat = [firstMember.locLat doubleValue]; 

      //find min and max values 
      for (Member *member in members) { 
       if ([member.locLat doubleValue] > max_lat) {max_lat = [member.locLat doubleValue];} 
       if ([member.locLat doubleValue] < min_lat) {min_lat = [member.locLat doubleValue];} 
       if ([member.locLong doubleValue] > max_long) {max_long = [member.locLong doubleValue];} 
       if ([member.locLong doubleValue] < min_long) {min_long = [member.locLong doubleValue];} 
      } 

      //calculate center of map 
      double center_long = (max_long + min_long)/2; 
      double center_lat = (max_lat + min_lat)/2; 

      //calculate deltas 
      double deltaLat = abs(max_lat - min_lat); 
      double deltaLong = abs(max_long - min_long); 

      //set minimal delta 
      if (deltaLat < 5) {deltaLat = 5;} 
      if (deltaLong < 5) {deltaLong = 5;} 

      //debug 
      //NSLog(@"center long: %f, center lat: %f", center_long, center_lat); 
      //NSLog(@"max_long: %f, min_long: %f, max_lat: %f, min_lat: %f", max_long, min_long, max_lat, min_lat); 

      //create new region and set map 
      CLLocationCoordinate2D coord = {latitude: center_lat, longitude: center_long}; 
      MKCoordinateSpan span = MKCoordinateSpanMake(deltaLat, deltaLong); 
      MKCoordinateRegion region = {coord, span}; 
      [resultMapView setRegion:region]; 


     } 
     @catch (NSException * e) { 
      NSLog(@"Error calculating new map region: %@", e); 
     } 
     @finally { 
      //show member pins 
      for (id member in members) { 
       [resultMapView addAnnotation:(Member *) member]; 
      } 
     } 



    } 

} 
+5

abs() yerine fabs() kullanarak daha iyi olabilir. abs() bana bazı problemler verdi. –

2
//show member pins 
     for (id member in members) { 
      [resultMapView addAnnotation:(Member *) member]; 
     } 

Bu Sadece bu kod barış kullanabilirsiniz

[resultMapView addAnnotations:members]; 
0

ile değiştirilebilir:

-(void)updateMemberPins 
{ 
    if([members count] == 0) 
     return; 

    double minLat = 90; 
    double minLon = 180; 
    double maxLat = -90; 
    double maxLon = -180; 

    for(Member *member in members) 
    { 
     minLat = fmin(minLat, [member.locLat doubleValue]); 
     minLon = fmin(minLon, [member.locLong doubleValue]); 
     maxLat = fmax(maxLat, [member.locLat doubleValue]); 
     maxLon = fmax(maxLon, [member.locLong doubleValue]); 
    } 

    NSLog(@"MAX LAT: %f, MIN LAT: %f, MAX LONG: %f, MIN LONG: %f,", maxLat, minLat, maxLon, minLon); 

    double midLat = (minLat + maxLat)/2; 
    double midLong = (minLon + maxLon)/2; 

    double deltaLat = abs(maxLat - minLat); 
    double deltaLong = abs(maxLon - minLon); 

    if (deltaLat < 5) {deltaLat = 5;} 
    if (deltaLong < 5) {deltaLong = 5;} 

    //... 
}