在给定位置精度的情况下确定 Google 地图的合理缩放级别

2024-04-11

我试图将 Google 地图以用户位置为中心,同时考虑到该位置的准确性,给出合理的缩放级别。有人能描述一下我应该如何计算它吗?涉及哪些变量,如何实现这一目标?


您正在寻找的是根据位置精度计算缩放级别的公式。

我设法想出了这个公式(在我的测试中)效果很好。

这可以简化为(可能看起来并非如此):

这个看起来很可怕的东西就是你想要的。

EquatorLength是 40,075,004 米。虽然Meters/Pixel可以通过将精度圆的直径除以设备屏幕的长度(以像素为单位)来计算。

这是我用来测试这个公式的示例程序:

GoogleMap mMap;

@Override
protected void onStart() {
    super.onStart();

    mMap = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();

    // Enable user's location layer
    mMap.setMyLocationEnabled(true);

    mMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() {
        @Override
        public void onMyLocationChange(Location location) {
            // Location lat-lng
            LatLng loc = new LatLng(location.getLatitude(), location.getLongitude());

            // Location accuracy diameter (in meters)
            float accuracy = location.getAccuracy() * 2;

            // Screen measurements
            DisplayMetrics metrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metrics);
            // Use min(width, height) (to properly fit the screen
            int screenSize = Math.min(metrics.widthPixels, metrics.heightPixels);

            // Equators length
            long equator = 40075004;

            // The meters per pixel required to show the whole area the user might be located in
            double requiredMpp = accuracy/screenSize;

            // Calculate the zoom level
            double zoomLevel = ((Math.log(equator / (256 * requiredMpp))) / Math.log(2)) + 1;

            Log.e(TAG, String.format("Accuracy: %f. Screen Width: %d, Height: %d",
                    accuracy, metrics.widthPixels, metrics.heightPixels));
            Log.e(TAG, String.format("Required M/Px: %f Zoom Level: %f Approx Zoom Level: %d",
                    requiredMpp, zoomLevel, calculateZoomLevel(screenSize, accuracy)));

            // Center to user's position
            mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(loc, (float) zoomLevel));

            // Prevent the camera centering on the user again
            mMap.setOnMyLocationChangeListener(null);
        }
    });

}

private int calculateZoomLevel(int screenWidth, float accuracy) {
    double equatorLength = 40075004; // in meters
    double metersPerPixel = equatorLength / 256;
    int zoomLevel = 1;
    while ((metersPerPixel * (double) screenWidth) > accuracy) {
        metersPerPixel /= 2;
        zoomLevel++;
    }

    return zoomLevel;
}

有几点需要注意:

  • 这个答案是基于this https://stackoverflow.com/a/6452332/3249477并实现它来检查生成的值
  • 精度是用户位置的半径,根据文档它can be正确率高达 68%。

非常欢迎任何指正。

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

在给定位置精度的情况下确定 Google 地图的合理缩放级别 的相关文章

随机推荐

  • 如何使用 homebrew 在 macOS 中安装早期版本的 Python 3?

    如何使用brew 在 macOS 中安装以前版本的Python 3 通过命令brew install python我获得了最新版本的 Python 3 当前为 v3 7 0 但我想要最新版本的 Python 3 6 当前为 3 6 5 我读
  • 如何将边框半径应用于具有水平滚动的分隔表格行?

    我有一个包含大量数据的表 因此必须水平滚动 我设计了将每一行分隔为每张单独卡片的表格 但我无法正确获得表格行左右部分的边框半径 如果我滚动到右端 那么我可以看到右侧的半径和左侧的半径相同 当您位于中间时 您看不到任何边界半径 PS 当存在水
  • 如何间隔重叠注释

    我想用一些文本注释图表中的条形 但如果条形靠得很近并且高度相当 则注释高于 ea 其他 因此难以阅读 注释的坐标取自条形位置和高度 如果发生碰撞 有没有办法移动其中一个 Edit 这些条非常细 有时非常接近 所以仅垂直对齐并不能解决问题 A
  • 类型错误:未定义不是构造函数

    我对 Angular 还很陌生 我仍在尝试解决其中的大部分问题 我正在使用从 Yeoman Generator 生成的 Angular 1 5 8 编写一些测试 具体来说 我试图弄清楚如何操纵 httpBackend 结果 我不确定这是否重
  • matplotlib、pyplot.annotate 的自定义箭头样式

    我正在使用 matplotlib pyplot annotate 在我的绘图上绘制箭头 如下所示 import matplotlib pyplot as plt plt annotate x ybottom x ytop arrowprop
  • 组合:使用特征来避免转发功能?

    假设我们有两个班级 A and B 当使用组合来建模时 has a or 根据 实施 关系 例如B has a A 相对于继承的缺点之一是B不包含公共功能A它需要 为了获得访问A的公共功能 需要提供转发功能 与继承相反 其中B将继承所有A的
  • WTForm“OR”条件验证器? (电子邮件或电话均可)

    class ContactForm Form name StringField Name validators DataRequired Length max 255 email StringField Email validators O
  • C 避免对齐问题

    请解释一下 下面的示例到底有什么问题 特别是 这可能导致从不是四的倍数的地址加载 32 位无符号长整型 的部分 编译器通常会自然地防止对齐问题 对齐所有数据类型 事实上 对齐问题通常不是 内核开发人员主要关心的问题 gcc 人员必须担心 关
  • 解码 Base64urlUInt 编码值

    我通常想做的是验证id token从 OpenID Connect 提供商 例如 Google 获得的值 令牌使用 RSA 算法进行签名 公钥从发现 https openid net specs openid connect discove
  • 如何在 SwiftUI 的 ScrollView 中创建多行文本?

    Since List看起来目前无法配置删除行分隔符 我正在使用ScrollView with a VStack在其中创建文本元素的垂直布局 下面的例子 ScrollView VStack Text Lorem ipsum dolor sit
  • 提高 C++ 正则表达式替换性能

    我是一名初级 C 程序员 正在处理一个小型 C 项目 我必须处理许多相对较大的 XML 文件并从中删除 XML 标签 我已经使用 C 0x 正则表达式库成功地做到了这一点 但是 我遇到了一些性能问题 在我的 PC 上 仅读取文件并对其内容执
  • 不可变会占用内存吗?

    假设我们有一个内存密集型类 例如Image 使用可链接的方法 例如Resize and ConvertTo 如果这个类是不可变的 当我开始做类似的事情时 是否会占用大量内存i Resize 500 800 Rotate 90 Convert
  • 启动时 Tmux [退出] [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 help on topic 如果您认为该问题与主题相关另一个 St
  • 将文件输入作为 img 插入 DOM 中

    两部分问题 基本上 在一天结束时 我想要一个file
  • OSX 上 MongoDB 的 Sane 默认设置?

    我安装了 MongoDB 并进行了如下设置 数据库路径 data db 系统范围的配置文件 usr local mongodb mongod conf launchctl plist Library LaunchDaemons org mo
  • 解析行时将输入记录分隔符更改为 \n 或 \r

    我有一个 perl 脚本 它读取从另一个进程传输的输出 逐行 进行一些处理并输出其结果 bin bash set e set o pipefail RUN SH 2 gt 1 perl M Term ANSIColor wnl e m ER
  • 根据指令中的属性设置 templateUrl

    我正在研究一组角度指令 我想根据属性的存在或值加载正确的模板
  • Rails + Postgres 删除错误:数据库正在被其他用户访问

    我有一个在 Postgres 上运行的 Rails 应用程序 我有两台服务器 一台用于测试 另一台用于生产 我经常需要在测试服务器上克隆生产数据库 我通过 Vlad 运行的命令是 rake RAILS ENV test server db
  • 如何在 WebLogic Server 12c 中将 EclipseLink 2.3.2 替换为 EclipseLink 2.5

    我目前尝试在 WebLogic Server 12c 中运行 Docx4j WebLogic Server 12c 附带 EclipseLink 2 3 2 有一个类似的Post https stackoverflow com questi
  • 在给定位置精度的情况下确定 Google 地图的合理缩放级别

    我试图将 Google 地图以用户位置为中心 同时考虑到该位置的准确性 给出合理的缩放级别 有人能描述一下我应该如何计算它吗 涉及哪些变量 如何实现这一目标 您正在寻找的是根据位置精度计算缩放级别的公式 我设法想出了这个公式 在我的测试中