【问题标题】:How accurate is this geolocation calculation?这种地理位置计算的准确性如何?
【发布时间】:2012-08-01 19:51:15
【问题描述】:

我正在玩 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 之间。This tool 告诉我距离是 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

所以基本上我只是开始接收更新,当我收到第一个更新时,我设置了初始位置。我想知道我是否需要做一个初始getCurrentPosition,然后注册位置回调处理程序。这可能会更好地处理第一次更新有点延迟的情况。

更多信息

所以我实施并尝试了新策略 - 获取起始位置,然后开始监听变化的事件(在第 1 步发生时不移动),我仍然看到很大的差异。我从 A -> B 跑了 134 码,然后从 B -> A 跑了 117 码。我从门口跑到托儿所去接孩子,记录了 2220 码,从我停放的汽车回到我家门口得到了 2268 码。

更重要的是,坐在同一个地方,它记录了位置的变化,向上 20 码!

我一定是在这里做错了.....

【问题讨论】:

    标签: ios geolocation coffeescript titanium trigonometry


    【解决方案1】:

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

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

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

    【讨论】:

    • 它怎么会“漂移”这么多。就像我说的,坐在我的椅子上,最多 25 码?
    • 因为电离层和对流层的不断变化会干扰 GPS 信号。请参阅此链接。 goo.gl/iSC8Z
    • 所以您是说手机无法可靠地获得精确到几码的读数。现在如何使用谷歌地图数据?选择 2 个位置并计算它们之间的距离有多准确?
    • iOS上有一个精度比“Best”更好的,叫做“Best for Navigation”。虽然,我不知道这是否可以在 Titanium 中访问。 Google 使用的 GIS 数据通常非常准确,因为它来自专业土地调查等可靠来源。
    猜你喜欢
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 2015-01-24
    • 2012-03-07
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2021-05-10
    相关资源
    最近更新 更多