iOS如何在每个区域(任何位置和任何缩放)计算尺寸宽度到米

时间:2012-12-20 08:31:19

标签: ios mkmapview

像标题一样,是否有人知道如何在每个区域中计算尺寸宽度到米,意味着在每个地方和任何缩放。

我找到了如何获得zoomScale。

CLLocationDegrees longitudeDelta = myMapView.region.span.longitudeDelta;
CGFloat mapWidthInPixels = myMapView.bounds.size.width;
double zoomScale = longitudeDelta * MERCATOR_RADIUS * M_PI / (180.0 * mapWidthInPixels);

但是我不知道结果是什么意思,如果我想获得尺寸宽度的米或者是20f的线,我将 mapWidthInPixels 更改为20是否正确?

3 个答案:

答案 0 :(得分:6)

您可以在此处找到有关公式的详细说明:transform longitude latitude into meters

示例代码:

CLLocationDegrees deltaLatitude = self.mapView.region.span.latitudeDelta;
CLLocationDegrees deltaLongitude = self.mapView.region.span.longitudeDelta;
CGFloat latitudeCircumference = 40075160 * cos(self.mapView.region.center.latitude * M_PI / 180);
NSLog(@"x: %f; y: %f", deltaLongitude * latitudeCircumference / 360, deltaLatitude * 40008000 / 360);

Mark Ransom

的信用

答案 1 :(得分:5)

这对我很有用。 我的解决方案是在Swift中,但是Obj-C是类似的。

斯威夫特:

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)

Obj-C(赞美以下代码https://stackoverflow.com/a/5813609/3750109的原始撰稿人)

MKMapRect mRect = self.mapView.visibleMapRect;
        MKMapPoint eastMapPoint = MKMapPointMake(MKMapRectGetMinX(mRect), MKMapRectGetMidY(mRect));
        MKMapPoint westMapPoint = MKMapPointMake(MKMapRectGetMaxX(mRect), MKMapRectGetMidY(mRect));

        self.currentDistWideInMeters = MKMetersBetweenMapPoints(eastMapPoint, westMapPoint);

答案 2 :(得分:1)

纵向米的距离将随着纬度的增加而变化。当您离赤道越远时,相同的经度值以米为单位变小。最好的方法可能是在中间左侧和中间右侧创建两个CLLocation,然后使用-distanceFromLocation:来获取它们之间的距离(以米为单位)。