Convert MKCoordinateRegion to MKMapRect

前端 未结 10 634
南笙
南笙 2020-12-02 10:52

I have a square MKMapView in my app, and I wish to set a center point and the exact height/width of the view in meters.

Creating an MKCoordinateRegion and setting th

相关标签:
10条回答
  • 2020-12-02 10:55

    Use MKMapPointForCoordinate to convert the 2 point of the region (top/left and bottom/right), then create the MKMapRect using the 2 MKMapPoints

            CLLocationCoordinate2D coordinateOrigin = CLLocationCoordinate2DMake(latitude, longitude);
            CLLocationCoordinate2D coordinateMax = CLLocationCoordinate2DMake(latitude + cellSize, longitude + cellSize);
    
            MKMapPoint upperLeft = MKMapPointForCoordinate(coordinateOrigin);
            MKMapPoint lowerRight = MKMapPointForCoordinate(coordinateMax);
    
            MKMapRect mapRect = MKMapRectMake(upperLeft.x,
                                              upperLeft.y,
                                              lowerRight.x - upperLeft.x,
                                              lowerRight.y - upperLeft.y);
    
    0 讨论(0)
  • 2020-12-02 11:01

    This is a Swift verion to Leo & Barnhart solution

    func MKMapRectForCoordinateRegion(region:MKCoordinateRegion) -> MKMapRect {
        let topLeft = CLLocationCoordinate2D(latitude: region.center.latitude + (region.span.latitudeDelta/2), longitude: region.center.longitude - (region.span.longitudeDelta/2))
        let bottomRight = CLLocationCoordinate2D(latitude: region.center.latitude - (region.span.latitudeDelta/2), longitude: region.center.longitude + (region.span.longitudeDelta/2))
    
        let a = MKMapPointForCoordinate(topLeft)
        let b = MKMapPointForCoordinate(bottomRight)
    
        return MKMapRect(origin: MKMapPoint(x:min(a.x,b.x), y:min(a.y,b.y)), size: MKMapSize(width: abs(a.x-b.x), height: abs(a.y-b.y)))
    }
    
    0 讨论(0)
  • 2020-12-02 11:02

    you can use method to convert MKCoordinateRegion to CGRect

    - (CGRect)convertRegion:(MKCoordinateRegion)region toRectToView:(UIView *)view
    

    and use - (MKMapRect)mapRectForRect:(CGRect)rect

    or use MKMapPointForCoordinate method to first convert coordinates to MKPoint and use that to form MKMapRect to eventually use setVisibleMapRect:animated:

    0 讨论(0)
  • 2020-12-02 11:13

    @David's answer, in Swift 3

    func mapRect(region: MKCoordinateRegion) -> MKMapRect {
      let topLeft = CLLocationCoordinate2D(
        latitude: region.center.latitude + (region.span.latitudeDelta/2.0),
        longitude: region.center.longitude - (region.span.longitudeDelta/2.0)
      )
    
      let bottomRight = CLLocationCoordinate2D(
        latitude: region.center.latitude - (region.span.latitudeDelta/2.0),
        longitude: region.center.longitude + (region.span.longitudeDelta/2.0)
      )
    
      let topLeftMapPoint = MKMapPointForCoordinate(topLeft)
      let bottomRightMapPoint = MKMapPointForCoordinate(bottomRight)
    
      let origin = MKMapPoint(x: topLeftMapPoint.x,
                              y: topLeftMapPoint.y)
      let size = MKMapSize(width: fabs(bottomRightMapPoint.x - topLeftMapPoint.x),
                           height: fabs(bottomRightMapPoint.y - topLeftMapPoint.y))
    
      return MKMapRect(origin: origin, size: size)
    }
    
    0 讨论(0)
  • 2020-12-02 11:16

    Use the built in function MKCoordinateRegionForMapRect

    MKCoordinateRegion region = MKCoordinateRegionForMapRect(rect);
    
    0 讨论(0)
  • 2020-12-02 11:19

    To add another implementation to the pile:

    - (MKMapRect)MKMapRectForCoordinateRegion:(MKCoordinateRegion)region
    {
        MKMapPoint a = MKMapPointForCoordinate(CLLocationCoordinate2DMake(
            region.center.latitude + region.span.latitudeDelta / 2, 
            region.center.longitude - region.span.longitudeDelta / 2));
        MKMapPoint b = MKMapPointForCoordinate(CLLocationCoordinate2DMake(
            region.center.latitude - region.span.latitudeDelta / 2, 
            region.center.longitude + region.span.longitudeDelta / 2));
        return MKMapRectMake(MIN(a.x,b.x), MIN(a.y,b.y), ABS(a.x-b.x), ABS(a.y-b.y));
    }
    

    NB: There are many ways to convert between MKMapRect and MKCoordinateRegion. This one certainly is not the exact inverse of MKCoordinateRegionMakeWithDistance(), but approximates it fairly well. So, be careful converting back and forth, because information can be lost.

    0 讨论(0)
提交回复
热议问题