2

我正在玩 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 码!

我一定在这里做错了什么......

4

1 回答 1

1

作为一名前工程技术讲师,我可以告诉您,获得准确的 GPS 定位需要比几秒钟更多的时间。在 20 码范围内,对于转弯街道导航来说已经足够准确了,因为该应用程序会捕捉到最近的有效街道位置。

您正在尝试执行所谓的实时运动学 GPS。即使是用于土地测量和农业设备指导的高端(数万美元)gps 单元也需要一个固定的 Master 单元,该单元至少需要 20 分钟才能获得稳定的位置,然后可以用于无线连接中的纠错漫游者单位。在这些条件下,这些单位可以让您在几分之一英寸之内,这是您并不真正需要的。

但是,我可以亲自向您保证,设备在 A 点和 B 点保持静止的时间将是影响您距离准确性的主要因素。

于 2012-08-01T23:14:01.123 回答