在mapview上将跨度值转换为米

问题描述 投票:21回答:6

每当用户放大或缩小地图时,我都需要知道地图上当前表示了多少米(宽度或高度)。

我需要的是MKCoordinateRegionMakeWithDistance的反函数来计算当前地图范围所代表的距离。

我尝试了以下代码但是我得到了错误的结果:

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
    MKMapRect mRect = self.map.visibleMapRect;
    MKMapPoint northMapPoint = MKMapPointMake(MKMapRectGetMidX(mRect), MKMapRectGetMinY(mRect));
    MKMapPoint southMapPoint = MKMapPointMake(MKMapRectGetMidX(mRect), MKMapRectGetMaxY(mRect));

    self.currentDist = MKMetersBetweenMapPoints(northMapPoint, southMapPoint);
}

如果我将地图区域设置为1500米,那么我得到1800这样的结果。

谢谢你的帮助,文森特

iphone mkmapview
6个回答
41
投票

实际上这是一个非常愚蠢的错误,如果我沿着X轴进行相同的操作,那么我得到正确的值:

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
MKMapRect mRect = self.map.visibleMapRect;
MKMapPoint eastMapPoint = MKMapPointMake(MKMapRectGetMinX(mRect), MKMapRectGetMidY(mRect));
MKMapPoint westMapPoint = MKMapPointMake(MKMapRectGetMaxX(mRect), MKMapRectGetMidY(mRect));

self.currentDist = MKMetersBetweenMapPoints(eastMapPoint, westMapPoint);
}

17
投票
- (void)mapView:(MKMapView *)map regionDidChangeAnimated:(BOOL)animated {
  MKCoordinateSpan span = mapView.region.span;
  NSLog(@" 1 = ~111 km -> %f = ~ %f km ",span.latitudeDelta,span.latitudeDelta*111);
}

根据文件http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MapKitDataTypesReference/Reference/reference.html

latitudeDelta

要在地图上显示的南北距离(以度为单位)的数量。与纵向距离不同,纵向距离根据纬度而变化,一个纬度总是大约111公里(69英里)。


4
投票

谢谢你的帖子。我有一个应用程序,需要一英里半径来确定要获取多少位置记录,这样就派上用场了。对于将来可能会遇到这种情况的人来说,这是一个很快的等价物。

let mRect: MKMapRect = self.mapView.visibleMapRect
        let eastMapPoint = MKMapPointMake(MKMapRectGetMinX(mRect), MKMapRectGetMidY(mRect))
        let westMapPoint = MKMapPointMake(MKMapRectGetMaxX(mRect), MKMapRectGetMidY(mRect))
        let currentDistWideInMeters = MKMetersBetweenMapPoints(eastMapPoint, westMapPoint)
        let milesWide = currentDistWideInMeters / 1609.34  // number of meters in a mile
        println(milesWide)

1
投票

这是一种更简单的方法(以米为单位获得宽度和高度)......

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {

    MKMapRect rect = mapView.visibleMapRect;

    double mapWidth = MKMapRectGetWidth(rect) / 10;
    double mapHeight = MKMapRectGetHeight(rect) / 10;

}

1
投票

Swift 4.2

    func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {

        let mapRect = mapView.visibleMapRect
        let westMapPoint = MKMapPoint(x: mapRect.minX, y: mapRect.midY)
        let eastMapPoint = MKMapPoint(x: mapRect.maxX, y: mapRect.midY)
        let visibleDistance = westMapPoint.distance(to: eastMapPoint)
    }

0
投票

斯威夫特4

extension MKMapView {
  func regionInMeter() -> CLLocationDistance {
    let eastMapPoint = MKMapPointMake(MKMapRectGetMinX(visibleMapRect), MKMapRectGetMidY(visibleMapRect))
    let westMapPoint = MKMapPointMake(MKMapRectGetMaxX(visibleMapRect), MKMapRectGetMidY(visibleMapRect))

    return MKMetersBetweenMapPoints(eastMapPoint, westMapPoint)
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.