Objective c 如何使两个区域的联合协调

Objective c 如何使两个区域的联合协调,objective-c,cocoa-touch,mapkit,mkmapview,mkcoordinateregion,Objective C,Cocoa Touch,Mapkit,Mkmapview,Mkcoordinateregion,我想在两个协调区之间建立联盟。有人知道怎么做吗?有一个MKMapRectUnion函数,它接受两个MKMapRects,因此您可以首先将每个MKCoordinateRegion转换为MKMapRect,然后调用该函数(并使用mkCoordinatereRegionformaprect函数将结果转换回mkCoordinatereRegion) 转换方法可能如下所示: - (MKMapRect)mapRectForCoordinateRegion:(MKCoordinateRegion)coordi

我想在两个协调区之间建立联盟。有人知道怎么做吗?

有一个
MKMapRectUnion
函数,它接受两个
MKMapRects
,因此您可以首先将每个
MKCoordinateRegion
转换为
MKMapRect
,然后调用该函数(并使用
mkCoordinatereRegionformaprect
函数将结果转换回
mkCoordinatereRegion

转换方法可能如下所示:

- (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;
}
然后,要真正实现联盟:

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

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

MKMapRect mapRectUnion = MKMapRectUnion(mapRect1, mapRect2);

MKCoordinateRegion regionUnion = MKCoordinateRegionForMapRect(mapRectUnion);

我对4.3和5.0都做了一个小测试,似乎转换不正确

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]);
}
UIImageView*imageView=[[UIImageView alloc]initWithImage:[[UIImage ImageName:@“heart.png”]ImageByScalingProgressionlyToSize:CGSizeMake(100100)];
imageView.frame=CGRectMake(0,0,100,100);
imageView.center=[mapView convertCoordinate:mapView.centerCoordinate toPointToView:canvasView];
[canvasView添加子视图:imageView];
MKCoordinateRegion region=[mapView convertRect:imageView.frame到RegionFromView:canvasView];
MKMapRect-maprect;
对于(int i=0;i<5;i++)
{
maprect=[mapView mapRectForCoordinateRegion:region];
NSLog(@“%f,%f,%f”,region.center.latitude,region.center.longitude,region.span.latitudeDelta,region.span.longitudeDelta);
NSLog(@“%f,%f,%f”,maprect.origin.x,maprect.origin.y,maprect.size.width,maprect.size.height);
region=mkCoordinatereRegionformPrect([mapView MapRectForCoordinaterRegion:region]);
}

14.718256, -40.078125, 63.837150, 70.312500
78118912.000000, 94811514.406252, 52428800.000000, 52428799.999997
17.416993, -40.078125, 63.837150, 70.312500
78118912.000000, 91803983.982924, 52428800.000000, 53344239.567355
20.649080, -40.078125, 63.837150, 70.312500
78118912.000000, 87976363.978412, 52428800.000000, 54699220.734715
24.548345, -40.078125, 63.837150, 70.312500
78118912.000000, 82962597.189840, 52428800.000000, 56765991.576236
29.305644, -40.078125, 63.837150, 70.312500
78118912.000000, 76093086.024249, 52428800.000000, 60073659.997575

如果有人正在寻找使用扩展名的swift等价物

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)
    }
}
可以像这样使用

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

let regionUnion = region1.unionWith(region2)