Respuesta

23

hay una función que acepta dos MKMapRectUnionMKMapRects por lo que primero podría convertir cada MKCoordinateRegion a un MKMapRect y luego llamar a esa función (y convertir el resultado a un MKCoordinateRegion usando la función MKCoordinateRegionForMapRect).

El método de conversión podría tener este aspecto:

- (MKMapRect)mapRectForCoordinateRegion:(MKCoordinateRegion)coordinateRegion 
{ 
    CLLocationCoordinate2D topLeftCoordinate = 
     CLLocationCoordinate2DMake(coordinateRegion.center.latitude 
       + (coordinateRegion.span.latitudeDelta/2.0), 
      coordinateRegion.center.longitude 
       - (coordinateRegion.span.longitudeDelta/2.0)); 

    MKMapPoint topLeftMapPoint = MKMapPointForCoordinate(topLeftCoordinate); 

    CLLocationCoordinate2D bottomRightCoordinate = 
     CLLocationCoordinate2DMake(coordinateRegion.center.latitude 
       - (coordinateRegion.span.latitudeDelta/2.0), 
      coordinateRegion.center.longitude 
       + (coordinateRegion.span.longitudeDelta/2.0)); 

    MKMapPoint bottomRightMapPoint = MKMapPointForCoordinate(bottomRightCoordinate); 

    MKMapRect mapRect = MKMapRectMake(topLeftMapPoint.x, 
          topLeftMapPoint.y, 
          fabs(bottomRightMapPoint.x-topLeftMapPoint.x), 
          fabs(bottomRightMapPoint.y-topLeftMapPoint.y)); 

    return mapRect; 
} 

Entonces, para hacer realidad la unión:

MKCoordinateRegion region1 = ... 
MKCoordinateRegion region2 = ... 

MKMapRect mapRect1 = [self mapRectForCoordinateRegion:region1]; 
MKMapRect mapRect2 = [self mapRectForCoordinateRegion:region2]; 

MKMapRect mapRectUnion = MKMapRectUnion(mapRect1, mapRect2); 

MKCoordinateRegion regionUnion = MKCoordinateRegionForMapRect(mapRectUnion); 
+0

Ese wa Es exactamente lo que estaba buscando, muchas gracias – foux

0

que hice una pequeña prueba tanto en 4.3 y 5.0 y parece que la conversión no es correcto

UIImageView *imageView = [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"heart.png"] imageByScalingProportionallyToSize:CGSizeMake(100, 100)]]; 
imageView.frame = CGRectMake(0, 0, 100, 100); 
imageView.center = [mapView convertCoordinate:mapView.centerCoordinate toPointToView:canvasView]; 
[canvasView addSubview:imageView]; 

MKCoordinateRegion region = [mapView convertRect:imageView.frame toRegionFromView:canvasView]; 
MKMapRect maprect; 
for (int i = 0; i < 5; i ++) 
{ 
    maprect = [mapView mapRectForCoordinateRegion:region]; 
    NSLog(@"%f, %f, %f, %f", region.center.latitude, region.center.longitude, region.span.latitudeDelta, region.span.longitudeDelta); 
    NSLog(@"%f, %f, %f, %f", maprect.origin.x, maprect.origin.y, maprect.size.width, maprect.size.height); 
    region = MKCoordinateRegionForMapRect([mapView mapRectForCoordinateRegion:region]); 
} 


14,718256, -40.078125, 63.837150, 70,312500
78118912,000000, 94.811.514,406252, 52.428.800,000000, 52428799,999997
17,416993, -40.078125, 63.837150, 70,312500
78118912,000000, 91.803.983,982924, 52.428.800,000000, 53344239,567355
20,649080, -40.078125, 63.837150, 70.312500
78.118.912,000000, 87.976.363,978412, 52.428.800,000000, 54699220,734715
24,548345, -40.078125, 63.837150, 70,312500
78118912,000000, 82962597.189840, 52.428.800,000000, 56765991.576236
29,305644, -40.078125, 63.837150, 70,312500
78118912,000000, 76.093.086,024249, 52.428.800,000000, 60073659,997575

1

Si alguien está buscando un equivalente rápida usando extensiones,

extension MKCoordinateRegion { 
    func mapRectForCoordinateRegion() -> MKMapRect { 
     let dLat = span.latitudeDelta/2.0 
     let dLon = span.longitudeDelta/2.0 

     let topLeft = MKMapPointForCoordinate(
      CLLocationCoordinate2DMake(center.latitude + dLat, center.longitude - dLon)) 
     let botRight = MKMapPointForCoordinate(
      CLLocationCoordinate2DMake(center.latitude - dLat, center.longitude + dLon)) 

     return MKMapRectMake(
      topLeft.x, 
      topLeft.y, 
      fabs(botRight.x - topLeft.x), 
      fabs(botRight.y - topLeft.y)) 
    } 

    func unionWith(region: MKCoordinateRegion) -> MKCoordinateRegion { 
     let union = MKMapRectUnion(
      self.mapRectForCoordinateRegion(), 
      region.mapRectForCoordinateRegion()) 

     return MKCoordinateRegionForMapRect(union) 
    } 
} 

Y se puede utilizar como

let region1 = ... 
let region2 = ... 

let regionUnion = region1.unionWith(region2) 
Cuestiones relacionadas