减少纬度和经度点数的最快方法

2024-02-29

我正在尝试减少并组合一些点到这些位置的中心点。现在,我通过找到最接近的一对,将它们组合起来并重复,直到将其减少到我的目标(旁注:实际上我通过排序来减少问题)(lat*lat+long*long)然后在每个点的两侧搜索 10%,根据我的测试,总是能找到该范围内的最短距离)。

举个例子,我想将 4000 个点减少到 1000 个,理想情况下将最近的点合并到这些最近点的中心。基本上是为了建立反映该区域地址数量的标记点。

有没有更好的算法可以给我尽可能准确的结果?或者更快的距离算法?我想它只需要在短距离内准确


现在我正在寻找距离(维基百科在“投影到平面的球形地球”下有它):

double dLat = pos2.LatitudeR - pos1.LatitudeR;
double dLon = pos2.LongitudeR - pos1.LongitudeR;

double cosLatM = Math.Cos((pos2.LatitudeR + pos1.LatitudeR)/2) * dLon;
double a = dLat*dLat + cosLatM*cosLatM;

我考虑过将彼此距离在 x 内的所有点分组,然后扩展 x 直到达到最终点的目标数量,但我不确定如何使其像我的完美主义所希望的那样准确。这就是我能想到的所有方法,它们会根据输入点列表的顺序而略有不同。


编辑以描述我当前的算法如何处理(这是找到我想要的结果的理想方法,但更快的近似值是值得的):

线性地描述它,如果你有x=1,4,5,6,10,20,22

  1. 它将结合 4+5=4.5 [它找到的第一个 1.0 距离]
  2. (4.5*2+6)/3=5 --x=1,5,10,20,22【1.5距离】
  3. 20+22=21 --x=1,5,10,21[2.0距离]
  4. (5*3+1)/4=4 --x=4,10,21【4.0距离】
  5. (4*4+10)/5.2 -- 所以你最终会得到x=5.2,21。 (它跟踪组合计数,因此可以通过这种方式找到正确的平均中心)

Results:这是我当前的距离函数,带有 cos^2 的查找表生成。没有时间检查我的点有多接近,所以没有实施 Joey 的近似 cos^2 的建议,但这可以提高此处查找表的速度。

我尝试的 K-Cluster 算法(请参阅我对该答案的评论)没有按照我想要的方式将它们组合起来,它最终在地图中心附近有大量的点,而在边缘附近有很少的点。因此,除非我能纠正我正在使用的算法速度较慢的事实。

public static double Distance(AddressCoords pos1, AddressCoords pos2, DistanceType type)
{
    if (LookupTable == null) LookupTable = BuildLookup();

    double R = (type == DistanceType.Miles) ? 3960 : 6371;

    double dLat = pos2.LatitudeR - pos1.LatitudeR;
    double dLon = pos2.LongitudeR - pos1.LongitudeR;

    double LatM = ((pos2.LatitudeR + pos1.LatitudeR)/2);
    if (LatM < 0) LatM = -LatM; //Don't allow any negative radian values
    double cosLatM2 = LookupTable[(int)(LatM * _cacheStepInverse)];
    double a = dLat*dLat + cosLatM2 * dLon*dLon;

    //a = Math.Sqrt(a);

    double d = a * R;

    return d;
}

private const double _cacheStep = 0.00002;
private const double _cacheStepInverse = 50000;

private static double[] LookupTable = null;

public static double[] BuildLookup()
{
    // set up array
    double maxRadian = Math.PI*2;
    int elements = (int)(maxRadian * _cacheStepInverse) + 1;

    double[] _arrayedCos2 = new double[elements];
    int i = 0;
    for (double angleRadians = 0; angleRadians <= maxRadian;
        angleRadians += _cacheStep)
    {
        double cos = Math.Cos(angleRadians);
        _arrayedCos2[i] = cos*cos;
        i++;
    }
    return _arrayedCos2;
}

要加快计算点之间的距离:

如果你做一些基本代数,你会得到:

D = R*Sqrt(Lat2^2 + Lat1^2 - 2*Lat1*Lat2 + cos^2((Lat2 + Lat1) /2)(Lon2^2 + Lon1^2 - 2*Lon1*Lon2))

为了加快速度,您可以做的第一件事就是标准化为地球半径 (R) 并比较平方距离而不是距离,从而避免平方根和 R 项,每次比较可以节省 2 次计算。离开:

valToCompare = Lat2^2 + Lat1^2 - 2*Lat1*Lat2 + cos^2((Lat2 + Lat1) /2)(Lon2^2 + Lon1^2 - 2*Lon1*Lon2)

您可以做的另一件事是预先计算每个坐标的 Lat^2 和 Lon^2 - 将每次比较的计算次数减少 4。

此外,如果这些点在纬度上都相对接近,您可以通过使用随机点的纬度或所有点的平均纬度(而不是两个点的平均纬度)预先计算它来获取 cos^2 项的近似值正在比较的点。这将每次比较的计算次数又减少了 4 个。

最后,您可以预先计算每个点的 2*Lat 和 2*Lon,从而为每次比较节省 2 次计算。

这些都不会改进你的算法本身,但它应该使它运行得更快,并且可以应用于任何需要比较点之间距离的算法。

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

减少纬度和经度点数的最快方法 的相关文章

  • ASP.NET Web 应用程序中的身份验证遇到问题

    我正在尝试对从登录页面登录我的 Web 应用程序的用户进行身份验证 我正在使用本教程 http support microsoft com kb 301240作为指南 它几乎准确地解释了我希望做什么 但是当我输入用户名和密码时 验证不起作用
  • 将字符串作为 PChar 从 CSharp 传递到 Delphi DLL

    我正在尝试将字符串从 C 传递到 Delphi 构建的 DLL Delphi DLL 需要 PChar 这是Delphi导出 procedure DLL Message Location PChar AIntValue integer st
  • 将公历日期转换为儒略日期,然后再转换回来(随着时间)

    我正在编写一个程序 必须将当前的公历日期和时间转换为儒略日期 然后再转换回公历门 最终我需要添加能够添加年 月 日 小时 分钟和秒的功能 但我需要先解决这部分问题 现在我已经从公历日期转换为儒略日期 所以从逻辑上讲 我觉得我应该能够以某种方
  • 局部函数声明有什么用处吗?

    大多数像我这样的 C 程序员都曾犯过以下错误 class C int main C c declares a function c taking no arguments returning a C not as intended by m
  • 无法加载程序集问题

    我收到以下错误 无法加载程序集 错误详细信息 System BadImageFormatException 无法加载文件或程序集 文件 或其依赖项之一 该程序集是由比当前加载的运行时更新的运行时构建的 无法加载 该程序集是使用 Net Fr
  • opencv中如何去除二值图像噪声?

    将图像转换为二值图像 黑白 后如果有任何噪音怎么办 我消除了那些不需要的噪音 您可以看到下图的黑色区域内有一些白噪声 我该如何去除噪声 使用opencv http img857 imageshack us img857 999 blackn
  • 如何减少 MinGW g++ 编译器生成的可执行文件的大小?

    我有一个简单的 Hello world C 程序 在 Win XP 下由 MinGW g 编译器编译为 500kB 可执行文件 有人说这是由于iostream的库和静态链接libstdc dll Using s链接器选项有点帮助 减少了 5
  • 我在使用 ado.net 时收到错误 Argument 2 may not be pass with ref keywords

    int t 0 cmd Parameters AddWithValue Res ref t 我在第二行收到错误 参数 2 不能与 ref 关键字一起传递 您只能通过引用传递参数ref if the 范围 is a ref参数也是如此 Add
  • 我可以将 UseCSharpNullComparisonBehavior 用于单个查询吗?

    我有一个查询 该查询曾经是存储过程 现已转换为 EF 查询 现在已经超时了 使用 SQL Profiler 我可以看到生成的 SQL 的唯一区别是 EF 转变的新行为entity Property value into entity Pro
  • 当需要不同数量和类型的参数时如何创建操作委托列表

    我们有一组大约两打的类 它们继承自具有抽象 Validate 方法的基类 当然 每个类都有不同的验证需求 但它们之间的不同组合需要规则 因此 正如您可以想象的那样 这导致了大量代码重复 例如 A 类需要规则 1 3 6 和 9B 类需要规则
  • 如何在 C# 中更改公共 IP 地址

    我正在创建一个 C winform 应用程序 我想在其中更改公共 IP 地址 而不是像 Hotspot Shield ZenMate OpenVPN 等那样更改 IPv4 地址 我已经检查了以下链接 但没有找到足够的帮助 所以我发布了这个问
  • 传递数组时在 C 中的函数参数中强制指定数组大小

    Context 在 C 中 我有一个以数组作为参数的函数 该参数用作该函数的输出 输出的大小始终相同 我会 让阅读代码的人清楚所需的大小 不过它已经在函数注释中了 理想情况下 编译会输出警告或错误 这样我就可以在编译时而不是运行时防止出现问
  • 在哪里可以找到Python内置序列类型的时间和空间复杂度

    我一直无法找到此信息的来源 无法亲自查看 Python 源代码来确定这些对象是如何工作的 有谁知道我可以在网上找到这个吗 结帐时间复杂度 http wiki python org moin TimeComplexitypy dot org
  • 如何从 Access 数据库中读取“是/否”值作为布尔值?

    帮我找回YES NO来自 MS Access 的布尔格式数据类型 我尝试解析它 但它总是返回 false 更新 实际上不是问题抱歉 它确实接受 YES NO 作为布尔值 OleDbconnection dbConnect new OleDb
  • “1个未解决的外部”C++

    我已经检查了所有文件之间的连接以及类和函数定义 但每次我尝试运行我的程序时 它都会阻止我并告诉我它有 1 个未解析的外部 该程序应该打开多个文件 一个 学生 文件和一个 成绩 文件 从中读取数据 然后使用 查询文件 来查找数据 找到查询中要
  • 使用多态对象数组进行 JSON 反序列化

    我在涉及多态对象数组的 JSON 反序列化方面遇到问题 我已经尝试过记录的序列化解决方案here https stackoverflow com questions 5186973 json serialization of array w
  • Boost.asio和异步链,unique_ptr?

    我对异步编程不太熟悉 我有一个问题 我的问题如下 给出 boost asio 中 C 11 的 echo server 示例 http www boost org doc libs 1 60 0 doc html boost asio ex
  • 从脚本启用/禁用 GameObject 组件 [Unity3D]

    我需要获取一个脚本中设置的布尔值 放入名为 bouclier 的变量 以启用或禁用游戏对象 该变量位于游戏对象 Player 中 此处右下角 我需要启用或禁用这个游戏对象 Bouclier01 为此 我将脚本附加到游戏对象 Bouclier
  • 使用 CodeDOM 将程序集添加到 BuildManager 会导致间歇性错误

    我正在使用 CodeDOM 在运行时创建内存中程序集 如下所示 public Assembly Compile CodeCompileUnit targetUnit string path Path GetDirectoryName new
  • 将一个 IEnumerable 拆分为多个 IEnumerable

    我是 linq 新手 我需要根据指示器将 Couple string text bool Indicator 类型的 IEnumerable 拆分为多个 IEnumerable 我尝试使用skipWhile 和 TakeWhile 但没有找

随机推荐

  • 如何修复 Google-cloud-sdk 156.0.0“您的应用程序中的文件太多,无法监控所有文件的更改。”?

    我刚刚在 osX 上安装了 Go 1 6 4 和 google cloud sdk 1 56 0 0 当我尝试运行本地 dev server 时 我收到以下警告 Users Bryan go src google cloud sdk pla
  • 使用 lxml 解析包含默认命名空间的 xml 以获取元素值

    我有一个像这样的 xml 字符串 str1
  • 是否存在具有低级前置操作的文件系统?

    在最低级别 大多数操作系统文件操作包括打开 关闭 读取 写入 删除以及查找和追加操作 但没有前置操作 出现这个问题是因为我的一位同事正在处理他生成的大型 数千兆字节 数据日志 他意识到他没有将文件头写入日志文件 尽管他只需要在文件的前面添加
  • WPF - 从 StackPanel 中删除“用户控件”子项

    我正在尝试制作一个 WPF UI 用户可以在其中编辑查询来搜索数据库 查询是根据消费者从组合框中选择的内容创建的像这样 https i stack imgur com 5ih0p png他可以创建任意数量的过滤器 只要他点击添加新条件按钮
  • 在 C 中匹配(一些)字符串的最有效方法?

    我们的系统需要接受来自终端的用户输入 并与一些已知的关键字字符串 可能是 10 个 进行匹配 我们没有空间 计算机来执行正则表达式等 代码需要小而快 现在 最糟糕的方法是 str is null terminated assume we k
  • 如何在 Ruby 中访问原始命令行参数字符串?

    我正在尝试访问 Ruby 中的原始命令行参数字符串 即 不使用预分割 分隔的 ARGV 数组 有谁知道如何做到这一点 例如 gt ruby test rb command line arguments 我希望能够判断 line 周围是否有引
  • oauth2Client.getToken 缺少刷新令牌

    我有一个小型快递服务器 有两条路线 然后它将 json 令牌写入文件 我知道非常不安全 由于某种原因没有refresh token 在文档中有一条评论offline for access type gets refresh token 已经
  • 在 Maven 构建期间将文件添加到 jar

    我试图在执行 Maven 构建时将许可证文件添加到我的所有 jar 中 我有每个类文件的许可证 但我希望将 License txt 添加到每个 jar 中的每个 META INF 文件夹 我的项目有一个主 pom 其中有六个模块 然后这些模
  • 发送相机意图后立即调用 onActivityResult

    我正在使用相机意图在我的应用程序中启动相机 但是一旦意图被触发onActivityResult被解雇了 我什至还没有拍照 当我拍照时 选择它并返回到我的活动onActivityResult根本没有被叫到 这是我启动相机的方法 Package
  • 使用 Visual Studio 构建伪语言 (qps-ploc) 附属程序集

    我已经生成了应用程序资源文件的伪本地化版本 例如Order Summary and Payment本地化为 O r d e r S u m m a r y a n d P a y m e n t 以便我们可以在获得实际翻译之前测试本地化错误
  • 如何在Reactjs中点击按钮重定向到另一个页面

    我想使用 React 创建一个基本的 Web 应用程序 我已经实现了创建按钮 我想在单击按钮时重定向到另一个页面 下面是我的 App js 代码 import React from react import logo from logo s
  • 在Python中使用PIL压缩PNG图像

    我有一个用 Selenium Builder 记录的 python 脚本 它使用以下命令获取网页的完整浏览器屏幕截图 fileName Screenshot1 png webDriverInstance save screenshot fi
  • 如何将 WooComerceAPI 集成到 React 中?

    我想通过 API 在 React 上接收数据到我的网站 我按照文档中所述执行了所有操作 执行了安装npm install save woocommerce api 使用文档中的参数创建对象http woocommerce github io
  • 无法验证包:727047181.itmsp

    我在存档文件后在应用程序商店中上传了构建版本 它将在我收到此错误时上传构建版本 1 Apple的Web服务操作不成功 2 无法验证包 727047181 itmsp 3 错误 ITMS 9000 无法更改捆绑包标识符的当前值 ue com
  • 使用 PHP 从 Google Chrome 书签导出中提取数据

    我想将我的 google chrome 书签放入数据库 所以我的第一步是使用 PHP 从 chrome 导出 html 文件并将数据放入变量中 我希望获得一些能够运行的 PHP 代码下面的数据 它会将 URL ADD DATE ICON 和
  • 无法通过管道以自定义方式重命名下载的图像

    我使用 python 的 scrapy 模块创建了一个脚本 从 torrent 站点下载并重命名电影图像 并将它们存储在 scrapy 项目内的文件夹中 当我按原样运行脚本时 我发现它正确地下载了该文件夹中的图像 此时 脚本正在使用 req
  • javascript从所选国家/地区值中选择城市

    我有来自这里的国家数据库http www webmasterworld com html 3018309 htm http www webmasterworld com html 3018309 htm有239个国家 每个国家都有价值 在选
  • 这个指针类型防水吗?

    我正在尝试设计一种自定义类型 可以在需要窗口句柄或其他类型指针的 API 中使用 并且适用于 VBA 可以运行的所有系统 这是我所得到的 If Win64 1 And VBA7 0 Then Public Type LongLong 64
  • Chart.js 上的悬停模式

    当您未将鼠标悬停在折线图中的特定 点 上时 是否可以激活悬停 I want that每当我将鼠标悬停在图表的任何部分上时就会激活特定的工具提示 Edit 像这样的东西http watchstocks herokuapp com http w
  • 减少纬度和经度点数的最快方法

    我正在尝试减少并组合一些点到这些位置的中心点 现在 我通过找到最接近的一对 将它们组合起来并重复 直到将其减少到我的目标 旁注 实际上我通过排序来减少问题 lat lat long long 然后在每个点的两侧搜索 10 根据我的测试 总是