CLLocation distanceFromLocation返回NaN

时间:2016-08-22 11:20:24

标签: ios swift location mapkit nan

我正试图获得两个地点之间的距离。我的代码突然工作,distanceFromLocation开始输出NaN。 我已尝试设置speedcourse以及所有内容,但不会改变任何内容。 模拟器和设备上都是一样的(iOS 9.3.4,Xcode 7.3.1)。

代码

let pLocation = CLLocation(latitude: p.coordinate.latitude, longitude: p.coordinate.longitude)
let centerLocation = CLLocation(latitude: self.mapView.centerCoordinate.latitude, longitude: self.mapView.centerCoordinate.longitude)
let meters = centerLocation.distanceFromLocation(pLocation)
print("\n\(pLocation)\n\(centerLocation)\n\(meters)")

输出

<+51.50889700,-0.13142600> +/- 0.00m (speed -1.00 mps / course -1.00) @ 22/08/2016 13:15:41 heure d’été d’Europe centrale
<+51.50998000,-0.13370000> +/- 0.00m (speed -1.00 mps / course -1.00) @ 22/08/2016 13:15:41 heure d’été d’Europe centrale
nan

修改

git bisect之后,我终于设法追踪了最多3行的错误。我仍然不知道为什么或如何导致错误。

为了给你一些上下文,每次mapView区域发生变化时都会调用此函数。当它发生时,我只在mapView位移超过一定限度(超过300米)时才执行动作。

func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
    if let c = lastCenter {
        // Those 3 next lines are the culprits
        let loc1 = CLLocation(latitude: c.latitude, longitude: c.longitude)
        let loc2 = CLLocation(latitude: self.mapView.centerCoordinate.latitude, longitude: self.mapView.centerCoordinate.longitude)
        if loc1.distanceFromLocation(loc2) > regionRadius {
            // ...
        }
    } // ...
}

EDIT2 - 解决方案/修复

奇怪的是,只需将这个逻辑移到另一个函数就可以了,就像这样:

func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
      delay(1, closure: {
        self.checkShouldReloadForRegionChange()
    })
}

func checkShouldReloadForRegionChange() {
    // Check that user moved enough
    if let c = lastCenter {
        let loc1 = CLLocation(latitude: c.latitude, longitude: c.longitude)
        let loc2 = CLLocation(latitude: self.mapView.centerCoordinate.latitude, longitude: self.mapView.centerCoordinate.longitude)
        if loc2.distanceFromLocation(loc1) < regionRadius {
            return
        }
    }
    // Do stuff ...
}

您会看到checkShouldReloadForRegionChange来电被延迟,因为问题仍然存在。

0 个答案:

没有答案