我正在玩 Titanium,并且正在使用这个公式来计算距离
toRad = (x) ->
x * Math.PI / 180
toDeg = (x) ->
x * 180 / Math.PI
startingLat = hsc.models.startingPosition.latitude
startingLon = hsc.models.startingPosition.longitude
currentLat = e.coords.latitude
currentLon = e.coords.longitude
R = 6371
dLat = toRad(currentLat - startingLat)
dLon = toRad(currentLon - startingLon)
a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(toRad(startingLat)) * Math.cos(toRad(currentLat)) *
Math.sin (dLon/2) * Math.sin(dLon/2)
c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a))
d = R * c;
hsc.models.positionUpdateCallback (d * 1093.6133) if hsc.models.positionUpdateCallback
console.log "distance is [#{d}]km"
我正在测试如下。
从 A 点开始。
启用跟踪。
在 B 点结束。
记录值。清除。
启用跟踪。
回到A点。
记录值
在 6 次运行中,我得到了 122 到 135 之间的值。 这个工具告诉我距离是 124.9 码。
这可能是 8 号铁杆和 7 号铁杆之间的区别,所以这很重要!
编辑:我想知道我获得初始位置的方式是否有缺陷。
这是我在用户点击开始时开始跟踪的方式。
hsc.models.startTracking = (onUpdate) ->
return if hsc.models.isTracking
Ti.App.idleTimerDisabled = true;
Ti.Geolocation.setFrequency 100
Titanium.Geolocation.setAccuracy = Titanium.Geolocation.ACCURACY_BEST;
Titanium.Geolocation.setDistanceFilter 0
hsc.models.positionUpdateCallback = onUpdate
hsc.models.isTracking = true;
Ti.Geolocation.addEventListener 'location', hsc.models.locationUpdate
当用户点击结束时,这就是我完成的方式。
if hsc.models.isTracking is true
Ti.App.idleTimerDisabled = false;
hsc.models.isTracking = false
hsc.models.startingPosition = null
Ti.Geolocation.setFrequency 500000
Titanium.Geolocation.setDistanceFilter 10
Ti.Geolocation.removeEventListener 'location', hsc.models.locationUpdate
在locationUpdate
我做
if not hsc.models.startingPosition
hsc.models.startingPosition = e.coords
else
#do the calculation
所以基本上我只是开始接收更新,当我收到第一个更新时,我设置了初始位置。我想知道是否需要做一个 initial getCurrentPosition
,然后注册位置回调处理程序。这可能会更好地处理第一次更新有点延迟的情况。
更多信息
所以我实施并尝试了新策略——获取起始位置,然后开始监听变化的事件(在第 1 步发生时不移动),我仍然看到很大的差异。我从 A -> B 跑了 134 码,然后从 B -> A 跑了 117 码。我把它从我家门口跑到托儿所去接孩子,并登记了 2220 码,从我停放的汽车回到我家门口有 2268 码。
更重要的是,坐在同一个地方,它记录了位置的变化,上升了 20 码!
我一定在这里做错了什么......