有什么简单的方法可以使 GPS 坐标变得粗略吗?

2023-12-11

我正在开发一个使用 GPS 坐标作为排行榜的 iPhone 应用程序。我不需要精确的坐标——实际上我不需要曾经想要坐标要准确,以保护用户隐私。

我为desiredAccuracy指定了kCLLocationAccuracyThreeKilometers,但是当GPS处于活动状态时,它似乎也可以在设备拥有它时获取确切的位置。

问题:是否有任何简单的算法可以用来使 GPS 数据更加粗糙?比如说,将其细化到 3 公里。

如果我只是按比例放大数字并删除小数点,然后再次按比例缩小,那么世界上某些地方的数据会比其他地方更粗糙。

Thanks!


虽然马克上面的答案很有用,但它仍然没有产生具有一致结果的公式,因为它依赖于随机数生成器。

我的朋友对此给出了最佳答案:

根据粒度将纬度、经度四舍五入到最接近的有效数字,但这会导致某个位置附近的所有纬度/经度最终出现在同一位置。此方法将使用纬度/经度中两点之间的距离来计算经度的舍入。使用下面相同的公式并将路线设置为0,那么距离就是您的距离粒度。计算所得的新纬度/经度减去两个纬度/经度即可得到纬度的舍入量。然后将航向设置为 90 并重新计算并从旧的纬度/经度中减去新的纬度/经度以获得经度的舍入量。

这是 C++ 代码:

class LocationUtility
{
  public: static Location getLocationNow()
  {
    Location location;

    if(context != null)
    {
      double latitude = 0;
      double longitude = 0;
      ::of_getCurrentLocation(&latitude, &longitude);

      location.setLatitude(latitude);
      location.setLongitude(longitude);

      location = makeLocationCoarse(location);
    }

    return location;
  }

  public: static Location makeLocationCoarse(const Location& location)
  {
      double granularityInMeters = 3 * 1000;
      return makeLocationCoarse(location, granularityInMeters);
  }

  public: static Location makeLocationCoarse(const Location& location,
             double granularityInMeters)
  {
    Location courseLocation;

    if(location.getLatitude() == (double)0 && 
      location.getLongitude() == (double)0)
    {
      // Special marker, don't bother.
    }
    else
    {
      double granularityLat = 0;
      double granularityLon = 0;
      {
        // Calculate granularityLat
        {
          double angleUpInRadians = 0;
          Location newLocationUp = getLocationOffsetBy(location, 
            granularityInMeters, angleUpInRadians);

          granularityLat = location.getLatitude() - 
            newLocationUp.getLatitude();

          if(granularityLat < (double)0)
          {
            granularityLat = -granularityLat;
          }
        }

        // Calculate granularityLon
        {
          double angleRightInRadians = 1.57079633;
          Location newLocationRight = getLocationOffsetBy(location,
            granularityInMeters, angleRightInRadians);

          granularityLon = location.getLongitude() - 
            newLocationRight.getLongitude();

          if(granularityLon < (double)0)
          {
            granularityLon = -granularityLon;
          }
        }
      }

      double courseLatitude = location.getLatitude();
      double courseLongitude = location.getLongitude();
      {
        if(granularityLon == (double)0 || granularityLat == (double)0)
        {
          courseLatitude = 0;
          courseLongitude = 0;
        }
        else
        {
          courseLatitude = (int)(courseLatitude / granularityLat) * 
            granularityLat;

          courseLongitude = (int)(courseLongitude / granularityLon) * 
            granularityLon;
        }
      }
      courseLocation.setLatitude(courseLatitude);
      courseLocation.setLongitude(courseLongitude);
    }

    return courseLocation;
  }

  // http://www.movable-type.co.uk/scripts/latlong.html
  private: static Location getLocationOffsetBy(const Location& location,
    double offsetInMeters, double angleInRadians)
  {
    Location newLocation;

    double lat1 = location.getLatitude();
    double lon1 = location.getLongitude();

    lat1 = deg2rad(lat1);
    lon1 = deg2rad(lon1);

    double distanceKm = offsetInMeters / (double)1000;
    const double earthRadiusKm = 6371;

    double lat2 = asin( sin(lat1)*cos(distanceKm/earthRadiusKm) + 
      cos(lat1)*sin(distanceKm/earthRadiusKm)*cos(angleInRadians) );

    double lon2 = lon1 + 
      atan2(sin(angleInRadians)*sin(distanceKm/earthRadiusKm)*cos(lat1), 
      cos(distanceKm/earthRadiusKm)-sin(lat1)*sin(lat2));

    lat2 = rad2deg(lat2);
    lon2 = rad2deg(lon2);

    newLocation.setLatitude(lat2);
    newLocation.setLongitude(lon2);

    return newLocation;
  }

  private: static double rad2deg(double radians)
  {
    static double ratio = (double)(180.0 / 3.141592653589793238);
    return radians * ratio;
  }

  private: static double deg2rad(double radians)
  {
    static double ratio = (double)(180.0 / 3.141592653589793238);
    return radians / ratio;
  }

  /*
  public: static void testCoarse()
  {
    Location vancouver(49.2445, -123.099146);
    Location vancouver2 = makeLocationCoarse(vancouver);

    Location korea(37.423938, 126.692488);
    Location korea2 = makeLocationCoarse(korea);

    Location hiroshima(34.3937, 132.464);
    Location hiroshima2 = makeLocationCoarse(hiroshima);

    Location zagreb(45.791958, 15.935786);
    Location zagreb2 = makeLocationCoarse(zagreb);

    Location anchorage(61.367778, -149.900208);
    Location anchorage2 = makeLocationCoarse(anchorage);
  }*/
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有什么简单的方法可以使 GPS 坐标变得粗略吗? 的相关文章

随机推荐

  • 在 VBA 中下载文件并存储

    我需要下载从 REST 搜索中获得的文件 网址如下 由于隐私原因 我需要对其进行编辑 该文件应该是 Nastran 计算的结果 可以通过简单的文本编辑器查看 扩展名是 pch 比较大 21mb 如何在 VBA 中实现呢 首先 链接不起作用
  • 按返回类型重载函数?

    为什么更主流的静态类型语言不支持按返回类型重载函数 方法 我想不出有什么可以做到的 它看起来并不比支持参数类型重载有用或合理 怎么人气这么低 与其他人所说的相反 按返回类型重载is可能和is由一些现代语言完成 通常的反对意见是在类似的代码中
  • 自定义日期时间格式

    我需要将日期格式化为 2010 04 21 11 35 22 440 谁能帮我 问题是我看到的是 2009 06 15T13 45 30 0900000 或 2008 03 09 16 05 07Z 但不是我正在寻找的那个 谢谢 strin
  • 删除插件类中定义的操作

    我正在开发一个电子商务主题 我已经安装了WooCommerce PayPal 结账支付网关付款插件 我想更改此结帐按钮的位置 我尝试remove action显示结帐按钮 但它不起作用 在这种情况下如何删除操作 Hook in plugin
  • 需要在c#中进行double类型的枚举

    如何创建 double 类型的枚举 是否可能或者我必须创建某种集合和哈希 你不能把它变成一个枚举 http msdn microsoft com en us library y94acxy2 aspx 可能性之一 public static
  • 为什么 XmlPullParser 传递两个 START_DOCUMENT 事件?

    在 Android 应用程序中我有一个XmlPullParser XmlResourceParser xrp c getResources getXml rid 正如您所看到的 它来自 Android 二进制 XML 资源 并且它提供的前两
  • 检测 NSString 的语言

    有人告诉我关于 Cocoa 中的语言识别类 有人知道它是哪一个吗 This is not在职的 NSSpellChecker spellChecker NSSpellChecker sharedSpellChecker spellCheck
  • 无法在 VC++ 中使用 std::cout 打印出 argv[] 值

    这是我在该网站上的第一个问题 尽管我来这里参考已经有一段时间了 我知道 argv 0 存储程序的名称 其余命令行参数存储在剩余的 argv k 槽中 我还了解 std cout 将字符指针视为空终止字符串并打印该字符串 下面是我的程序 in
  • 如何与主应用程序一起开发另一个子模块。 [作曲家,PHP]

    我知道 git 子模块是如何工作的 以及我们如何使用它 现在我所处的情况是 主应用程序依赖于许多其他作曲家软件包 并且我必须制作和开发一个与主项目 某种库 分开的另一个小软件包 那么我如何才能将这个小包与主项目一起开发 而不使其成为单独的项
  • 反应本机启动画面获取“React/RCTBridgeModule.h”文件未找到

    我使用以下命令启动了一个新的反应本机应用程序 react native init myApplication 我从启动画面开始 所以我使用了这个库反应本机启动画面 我使用以下命令链接该库以生成本机代码 react native link r
  • 如何将标准容器作为字段添加到 OMNet++ 消息中?

    我正在尝试创建一个简单的消息定义包含一个使用实现的字段std vector 根据OMNet 5 5 手册第 1 章6秒 8 1 这看起来很简单 However I m using OMNet 6 0pre6 I can t figure o
  • 单击退出按钮时未处理 Win32Exception - Visual Basic

    我正在使用 Microsoft Visual Studio 2010 32 位高级版 Microsoft Visual Basic 2010 构建表单 当我编译代码时没有任何错误 但是每当我单击退出按钮时 它都会显示以下消息 Win32Ex
  • blackberry os 7 模拟器未在我的系统上加载

    我已经安装了blackberry os 7模拟器 9900 9930 9850 当我打开模拟器时 会显示黑莓加载屏幕 但没有完全加载 长时间显示如下图所示 我删除了位于的 dmp 文件 C Program Files Research In
  • 使用 LINQ 获取平均值

    希望有人可以帮助我使用 LINQ 语法来计算平均值 例如 我有以下 LINQ 查询 var rates from rating in ctx Rates where rating Id Id select new UserId rating
  • C++如何替换构造函数开关?

    我想用更优雅的东西替换大开关 class Base public Base void data int size virtual void Something 0 class A public Base public A void data
  • ASP.NET 到 WCF - 直通安全性?

    我有一个位于 WCF 服务之上的 MVC 网站 WCF 服务还可以通过使用消息安全和证书的用户名 密码身份验证通过 Internet 进行访问 这是设置和工作 网站和服务都使用相同的会员商店 使用会员 API 用户可以使用相同的凭据登录网站
  • 重载加法、减法和乘法运算符

    如何重载加法 减法和乘法运算符 以便我们可以对两个不同或相同大小的向量进行加法 减法和乘法 例如 如果向量大小不同 我们必须能够根据最小向量大小对两个向量进行加 减或乘 我创建了一个函数 允许您修改不同的向量 但现在我正在努力重载运算符 并
  • PhoneGap 构建错误“插件不受支持:...”

    以下 config xml 会导致错误
  • 使用弹性搜索批量索引

    到目前为止 我一直在按文档将数据索引到弹性文档 现在随着数据开始增加 它变得非常慢 并且不是一种优化的方法 所以我正在寻找批量插入的东西并找到了 Elastic Bulk API 从他们官方网站的文档中我感到困惑 我使用的方法是将数据作为
  • 有什么简单的方法可以使 GPS 坐标变得粗略吗?

    我正在开发一个使用 GPS 坐标作为排行榜的 iPhone 应用程序 我不需要精确的坐标 实际上我不需要曾经想要坐标要准确 以保护用户隐私 我为desiredAccuracy指定了kCLLocationAccuracyThreeKilome